2016-03-31 22 views
3

Ich benutze Frühling Sicherheit in unserer Anwendung und möchte Benutzereingaben mit dem Passwort in der Datenbank für die Änderung Passwort-Option zu validieren.Spring Security - BcryptPasswordEncoder

Das Passwort wird im DB wie folgt gespeichert.

Hier wird das vom Benutzer eingegebene Passwort mit der obigen Logik codiert und im DB gespeichert. Jetzt versuche ich nur das Passwort vom Benutzer für das Passwort zu ändern. Nachdem ich das Passwort vom Benutzer erhalten habe, kodiere ich unter Verwendung der obigen Logik und versuche, mit der DB zu vergleichen. Der codierte Wert scheint unterschiedlich zu sein, auch wenn ich dieselbe Logik für die Codierung verwende.

Meine Konfiguration von WebSecurityConfig:

@Autowired 
public void configAuthentication(final AuthenticationManagerBuilder auth) throws Exception { 

    auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 

} 

Ich bin nicht sicher, was mit Vergleich falsch ist.

+0

Wie haben Sie die verschlüsselten Passwörter miteinander vergleichen? Verwenden Sie 'String # equals' oder' PasswordEncoder # passt'? –

Antwort

5

Der codierte Wert scheint anders zu sein, auch ich die gleiche Logik für Codierung verwenden.

Bcrypt-Algorithmus verwendet einen integrierten Salzwert, der jedes Mal anders ist. Also, ja sogar für die gleichen Klartext gleichen Codierungsprozess würde verschiedene Cipher Text s erzeugen.

Nachdem das Passwort vom Benutzer immer ich codieren unter Verwendung der obigen Logik und versuchen, mit dem DB

Sie codieren die Raw Passwort nicht zu vergleichen. Angenommen, rawPassword ist das Kennwort, das der Client Ihnen gegeben hat, und encodedPassword ist das codierte gespeicherte Kennwort in der Datenbank. Dann wird anstelle der rawPassword der Codierung und Vergleichen des Ergebnisses String#equals, verwenden Sie die PasswordEncoder#matches Methode:

PasswordEncoder passwordEnocder = new BCryptPasswordEncoder(); 
if (passwordEncoder.matches(rawPassword, encodedPassword)) { 
    System.out.println("Matched!"); 
}