有没有办法检查纯文本密码和加密密码,看看它们是否相同?
这使用:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
BCrypt是底层服务,但接口(interface)是PasswordEncoder。
假设用户的密码是123,用户发送更新密码的请求,但新密码也是123。有没有办法在服务器端检查新密码和当前密码是否相同?
if (encoder.matches(newPasswordPlainText, oldPasswordEncrypted)) {
return false;
}
似乎不起作用
我使用 BCrypt 作为编码器。
最佳答案
基本上,要生成哈希 BCryptPasswordEncoder
需要原始密码 (1)、盐 (2) 和轮数 (3)。最后两个可以从编码的密码中确定。它有助于创建相同的哈希值。因此,将原始密码与编码后的密码进行匹配是没有问题的。
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
for (int i = 0; i < 10; ++i) {
String encodedPassword = encoder.encode("123");
System.out.println(encodedPassword + " " + encoder.matches("123", encodedPassword));
}
此代码段为您提供了不同的哈希值,但在所有情况下 encoder.matches("123", hashOf123)
上都具有固定的 true
:
$2a$10$.KLpQ8ESFuWo.lNMN.J3QeUPM2sl5PrGZ1PNortSIUaRxs4T4sN.6 true
$2a$10$Fl7QAFiYKYDcnW28Rg8mMOrrCSIz9eLAkJ2kokXs2LVyV9C1GYJM. true
...
$2a$10$qTXWvu0jEf7kM8DF7HD.fu0qu.kFJID8OmlXLm/6XJUJdA1Dje4vq true
确保存储在数据库中的密码是由您用于比较的相同算法(和相同版本)编码的。否则,您可能会得到异常或不正确的结果。
关于java - 密码编码器,更新密码,看新旧是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53704614/