java - 密码编码器,更新密码,看新旧是否相同

标签 java spring spring-boot spring-security

有没有办法检查纯文本密码和加密密码,看看它们是否相同?

这使用:

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/

相关文章:

java - 使用 Autowiring 的 Spring Boot 字段注入(inject)在 JUnit 测试中不起作用

java - 如何在 Android 中将按钮状态保存到 SharedPreferences 中

java - Spring @ContextConfiguration 无法从不同项目加载测试上下文

java - 如何在 spring-boot 中指定较新版本的 Elasticsearch

java - http 和 https 是否共享相同的 session

java - Gradle环境下JUnit测试访问文件

java - spring中如何将事务设置在最底层,类似jdbc?

java - Spring:如何从jar类路径加载@ContextConfiguration?我收到 FileNotFoundException

spring-boot - 我可以在同一台机器上运行多个Elasticsearch实例进行日志聚合吗?

java - 为什么 Spring Boot 中父类(super class)上的 @Bean 泛型创建方法的调用晚于子类上的创建方法?