Spring 中的 BCrypt 提供与在线工具不同的哈希值

BCrypt in Spring gives different hash then online tools

我在 Spring 中使用 BCrypt,它给了我不同的哈希值,然后一些在线工具正在使用 https://bcrypt-generator.com/

知道为什么吗?

我尝试在 Spring 中将强度设置为 12,并在 bcrypt-generator.com 中将轮次设置为 12,但没有成功。

    DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
    provider.setPasswordEncoder(new BCryptPasswordEncoder(12));
    provider.setUserDetailsService(bettingBotUserDetailsService);

对于原始密码 "admin" 我得到这些结果:

bcrypt-generator.com 12 轮:

yh6Idq/TwfcuJu6H1VXie/ao7P4AKlLgIrC5yxbwlEUdJjx9Sl5S

Spring(从调试模式捕获):

a$ED5wQChpxzagbvhlqEqD2.iIdIKv9ddvJcX0WKrQzSOckgc3RHFLW

BCrypt 为相同的输入生成不同的盐Bcrypt Algorithm

BCrypt returns 每次不同的散列,因为它将不同的随机值合并到散列中。这被称为 "salt"。它可以防止人们使用 "rainbow table"、预先生成的 table 将密码哈希映射回他们的密码来攻击您的哈希密码。盐意味着密码没有一个散列,而是 2^16 个。

我们可以用普通字符串检查散列如下

Boolean isMatch = passwordEncoder().matches(currentPassword,dbPassword);

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}