SpringSecurity-12-PasswordEncoder密码加密简介
为什么密码加密?
国内的每一个开发社区在2011年发生过被黑客攻击,盗取用户信息,600多万的明文密码信息被盗取,大量用户面临着数据隐私泄露和数据安全的威胁。这警告了我们,一旦被黑客攻击用户账号信息被盗,我们该如何减少用户的损失,在我们开发者角度来看就是如何使得用户的账号密码变得安全。怎么让用户的密码变得安全呢?那就是要对用户的密码存储进行加密。
MD5加密
MD5信息摘要算法,是一种密码散列函数
,可以生成一个128(16字节)的散列值,用于保证信息传输的一致性。但是MD5加密是不安全的,现在可以很轻松进行解密。举例说明不安全性。
- 在mysql控制台输入md5的加密,sql如下
SELECT MD5(123456)
密码加密后数据
- 通过MD5加密以后,我们随便找一个MD5解密的网站例如https://www.cmd5.com/,输入加密后的密码进行解密后就可以得到原始密码
SpringSecurity的PasswordEncoder
SpringSecurity内置的密码加密机制,使用的时候只需要PasswordEncode接口即可
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
PasswordEncoder接口有三个方法:
String encode(CharSequence rawPassword)一般在用户注册和修改密码的时候使用
- rawPassword参数表示的是原始密码
- 输出的String类型数据是加密后的不可被逆向的hash值,
boolean matches(CharSequence rawPassword, String encodedPassword)用于校验输入密码和加密和的密码是否匹配
boolean upgradeEncoding(String encodedPassword)方法用意是在判断密码是否需要重新加密?true表示需要,false表示不需要。
SpringSecurity的加密实现
SpringSecurity的加密实现实际上就是去实现PasswordEncoder,具体实现有如下
我们一般使用BCryptPasswordEncoder进行密码加密,它是一种盐加密(不了解盐加密的可以自行百度),我们测试以下盐加密和MD5加密有何不同,具体代码如下
@SpringBootTest
class SpringSecurityLearn8ApplicationTests {
@Test
void contextLoads() {
String md5_one = DigestUtils.md5DigestAsHex("123456".getBytes());
String md5_two = DigestUtils.md5DigestAsHex("123456".getBytes());
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String password_one = encoder.encode("123456");
String password_two = encoder.encode("123456");
System.out.println("md5_one: " + md5_one);
System.out.println("md5_two: " + md5_two);
System.out.println("password_one: " + password_one);
System.out.println("password_two: " + password_two);
}
}
控制台输出结果如下,我们发现MD5加密两次加密结果一样,因此很容易就可以进行解密,但是BCryptPasswordEncoder的两次加密的结果不一样,因此是不可逆加密。
md5_one: e10adc3949ba59abbe56e057f20f883e
md5_two: e10adc3949ba59abbe56e057f20f883e
password_one: $2a$10$tB9sjNF3ktIIzg9PQ8CaduauX3rRh7zsFADesQl2oXvmZ150xKZGS
password_two: $2a$10$c1vMF3CVEw1ggwpPrH9KD.qq2mw2GVW8Tnq5f7XsC/6X6a67yTJjS
这就是BCryptPasswordEncoder加密的特性,每次加密产生一个随机盐,然后每次加密产生不同结果。
Bcrypt有四个变量:
- saltRounds:正数,表示哈希杂凑次数,数值越高越安全,默认10次
- password:明文密码
- slat:盐,一个128bits的随机字符串,长度为22字符
- hash:精美Bcrypt加密的哈希结果
Bcrypt加密后的密码三部分,使用$分割:
- $2a表示Bcrypt算法
- 10表示哈希杂凑次数
- tB9sjNF3ktIIzg9PQ8Cadu表示随机生成的盐
如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!
关注公众号 springboot葵花宝典 我将持续更新,并且获取我搜集的spingboot资料,谢谢!
原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!