35.4 Password Encoding
spring-security-crypt模块的密码包支持对密码进行编码。PasswordEncoder
是中央服务接口,具有以下签名:
1 public interface PasswordEncoder { 2 3 String encode(String rawPassword); 4 5 boolean matches(String rawPassword, String encodedPassword); 6 }
如果原始密码编码后等于编码密码,则matches方法返回true。该方法旨在支持基于密码的身份验证方案。
BCryptPasswordEncoder实现使用广泛支持的“bcrypt”算法来散列密码。加密使用一个随机的16字节盐值,是一个故意慢的算法,以阻止密码破解。它所做的工作量可以使用“强度”参数进行调整,该参数取值范围为4到31。该值越高,计算哈希所需做的工作就越多。默认值为10。您可以在部署的系统中更改该值,而不会影响现有密码,因为该值也存储在编码的哈希中。
1 // Create an encoder with strength 16 2 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16); 3 String result = encoder.encode("myPassword"); 4 assertTrue(encoder.matches("myPassword", result));
Pbkdf2PasswordEncoder 实现使用PBKDF 2算法对密码进行哈希处理。为了击败密码破解,PBKDF2是一个故意慢的算法,应该调整到需要大约0.5秒来验证您系统上的密码。
1 // Create an encoder with all the defaults 2 Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder(); 3 String result = encoder.encode("myPassword"); 4 assertTrue(encoder.matches("myPassword", result));