我在我的应用程序中有一个用例,应该防止用户在重置密码时选择他们最后3个密码中的一个。我在前端使用Angular,在后端使用Sping Boot 。在我的场景中,用户密码存储为bcrypt哈希。
如何将用户输入的密码与最近存储的3个bcrypt密码进行比较?
当我运行下面的代码片段示例时,
BCryptPasswordEncoder b = new BCryptPasswordEncoder();
for(int i =0;i<10;i++) {
System.out.println(b.encode("passw0rd"));
}
它生成以下bcrypt哈希值。每个哈希值都不同,这是合理的,因为当我检查org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
时,我可以看到生成的salt是随机值。
$2a$10$tztZsPFZ.T.82Gl/VIuMt.RDjayTwuMLAkRkO9SB.rd92vHWKZmRm
$2a$10$yTHyWDmcCBq3OSPOxjj4TuW9qXYE31CU.fFlWxppii9AizL0lKMzO
$2a$10$Z6aVwg.FNq/2I4zmDjDOceT9ha0Ur/UKsCfdADLvNHiZpR7Sz53fC
$2a$10$yKDVeOUvfTQuTnCHGJp.LeURFcXK6JcHB6lrSgoX1pRjxXDoc8up.
$2a$10$ZuAL06GS7shHz.U/ywb2iuhv2Spubl7Xo4NZ7QOYw3cHWK7/7ZKcC
$2a$10$4T37YehBTmPWuN9j.ga2XeF9GHy6EWDhQS5Uc9bHvJTK8.xIm1coS
$2a$10$o/zxjGkArT7YdDkrk5Qer.oJbZAYpJW39iWAWFqbOhpTf3FmyfWRC
$2a$10$eo7yuuE2f7XqJL8Wjyz.F.xj78ltWuMS1P0O/I6X7iNPwdsWMVzu6
$2a$10$3ErH2GtZpYJGg1BhfgcO/uOt/L2wYg4RoO8.fNRam458WWdymdQLW
$2a$10$IksOJvL/a0ebl4R2/nbMQ.XmjNARIzNo8.aLXiTFs1Pxd06SsnOWa
Spring安全配置。
@Configuration
@Import(SecurityProblemSupport.class)
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@PostConstruct
public void init() {
try {
authenticationManagerBuilder
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
} catch (Exception e) {
throw new BeanInitializationException("Security configuration failed", e);
}
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
4条答案
按热度按时间uxh89sit1#
您可以在BCryptPasswordEncoder中使用
matches
方法,如下所示:wqsoz72f2#
实际上我找到了我的答案。我意识到我可以在类 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder 中使用
matches
函数。db2dz4w83#
SpringSecurity只是从先前生成的哈希值中读取salt值,然后用相同的salt值对输入的密码进行重新哈希,并比较最终的哈希值,结果显然是相同的。
示例:
密码:
test
散列:
$2a$10$nCgoWdqJwQs9prt7X5a/2eWLn88I8pon6iNat90u4rq4mHqtoPGQy
散列具有3个段,每个段由
$
符号分隔。2a
是Bcrypt的版本,10
是总轮数,nCgoWdqJwQs9prt7X5a/2e
是盐。所以spring security使用密码
test
和saltnCgoWdqJwQs9prt7X5a/2e
并运行哈希方法,显然它生成的哈希值与密码和salt匹配的哈希值相同。cgh8pdjw4#
请尝试以下操作: