使用BCryptPasswordEncoder时获得相同的散列值

时间:2014-11-07 23:38:17

标签: spring-security bcrypt

我使用BCryptPasswordEncoder使用spring security。现在要更改密码,我需要做的是将用户提供的现有密码与DB值进行比较。

但是由于salt是由BCryptPasswordEncoder动态生成的,所以每当我从下面的方法获得不同的散列值时,并不一定会与我的DB值匹配。

public static String encodePassword(String password) {
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String hashedPassword = passwordEncoder.encode(password);
    return hashedPassword;
} 

这个问题的补救措施是什么?我可以识别用于我的DB字段的盐并在上面的方法中使用相同的盐吗?

2 个答案:

答案 0 :(得分:35)

使用matches界面上的PasswordEncoder方法检查密码是否有效,而不是再次对其进行编码并与现有哈希进行比较。

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String existingPassword = ... // Password entered by user
String dbPassword       = ... // Load hashed DB password

if (passwordEncoder.matches(existingPassword, dbPassword)) {
    // Encode new password and store it
} else {
    // Report error 
}

答案 1 :(得分:1)

如果你将BCryptPasswordEncoder和你自己的属性(强度/随机)和Spring MVC一起使用,那么你可以将PasswordEncoder声明为Bean。这样,它将是一个单例实例,您可以重复使用它。

以下是一个示例(我不知道您正在使用哪种配置样式):

在您的安全配置中:

@Bean
public PasswordEncoder passwordEncoder() {

    int strength = // your strength;
    SecureRandom random = // your random

    PasswordEncoder encoder = new BCryptPasswordEncoder(strength, random);
    return encoder;
}

但是,在您的控制器中,您可以比较这样的密码:

@Autowired
private PasswordEncoder passwordEncoder;

public boolean checkPassword(String password, String 
    return passwordEncoder.matches(password, hashedPassword);;
}