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

Spring Security:エンコードされたパスワードはBCryptのように見えません

Spring Securityで、bcryptパスワードハッシュを使用したデータベース認証。

  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

  
    
        
        //...
    
  
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 look 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テーブル)の長さが60未満(たとえば、password VARCHAR(45))であり、一部のデータベースはデータを自動的に切り捨てます。 そのため、「エンコードされたパスワードはBCryptのように見えません」という警告が常に表示されます。

To solve it、「パスワード」列の長さが60以上であることを確認してください。