encriptar con JSP

Estrella
17 de Marzo del 2010
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

adolfuz
17 de Marzo del 2010
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

Saludos

lunaticaMaria
17 de Marzo del 2010
Hola !!!

ME Podrias colaborar por fa... necesito realizar ua encriptacion en 3DES pero no lo tengo muy claro...

POR FA !!!

David
17 de Marzo del 2010
Hola

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:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
import sun.misc.CharacterEncoder;

public final class SHA1BASE64 {
public static String encriptar(String textoplano) throws IllegalStateException {
MessageDigest md = null;

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
String hash = (new BASE64Encoder()).encode(raw); // Traducción a BASE64
return hash;
}
}


Salud

David

develoPERU
17 de Marzo del 2010
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

alopez
17 de Marzo del 2010
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.


package com.kriter.utils;

import sun.misc.BASE64Encoder;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
* 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
{

public static String encriptarBase64( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;

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 ( new BASE64Encoder() ).encode( raw ); // Traducción a BASE64
}

public static String encriptarHexadecimal( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;

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;
}
}

Manotas
17 de Marzo del 2010
GRACIAS, ME AYUDO MUCHO, BARRRBARO