Completando la entrada anterior, he realizado la implementación en Java. Básicamente ‘todo es lo mismo… pero no es igual‘ :-). Cambia la manera de obtener el número aleatorio y la forma de obtener el sha-1.
La estructura es la de un proyecto Maven web con su pom.xml para que sea sencillo compilarlo y generar el war. Paso a explicarlo.
El código puedes verlo en este enlace:
https://github.com/logicaalternativa/ejemplosJava/tree/master/loginsha1
Para no complicarlo y no desviar la atención, no he utilizado controladores o servlets, la lógica está en dos jsp. Los archivos index.jsp y resultado.jsp son similares a index.php y resultado.php, simplemente me he limitado a transcribir el código a Java.
La clase UtilCripto
El “meollo” de todo está en la clase UtilCripto. Incluye todos los métodos para obtener la cadena aleatoria y el sha-1
Método obtenerNumeroAleatorio
Se utiliza en index.jsp. En este método se utiliza la clase SecureRandom del paquete java.security que permite obtener números ‘más’ aleatorios que la clase de la que es hija Random.
1 public static int obtenerNumeroAleatorio(int desde, int hasta) throws Exception {2 ...3 SecureRandom random = SecureRandom.getInstance("SHA1PRNG");4 int valor = random.nextInt( ( hasta + 1 ) - desde);5 return desde + valor;6 }
Codigo 01
El método nextInt devuelve un entero aleatorio entre el 0 (inclusive) y el que se pasa por argumento (exclusive). Para que la función pueda devolver también el valor ‘hasta‘ se le suma 1 (línea 4).
Método obtenerSHA1
Se utiliza en resultado.jsp. Obtiene el hash SHA-1 de la cadena a través de la clase MessageDigest del paquete java.security. Es necesario obtener su representación hexadecimal porque la función sha-1 de PHP.js devuelve el valor en este formato.
01 public static String obtenerSHA1( String cadena ) {02 ...03 try {04 MessageDigest miMessageDigest = MessageDigest.getInstance("SHA-1");05 miMessageDigest.reset();06 byte[] bytes = cadena.getBytes();07 miMessageDigest.update( bytes );08 return pasarHexadecimal( miMessageDigest.digest() );09 } catch (Exception e ) {10 ...11 }
12 }
Código 02
Ese paso en java no es tan trivial por lo que he tenido que codificar el método pasarHexadecimal
1 private static String pasarHexadecimal( byte[] bytes ) {2 StringBuffer sb = new StringBuffer();3 for (int i = 0; i < bytes.length; i++) {4 sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));5 }
6 return sb.toString();7 }
Codigo 03
Espero que os sirva.
Entrada relacionada: Securización de formulario de acceso con SHA-1