2009-11-30 30 views
15

Tengo una aplicación web java que utiliza el marco de primavera y la seguridad de primavera para su inicio de sesión. En mi base de datos tengo mis contraseñas encriptadas a MD5 antes de guardarlas. Añadí en mi solicitud-config.xml este los códigosSpring Security Encrypt MD5

<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 el PP no estaban encriptados. Pero cuando lo cifré y agregué este fragmento en mi configuración de la aplicación

 <security:password-encoder hash="md5"/> 

No puedo iniciar sesión.

+7

md5 es una función hash, no un método de encriptación. – u0b34a0f6ae

+1

¿Qué quieres decir? ¿Qué debería haber hecho – cedric

Respuesta

6

¿Cómo está creando sus hashes MD5? Algo así como los siguientes 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; 
} 

Al codificar "koala" se puede conseguir "a564de63c2d0da68cf47586ee05984d7"?

+0

ah bien ... me perdí el 16 en messageDigest.digest()). ToString (16). gracias – cedric

+0

en realidad, puede haber menos de 31 símbolos. asi que. esto no funcionará en algunas situaciones (muy raro). tiene que agregar "0" siempre que no tenga 32 símbolos –

4

¿Has leído 6.3.3 Hashing and Authentication sección del manual de referencia de Spring Security? Mencionó algunos problemas posibles que puede encontrar al usar el hash de contraseñas.

Algunas posibilidades se enumeran a continuación:

  • base de datos hash de la contraseña podría ser en base 64, mientras que el resultado de MD5PasswordEncoder está en cadenas hexadecimales
  • Su hash de la contraseña podría estar en mayúsculas, mientras que el resultado de la el codificador se encuentra en minúsculas
47

Me doy cuenta de que esto es un poco tarde, pero Spring tiene clases integradas que hacen que esto sea 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 construido en el Código de seguridad de Primavera, que es mucho más pequeño que el código MessageDigest y dado que está utilizando la primavera de Seguridad ya, usted debe tener las clases en su ruta de clase ya .

+2

Esta es la mejor respuesta. Limpio y fácil con la primavera. –

+1

Aquí hay [otra respuesta] (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) con un poco más de detalles sobre cómo usarlo prolijamente en su aplicación Spring . – chrisjleu

Cuestiones relacionadas