2009-11-30 5 views
15

Ho un'applicazione web Java che utilizza il framework spring e la sicurezza spring per il suo login. Nel mio database ho le mie password crittografate su MD5 prima di essere salvate. Ho aggiunto nella mia domanda-config.xml questo i codiciSpring 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> 

All'inizio Ha funzionato quando la password nel db non erano cifrati. Ma quando ho crittografato e aggiunto questo frammento nella mia configurazione dell'applicazione

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

Non riesco ad accedere.

+7

md5 è una funzione hash, non un metodo di crittografia. – u0b34a0f6ae

+1

cosa intendi? Cosa avrei dovuto fare – cedric

risposta

6

Come si creano gli hash MD5? Qualcosa come il seguente funziona bene in 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; 
} 

Quando si codifica "koala" si ottiene "a564de63c2d0da68cf47586ee05984d7"?

+0

ah ok .. ho perso il 16 in messageDigest.digest()). ToString (16). grazie – cedric

+0

, in realtà, ci possono essere meno di 31 simboli. così. questo non funzionerà in alcune situazioni (molto raro). devi aggiungere "0" se non hai 32 simboli –

4

Hai letto la sezione 6.3.3 Hashing and Authentication dal manuale di riferimento di Spring Security? Ha menzionato alcuni possibili problemi che potresti incontrare nell'utilizzare l'hashing della password.

Alcune possibilità che essa elencati:

  • database hash della password potrebbe essere in Base64, mentre il risultato da MD5PasswordEncoder è in stringhe esadecimali
  • tua password hash potrebbe essere in maiuscolo, mentre il risultato della l'encoder è in minuscole stringhe
47

Mi rendo conto che è un po 'tardi, ma Spring ha classi integrate che lo rendono molto più facile.

@Test 
public void testSpringEncoder() { 
    PasswordEncoder encoder = new Md5PasswordEncoder(); 
    String hashedPass = encoder.encodePassword("koala", null); 

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

Questa è una prova di unità che ho scritto con il costruito nel codice di Primavera di sicurezza, è molto più piccolo rispetto al codice MessageDigest e dal momento che si sta utilizzando già Primavera di sicurezza, si dovrebbe avere le classi nel classpath già .

+2

Questa è la migliore risposta. Pulito e facile con la primavera. –

+1

Ecco [un'altra risposta] (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) con un po 'più dettagli su come usarlo ordinatamente nella tua applicazione Spring . – chrisjleu