春のセキュリティ:暗号化されたパスワードはBCryptのようには見えません

Spring Securityでは、 bcrypt passwordハッシュによるデータベース認証。

  import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  import org.springframework.security.crypto.password.PasswordEncoder;
 //...
    String password = "123456";
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String hashedPassword = passwordEncoder.encode(password);

spring-security.xml

  <authentication-manager>
    <authentication-provider>
        <password-encoder hash="bcrypt"/>
       //...
    </authentication-provider>
  </authentication-manager>
CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(45) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

デバッグ出力を見直してください。正しいパスワードが提供されていても、「 Encoded password does not like BCrypt 」と常に言われています。

…​.//…​ 12:56:31.868 DEBUG o.s.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 12:56:31.868 WARN o.s.s.c.bcrypt.BCryptPasswordEncoder - Encoded password does not look like BCrypt 12:56:31.868 DEBUG o.s.s.a.d.DaoAuthenticationProvider - Authentication failed: password does not match stored value

=== 解決策

__bcrypt__ハッシュアルゴリズムでは、毎回、長さ60の異なるハッシュ値が生成されます

$2a$10$LOqePml/koRGsk2YAIOFI.1YNKZg7EsQ5BAIuYP1nWOyYRl21dlne

よくある間違いは、 "password"カラム(usersテーブル)の長さが `password VARCHAR(45)`のように60未満で、一部のデータベースは自動的にデータを切り捨てます。したがって、「エンコードされたパスワードはBCryptのようには見えません」という警告が常に表示されます。

** それを解決するには、 "password"カラムの長さが60以上であることを確認してください。

リンク://タグ/bcryt/[bcryt]リンク://タグ/ハッシュ/[ハッシング]link://tag/spring-security/[spring security]