2009-11-30 30 views
15

Ich habe eine Java-Web-Anwendung mit Spring-Framework und Feder Sicherheit für seine Anmeldung. In meiner Datenbank habe ich meine Passwörter vor dem Speichern zu MD5 verschlüsselt. Ich habe in meiner Anwendung-config.xml Sie diesen CodesSpring Security Verschlüsseln 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> 

Zuerst Es funktionierte, wenn das Passwort in der DB nicht verschlüsselt wurde. Aber wenn ich es verschlüsselt und dieses Snippet in meiner Anwendungskonfiguration

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

hinzugefügt habe, kann ich mich nicht anmelden.

+7

md5 ist eine Hash-Funktion, keine Verschlüsselungsmethode. – u0b34a0f6ae

+1

was meinst du? Was hätte ich tun sollen – cedric

Antwort

6

Wie erstellen Sie Ihre MD5-Hashes? So etwas wie die folgenden Arbeiten gut 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; 
} 

Wenn Sie kodieren "Koala" erhalten Sie "a564de63c2d0da68cf47586ee05984d7"?

+0

ah ok .. ich vermisste die 16 in messageDigest.digest()). ToString (16). danke – cedric

+0

tatsächlich kann es weniger als 31 Symbole geben. damit. das wird in manchen Situationen nicht funktionieren (sehr selten). Sie müssen "0" hinzufügen, solange Sie keine 32 Symbole haben –

4

Haben Sie gelesen 6.3.3 Hashing and Authentication Abschnitt von Spring Security Referenzhandbuch? Es wurden einige mögliche Probleme erwähnt, die bei der Verwendung von Kennwort-Hashing auftreten können.

Einige Möglichkeiten aufgelistet:

  • Datenbank Passwort-Hash könnte in Base64 sein, während das Ergebnis aus MD5PasswordEncoder in hexadezimale Zeichenketten ist
  • Ihr Passwort-Hash kann in Großbuchstaben sein, während das Ergebnis aus der Encoder ist in Kleinbuchstaben Zeichenketten
47

Ich weiß, das ist ein bisschen spät, aber Spring hat eingebaute Klassen, die das viel einfacher machen.

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

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

Dies ist ein Unit-Test ist, dass ich das in Spring Security Code gebaut schrieb, ist es viel kleiner ist als der Messagecode und da Sie bereits Spring Security verwenden, sollten Sie die Klassen in Ihrem Classpath haben bereits .

+2

Dies ist die beste Antwort. Sauber und einfach mit Feder. –

+1

Hier ist [eine andere Antwort] (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) mit ein bisschen mehr Details, wie Sie es ordentlich in Ihrer Spring-Anwendung verwenden . – chrisjleu