春のセキュリティ:暗号化されたパスワードは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]