2014-11-07 12 views
11

Ich verwende Federsicherheit mit BCryptPasswordEncoder. Jetzt für das Ändern des Passworts, was ich tun muss, ist, das Vorhandene Passwort zu vergleichen, das vom Benutzer mit dem DB-Wert zur Verfügung gestellt wird.Erhalte den gleichen Hash-Wert bei der Verwendung von BCryptPasswordEncoder

Aber da Salz wird dynamisch generiert von BCryptPasswordEncoder, jedes Mal, wenn ich unterschiedliche Hashwert von unten Methode und nicht unbedingt würde es mit meinem DB-Wert übereinstimmen.

public static String encodePassword(String password) { 
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
    String hashedPassword = passwordEncoder.encode(password); 
    return hashedPassword; 
} 

Was ist die Abhilfe für dieses Problem? Kann ich das für mein DB-Feld verwendete Salz identifizieren und dasselbe Salz in der obigen Methode verwenden?

Antwort

22

die matches Methode auf dem PasswordEncoder Schnittstelle verwenden das Passwort gültig ist, sondern zu prüfen, ob als kodieren es wieder und vergleicht mit dem vorhandenen Hash.

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String existingPassword = ... // Password entered by user 
String dbPassword  = ... // Load hashed DB password 

if (passwordEncoder.matches(existingPassword, dbPassword)) { 
    // Encode new password and store it 
} else { 
    // Report error 
} 
+0

Danke, versuchte dies und arbeitete wie ein Charme. – mms

1

Wenn Sie BCryptPasswordEncoder mit Ihren eigenen Eigenschaften (Stärke/Zufall) zusammen mit Spring MVC verwenden, können Sie Ihren PasswordEncoder als Bean deklarieren. Auf diese Weise wird es eine Singleton-Instanz und Sie können sie wiederverwenden.

Hier kommt ein Beispiel (ich weiß nicht, welche Konfiguration Stil Sie verwenden):

in der Sicherheitskonfiguration:

@Bean 
public PasswordEncoder passwordEncoder() { 

    int strength = // your strength; 
    SecureRandom random = // your random 

    PasswordEncoder encoder = new BCryptPasswordEncoder(strength, random); 
    return encoder; 
} 

in Ihrem Controller jedoch, Sie Passwörter wie diese vergleichen können :

@Autowired 
private PasswordEncoder passwordEncoder; 

public boolean checkPassword(String password, String 
    return passwordEncoder.matches(password, hashedPassword);; 
} 
+0

Dies ist nicht richtig. Der Sinn des Salzens besteht darin, dass jedes Mal, wenn Sie ein Passwort verschlüsseln, ein anderes zufälliges Salz verwendet wird. Es spielt keine Rolle, wie viele Instanzen der Java-Klasse es gibt. –

+0

Ja, Sie haben Recht. Ich habe das missverstanden. Die Verwendung eines Singleton PasswordEncoder empfiehlt sich jedoch, wenn Sie benutzerdefinierte Eigenschaften angeben. – Jonas

+0

Ich korrigierte meine Antwort, um Ihren Vorschlag zu reflektieren. – Jonas

Verwandte Themen