如何将密码文本与 bcrypt 哈希进行比较?
how to compare a password text with the bcrypt hashes?
我的应用程序中有一个用例可以防止用户在重置密码时选择最后 3 个密码之一。我在前端使用 Angular,在后端使用 Spring 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
时,我可以看到生成的盐是随机值。
a$tztZsPFZ.T.82Gl/VIuMt.RDjayTwuMLAkRkO9SB.rd92vHWKZmRm
a$yTHyWDmcCBq3OSPOxjj4TuW9qXYE31CU.fFlWxppii9AizL0lKMzO
a$Z6aVwg.FNq/2I4zmDjDOceT9ha0Ur/UKsCfdADLvNHiZpR7Sz53fC
a$yKDVeOUvfTQuTnCHGJp.LeURFcXK6JcHB6lrSgoX1pRjxXDoc8up.
a$ZuAL06GS7shHz.U/ywb2iuhv2Spubl7Xo4NZ7QOYw3cHWK7/7ZKcC
aT37YehBTmPWuN9j.ga2XeF9GHy6EWDhQS5Uc9bHvJTK8.xIm1coS
a$o/zxjGkArT7YdDkrk5Qer.oJbZAYpJW39iWAWFqbOhpTf3FmyfWRC
a$eo7yuuE2f7XqJL8Wjyz.F.xj78ltWuMS1P0O/I6X7iNPwdsWMVzu6
aErH2GtZpYJGg1BhfgcO/uOt/L2wYg4RoO8.fNRam458WWdymdQLW
a$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();
}
}
实际上我找到了答案。
我意识到我可以在 class org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.
中使用 matches
函数
System.out.println(b.matches("passw0rd", "a$tztZsPFZ.T.82Gl/VIuMt.RDjayTwuMLAkRkO9SB.rd92vHWKZmRm"));
你可以在 BCryptPasswordEncoder 中使用 matches
方法,像这样:
b.matches("passw0rd", hash)
Spring 安全只是从先前生成的哈希中读取盐,然后用相同的盐再次重新散列输入密码。它比较了两个最终的哈希值,显然它是相同的。
示例:
密码:test
哈希:a$nCgoWdqJwQs9prt7X5a/2eWLn88I8pon6iNat90u4rq4mHqtoPGQy
哈希有 3 个段,每个段由 $
符号分隔。 2a
是 Bcrypt 的版本,10
是总轮数,nCgoWdqJwQs9prt7X5a/2e
是盐。
所以 spring 安全获取密码 test
和盐 nCgoWdqJwQs9prt7X5a/2e
并运行散列方法。显然它会生成与密码和盐匹配相同的哈希值。
我的应用程序中有一个用例可以防止用户在重置密码时选择最后 3 个密码之一。我在前端使用 Angular,在后端使用 Spring 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
时,我可以看到生成的盐是随机值。
a$tztZsPFZ.T.82Gl/VIuMt.RDjayTwuMLAkRkO9SB.rd92vHWKZmRm
a$yTHyWDmcCBq3OSPOxjj4TuW9qXYE31CU.fFlWxppii9AizL0lKMzO
a$Z6aVwg.FNq/2I4zmDjDOceT9ha0Ur/UKsCfdADLvNHiZpR7Sz53fC
a$yKDVeOUvfTQuTnCHGJp.LeURFcXK6JcHB6lrSgoX1pRjxXDoc8up.
a$ZuAL06GS7shHz.U/ywb2iuhv2Spubl7Xo4NZ7QOYw3cHWK7/7ZKcC
aT37YehBTmPWuN9j.ga2XeF9GHy6EWDhQS5Uc9bHvJTK8.xIm1coS
a$o/zxjGkArT7YdDkrk5Qer.oJbZAYpJW39iWAWFqbOhpTf3FmyfWRC
a$eo7yuuE2f7XqJL8Wjyz.F.xj78ltWuMS1P0O/I6X7iNPwdsWMVzu6
aErH2GtZpYJGg1BhfgcO/uOt/L2wYg4RoO8.fNRam458WWdymdQLW
a$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();
}
}
实际上我找到了答案。 我意识到我可以在 class org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.
中使用matches
函数
System.out.println(b.matches("passw0rd", "a$tztZsPFZ.T.82Gl/VIuMt.RDjayTwuMLAkRkO9SB.rd92vHWKZmRm"));
你可以在 BCryptPasswordEncoder 中使用 matches
方法,像这样:
b.matches("passw0rd", hash)
Spring 安全只是从先前生成的哈希中读取盐,然后用相同的盐再次重新散列输入密码。它比较了两个最终的哈希值,显然它是相同的。
示例:
密码:test
哈希:a$nCgoWdqJwQs9prt7X5a/2eWLn88I8pon6iNat90u4rq4mHqtoPGQy
哈希有 3 个段,每个段由 $
符号分隔。 2a
是 Bcrypt 的版本,10
是总轮数,nCgoWdqJwQs9prt7X5a/2e
是盐。
所以 spring 安全获取密码 test
和盐 nCgoWdqJwQs9prt7X5a/2e
并运行散列方法。显然它会生成与密码和盐匹配相同的哈希值。