java - 为什么来自 Spring 的 BCryptPasswordEncoder 为相同的输入

我正在使用带有 Spring 安全性的 BCryptPasswordEncoder。我的期望是,对于相同的输入,我总是会得到相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用下面的代码片段对其进行测试:

String password = "123456"; 
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String encodedPassword = passwordEncoder.encode(password);
System.out.print(encodedPassword);

output: $2a$10$cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi

output2: $2a$10$KEvYX9yjj0f1X3Wl8S.KPuWzSWGyGM9ubI71NOm3ZNbJcwWN6agvW

output3: $2a$10$nCmrPtUaOLn5EI73VZ4Ouu1TmkSWDUxxD4N6A.8hPBWg43Vl.RLDC

有人能解释一下,为什么 BCryptPasswordEncoder 会这样吗?

最佳答案

public static void main(String[] args) {
  // spring 4.0.0
  org.springframework.security.crypto.password.PasswordEncoder encoder
   = new org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder();

   // $2a$10$lB6/PKg2/JC4XgdMDXyjs.dLC9jFNAuuNbFkL9udcXe/EBjxSyqxW
   // true
   // $2a$10$KbQiHKTa1WIsQFTQWQKCiujoTJJB7MCMSaSgG/imVkKRicMPwgN5i
   // true
   // $2a$10$5WfW4uxVb4SIdzcTJI9U7eU4ZwaocrvP.2CKkWJkBDKz1dmCh50J2
   // true
   // $2a$10$0wR/6uaPxU7kGyUIsx/JS.krbAA9429fwsuCyTlEFJG54HgdR10nK
   // true
   // $2a$10$gfmnyiTlf8MDmwG7oqKJG.W8rrag8jt6dNW.31ukgr0.quwGujUuO
   // true

    for (int i = 0; i < 5; i++) {
      // "123456" - plain text - user input from user interface
      String passwd = encoder.encode("123456");

      // passwd - password from database
      System.out.println(passwd); // print hash

      // true for all 5 iteration
      System.out.println(encoder.matches("123456", passwd));
    }
}

关于java - 为什么来自 Spring 的 BCryptPasswordEncoder 为相同的输入生成不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25844419/

相关文章:

java - AspectJ 表达式在切入点错误中给出正式的未绑定(bind)

java - 我无法使用断点进行调试

java - @ControllerAdvice 在处理异常方面比 @ExceptionHandle

java - 使用 restAssured 测试 Spring Boot Rest 应用程序

database - Spring Batch Framework - 自动创建批处理表

spring - 配置多个数据源后无法设置JPA命名策略(Spring 1.4.1/Hibernat

java - 为什么 Spring 的 jdbcTemplate.batchUpdate() 这么慢

java - 如何在spring mvc中使用带有freemarker的消息?

java - 在 Spring Boot 中读取环境变量

java - Spring Security 中的 "principal"是什么?