web-dev-qa-db-ja.com

BCryptPasswordEncoderの使用中に同じハッシュ値を取得する

BCryptPasswordEncoderを使用してSpring Securityを使用しています。次に、パスワードを変更するために必要なのは、ユーザーから提供された既存のパスワードとDB値を比較することです。

しかし、saltはBCryptPasswordEncoderによって動的に生成されるため、以下のメソッドから異なるハッシュ値を取得するたびに、必ずしもDB値と一致するとは限りません。

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

この問題の解決策は何ですか? DBフィールドに使用されているソルトを特定し、上記の方法で同じソルトを使用できますか?

18
mms

matchesインターフェイスでPasswordEncoderメソッドを使用して、パスワードを再度エンコードして既存のハッシュと比較するのではなく、パスワードが有効かどうかを確認します。

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 
}
45
Shaun the Sheep

Spring MVCとともに独自のプロパティ(強度/ランダム)でBCryptPasswordEncoderを使用している場合は、PasswordEncoderをBeanとして宣言できます。そうすれば、それはシングルトンインスタンスになり、再利用できます。

以下に例を示します(使用している構成スタイルはわかりません)。

セキュリティ構成で:

@Bean
public PasswordEncoder passwordEncoder() {

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

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

ただし、コントローラーでは、次のようにパスワードを比較できます。

@Autowired
private PasswordEncoder passwordEncoder;

public boolean checkPassword(String password, String 
    return passwordEncoder.matches(password, hashedPassword);;
} 
2
Jonas