passwords - not - passwordencoder spring
Spring Security Encrypt MD5 (3)
¿Cómo estás creando tus hashes MD5? Algo como lo siguiente funciona bien en Java:
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length());
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16);
if (hashedPass.length() < 32) {
hashedPass = "0" + hashedPass;
}
Cuando codificas "koala", ¿obtienes "a564de63c2d0da68cf47586ee05984d7"?
Tengo una aplicación web java que usa Spring Framework y Spring Security para su inicio de sesión. En mi base de datos tengo mis contraseñas encriptadas a MD5 antes de ser guardadas. Agregué en mi aplicación-config.xml estos códigos
<security:authentication-provider>
<security:password-encoder hash="md5"/>
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?"
authorities-by-username-query="select username, authority from authorities where username=?" />
</security:authentication-provider>
Al principio funcionó cuando la contraseña en la base de datos no estaba encriptada. Pero cuando lo cifré y agregué este fragmento en la configuración de mi aplicación
<security:password-encoder hash="md5"/>
No puedo iniciar sesión.
¿Ha leído la sección 6.3.3 Hashing and Authentication del manual de referencia de Spring Security? Mencionó algunos problemas posibles que podría encontrar al usar el hashing de contraseñas.
Algunas posibilidades enumeradas:
- El hash de la contraseña de la base de datos podría estar en Base64, mientras que el resultado de MD5PasswordEncoder está en cadenas hexadecimales
- Su hash de contraseña podría estar en mayúsculas, mientras que el resultado del codificador está en cadenas en minúsculas
Me doy cuenta de que esto es un poco tarde, pero Spring tiene clases incorporadas que lo hacen mucho más fácil.
@Test
public void testSpringEncoder() {
PasswordEncoder encoder = new Md5PasswordEncoder();
String hashedPass = encoder.encodePassword("koala", null);
assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass);
}
Esta es una prueba de unidad que escribí utilizando el código de Spring Security incorporado, es mucho más pequeño que el código MessageDigest y, como ya está usando Spring Security, ya debería tener las clases en su classpath.