项目中用这个加密感受不错啊,推荐:html
1.先大致看看,了解一下java
浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches)web
spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着能够解密(这个与编码/解码同样),可是采用Hash处理,其过程是不可逆的。算法
(1)加密(encode):注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,获得密码的hash值,而后将其存入数据库中。spring
(2)密码匹配(matches):用户登陆时,密码匹配阶段并无进行密码解密(由于密码通过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,获得密码的hash值,而后将其与从数据库中查询到的密码hash值进行比较。若是二者相同,说明用户输入的密码正确。数据库
这正是为何处理密码时要用hash算法,而不用加密算法。由于这样处理即便数据库泄漏,黑客也很难破解密码(破解密码只能用彩虹表)。安全
任何应用考虑到安全,毫不能明文的方式保存密码。密码应该经过哈希算法进行加密。有不少标准的算法好比SHA或者MD5,结合salt(盐)是一个不错的选择。 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。ide
BCrypt强哈希方法 每次加密的结果都不同。学习
---------------------------------------------------------------------------------------------------------------ui
2.这里BCryptPasswordEncoder看看他怎么用:
做者:知乎用户
连接:https://www.zhihu.com/question/54720851/answer/288322108
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
学习到这一块,查看了一些源码。以BCryptPasswordEncoder为例
public class BCryptPasswordEncoderTest {
public static void main(String[] args) {
String pass = "admin";
BCryptPasswordEncoder bcryptPasswordEncoder = new BCryptPasswordEncoder();
String hashPass = bcryptPasswordEncoder.encode(pass);
System.out.println(hashPass);
boolean f = bcryptPasswordEncoder.matches("admin",hashPass);
System.out.println(f);
}
}
能够看到,每次输出的hashPass 都不同,
可是最终的f都为 true,即匹配成功。
查看代码,能够看到,其实每次的随机盐,都保存在hashPass中。
在进行matchs进行比较时,调用BCrypt 的String hashpw(String password, String salt)
方法。两个参数即”admin“和 hashPass
//******BCrypt.java******salt即取出要比较的DB中的密码*******
real_salt = salt.substring(off + 3, off + 25);
try {
// ***************************************************
passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8");
}
catch (UnsupportedEncodingException uee) {}
saltb = decode_base64(real_salt, BCRYPT_SALT_LEN);
B = new BCrypt();
hashed = B.crypt_raw(passwordb, saltb, rounds);
假定一次hashPass为:$2a$10$AxafsyVqK51p.s9WAEYWYeIY9TKEoG83LTEOSB3KUkoLtGsBKhCwe
随机盐即为 AxafsyVqK51p.s9WAEYWYe
(salt = BCrypt.gensalt();中有描述)
可见,随机盐(AxafsyVqK51p.s9WAEYWYe),会在比较的时候,从新被取出。
即,加密的hashPass中,前部分已经包含了盐信息。
--------------------------------------------------------------------------------------------------------------------
3.在springcloud中整合,下面说的也不清楚。。。。。
好了废话很少说,就看怎么整合吧。。
@Autowired
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserService).passwordEncoder(new BCryptPasswordEncoder());
}
这样配置就行了。可是关于怎么初始化密码呢,和注册用户的时候怎么给密码加密呢?
public SysUser create(User u user){
//进行加密
BCryptPasswordEncoder encoder =new BCryptPasswordEncoder();
sysUser.setPassword(encoder.encode(user.getRawPassword().trim()));
userDao.create(user);
return sysUser;
虽然每次 BCryptPasswordEncoder 的 encoder 结果都不同,可是存贮其中一次加密结果 也可以验证成功
这个在新版本中是的结果不是上面知乎演示的结果,新版中是按照一列类规则进行验证的,加密结果前面并不包含盐
原文地址:https://blog.csdn.net/lidew521/article/details/82463736