Estoy usando Hibernate/Java para persistir una entidad en una base de datos. La entidad tiene un campo de contraseña que es un Cadena. Al registrar un usuario en mi aplicación, calculo la contraseña usando SHA-1 (reconozco que esto es un poco débil). Esto produce un byte [] que luego convierto a cadena usando new String(byte[] arr);
Siempre que quiero registrar un usuario en, simplemente recuperar el hash de la contraseña de la base de datos (como cadena) y compararlo con el digesto de la contraseña de entrada al iniciar la sesión utilizando hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
¿Cómo mapear una propiedad de byte [] con Hibernate?
Esto funcionó perfectamente en mi sistema de desarrollo (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26) pero al desplegarlo en nuestro servidor (ejecutando JDK 1.6 en Linux), el es igual a método nev er evalúa VERDADERO incluso para contraseñas iguales. Rápidamente configuré un nuevo sistema de desarrollo (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22) y no funciona allí también.
Conozco los posibles problemas de codificación indicados en la documentación de la API de Java para la clase String y también figuran en varios lugares aquí en SO. Probé un par de codificaciones sugeridas en este foro (por ejemplo, Base64, Latin-1) y terminé con UnsupportedEncodingException. Creo que será mejor que evite la conversión String. Entonces, ¿cómo puedo diseñar mi base de datos de modo que la clase de entidad generada por Hibernate aparezca con byte [] para el campo de contraseña campo en lugar de Cadena?
+1, muy buena pregunta. Como un aparte que no es una respuesta a su pregunta, he tenido mucha suerte al utilizar algunas de las utilidades de Commons Base64 que entran y salen de la base de datos. –
¿Por qué almacenaría una cadena que representa un número en lugar de almacenar el número en sí? – m0skit0
No use una ronda de hash para proteger las contraseñas. Use algo como PBKDF2 o bcrypt con 10s de miles de rondas --- incluso 100k no es irrazonable. Almacenar un 'byte []' de longitud fija directamente debería ser más fácil para más base de datos, pero siempre puedes crear un 'BigInteger' desde una matriz de bytes y almacenar eso como un tipo numérico. – erickson