我正在开发一个使用Spring Security对用户进行身份验证的项目。另一方面,我想使用BCryptPasswordEncoder检查用户是否存储。我使用下面的代码通过BCryptPasswordEncoder从TEST1234生成散列。在每个for循环中,BCryptPasswordEncoder生成不同的散列。让我们假设我先将它们哈希并存储在数据库中。
public static void main(String[] args) {
int i = 0;
while (i < 10) {
String password = "TEST1234";
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);
System.out.println(hashedPassword);
i++;
}
}
在此之后,我正在运行项目,调用安全页面,输入用户名和密码并访问受保护的页面。
现在,我正在停止项目并从上面获取第二个哈希循环。我正在运行项目,调用安全页面,输入用户名和密码,然后再次&#34;再次&#34;访问安全页面。
我不明白它是如何工作的。
当服务器运行时,为什么如果我更改数据库登录中的哈希不工作以及服务器停止并且数据库和服务器中的哈希值已更改,为什么登录使用真正的用户名&amp; passoword?
我的Spring Security身份验证器代码如下:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery("select memberUserName,password,enabled from Member where memberUserName=?")
.authoritiesByUsernameQuery("select memberUserName,role from userroles where memberUserName=?")
.passwordEncoder(new BCryptPasswordEncoder());
}
答案 0 :(得分:0)
BCryptPasswordEncoder
自动生成并使用随机盐来计算哈希值,这就是为什么每次调用它时都会得到不同的输出。
如果在循环中生成10个哈希值,则所有哈希值都不同且有效。
看到这个问题&amp;回答进一步的解释:How can bcrypt have built-in salts?