Spring 5中BCryptPasswordEncoder加密密码的单元测试问题求助
如何正确验证BCryptPasswordEncoder加密的密码?
你踩了BCrypt使用里的一个常见坑——BCryptPasswordEncoder每次调用encode()方法时,都会自动生成随机的盐值,哪怕是同一个明文密码,两次生成的哈希字符串也完全不一样,直接用assertEquals对比哈希值肯定会失败,这就是你测试报错的核心原因。
正确的做法是使用BCryptPasswordEncoder专门提供的matches()方法来验证密码,这个方法会自动从存储的哈希密码中提取盐值和加密参数,用相同的规则对明文密码进行哈希后再完成对比。
修改你的测试代码如下:
String hashedPassword = userRepository.findById(101L).orElse(null).getPassword(); // 用matches方法替代直接encode后对比 assertTrue(passwordEncoder.matches("myPassword", hashedPassword));
补充说明下原理:BCrypt生成的哈希字符串格式是$2a$10$[盐值][哈希内容],里面已经包含了加密所需的所有参数(加密版本、轮次、盐值),matches方法会解析这些参数,用相同的配置对明文密码重新哈希,这样就能准确验证密码是否匹配,完全不需要你手动管理盐值。
内容的提问来源于stack exchange,提问作者Laxminarayan
相关产品推荐
相关产品推荐

