码云项目上的使用实例:/XiMuQi/oauth2ucenter,在Utils工具类包下
本文主要分析BCryptPasswordEncoder随机盐的原理,因为随机盐的不同会导致对同一明文密码加密后得到的密码都不一样。
一、BCryptPasswordEncoder简介:
1.1 BCryptPasswordEncoder是采用SHA-256 +随机盐+密钥对明文密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。
1.2加密(encode):注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。
1.3密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。
这正是为什么处理密码时要用hash算法,而不用加密算法。因为这样处理即使数据库泄漏,黑客也很难破解密码!
二、BCryptPasswordEncoder分析
2.1三个重要的属性:
strength:循环加盐次数。
version:BCrypt加密算法的版本。BCryptPasswordEncoder中有一个内部枚举类,列举了3个加密算法的版本。
public static enum BCryptVersion {
$2A("$2a"),
$2Y("$2y"),
$2B("$2b");
private final String version;
private BCryptVersion(String version) {
= version;
}
public String getVersion() {
return ;
}
}
random:它是SecureRandom类型(强随机数生成器工具)
SecureRandom VS Random:
在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,因为其生成的值其实是可以预测的。
- SecureRandom类提供加密的强随机数生成器 (RNG)
- 当然,它的许多实现都是伪随机数生成器 (PRNG) 形式,这意味着它们将使用确定的算法根据实际的随机种子生成伪随机序列
- 也有其他实现可以生成实际的随机数
- 还有另一些实现则可能结合使用这两项技术
SecureRandom和Random都是,也是如果种子一样,产生的随机数也一样: 因为种子确定,随机数算法也确定,因此输出是确定的。
只是说,SecureRandom类收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,而不像Random默认使用系统当前时间的毫秒数作为种子,有规律可寻。
待续。。。