Pregunta

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 cifradas en MD5 antes de guardarlas. Agregué en mi application-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.

¿Fue útil?

Solución

¿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 codifica " koala " ¿obtienes " a564de63c2d0da68cf47586ee05984d7 " ;?

Otros consejos

Me doy cuenta de que esto es un poco tarde, pero Spring tiene clases integradas 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 unitaria que escribí usando el código Spring Security incorporado, es mucho más pequeño que el código MessageDigest y dado que ya está usando Spring Security, ya debería tener las clases en su classpath.

¿Ha leído 6.3 .3 Hashing y autenticación sección del manual de referencia de Spring Security? Mencionó algunos posibles problemas que puede encontrar al usar el hash de contraseña.

Algunas posibilidades que figuran:

  • El hash de contraseña de la base de datos puede estar en Base64, mientras que el resultado de MD5PasswordEncoder está en cadenas hexadecimales
  • El hash de su contraseña puede estar en mayúsculas, mientras que el resultado del codificador está en minúsculas
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top