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フィールドに使用されているソルトを特定し、上記の方法で同じソルトを使用できますか?
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
}
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);;
}