在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
<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));
查看调试输出,通常会说“ 编码密码看起来不像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”列(用户表)的长度小于60,例如password VARCHAR(45)
,并且某些数据库会自动截断数据。 因此,您始终会收到警告“编码的密码看起来不像BCrypt”。
要解决此问题 ,请确保“密码”列的长度至少为60。
翻译自: https://mkyong.com/spring-security/spring-security-encoded-password-does-not-look-like-bcrypt/