Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.
encriptar con JSP
Enviado por Estrella el día 30 de marzo de 2005
Tengo hecho un master detail en Jdeveloper donde se dan de alta a los usuarios que utilizaran un sistema x, el problema es que cuando doy de alta a un usuario quiero encriptar su password cuando se guarde en la BD nadie pueda verlo, ¿como lo hago?, ¿tengo que crear un JSP?, me urge porfavor, GRACIAS
No hace falta encriptar las contraseñas. Simplemente, genera un hash MD5 o SHA1 (mejor SHA1, que es más seguro).
Estas funciones hash tienen la particularidad de que son de una sola vía: a partir de un texto puedes obtener el código hash, pero no a la inversa (no es posible obtener el texto a partir del código hash).
Además, es virutalmente imposible conseguir dos textos que generen el mismo código hash.
Otra peculiaridad de este sistema es que los códigos hash generados no son texto plano, sino un conjunto arbitrario de bits, eso sí, de longitud fija.
Para guardarlos en una base de datos, en un campo de tipo texto, conviene darles a estos código un pequeño tratamiento, que consiste en transformarlos a BASE64 (que sí son caracteres ASCII).
El sistema sería el siguiente:
- En la base de datos guardas no las contraseñas, sino sus códigos MD5 o SHA1 traducidos a BASE64.
- Cuando quieres comprobar un par nombre de usuario - contraseña, obtienes el código MD5 o SHA1 de la contraseña, lo pasas a BASE64 y lo comparas con el que tienes almacenado para ese nombre de usuario.
- Si coincide, hasta la cocina: la contraseña es correcta.
- Si no coincide, aire.
Te paso el código fuente de una clase que genera el código hash SHA1 y lo convierte a BASE64:
Gracias por el codigo que dejaste, yo tenia otro, pero el problema que me daba era un error algo de Jasper, busque todo tipo de codigos, intente con el tuyo y da bien. Gracias
Enviado por Luciano el día 6 de septiembre de 2005
Tengo que agradecerte por haber puesto un codigo tan bueno a disposicion de todos la verdad es que con este tipo de cosas se ahorra mucho tiempo en proyectos grandes. te felicito sos un ejemplo para el resto de los programadores... sigan asi...
David, tengo un login, puedo usar ese codigo para validarlo con mi BD (en la BD los campos de contraseña son textos planos.) por favor respondeme, saludos
Gracias David, tu respuesta es de hace un año, pero me ha venido cojonudo ahora. Gracias a personas como tú, que facilitan código, los programadores nos nutrimos y nos facilitamos las cosas no sabes cuanto. He reaprobexao tu código y le he añadio la salida hexadecimal por si alguien lo necesita. Mercy tio.
/**
* Created by IntelliJ IDEA.
* User: alopez
* Date: 04-jul-2006
* Time: 11:06:38
* To change this template use File | Settings | File Templates.
*/
public final class SHA1
{
try
{
md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
}
catch( NoSuchAlgorithmException e )
{
throw new IllegalStateException( e.getMessage() );
}
try
{
md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
}
catch( UnsupportedEncodingException e )
{
throw new IllegalStateException( e.getMessage() );
}
byte raw[] = md.digest(); // Obtención del resumen de mensaje
return toHexadecimal( raw ); // Traducción a HEXADECIMAL
}
//metodo que devuelve el valor hexadecimal (String) de una array de byte.
private static String toHexadecimal( byte[] datos )
{
String resultado = \"\";
ByteArrayInputStream input = new ByteArrayInputStream( datos );
String cadAux;
int leido = input.read();
while( leido != -1 )
{
cadAux = Integer.toHexString( leido );
if ( cadAux.length() < 2 ) //Hay que añadir un 0
resultado += \"0\";
resultado += cadAux;
leido = input.read();
}
return resultado;
}
}
puedes tambien hacerlo en otros algoritmos mas seguros como lo son 3DES o AES, este ultimo es el mas seguro segun lo que he podido leer, yo tengo uno en 3DES, que lo encripta pero es mas seguro porque, te lo encripta 3 veces, y es mucho mas seguro, primero te lo encripta con el valor de tu aplicacion este valor es fijo y es el q le vas a dar para todos tus passwords, generandote 1 primer encriptamiento, luego lo encripta a bytes, siendo el segundo encriptamiento, y luego lo encriptas en base64 generandote el 3er encriptamiento, y tambien si quieres ver cual es la clave del modo inverso nomas, no es muy complicado pero si es mas seguro