项目的话,我们是继续写的,此时项目是已经实现了数据库的用户名,密码登录,且用的是自己的登录页面。
密码加密我们用到这PasswordEncoder这个接口
public interface PasswordEncoder { String encode(CharSequence rawPassword); boolean matches(CharSequence rawPassword, String encodedPassword); default boolean upgradeEncoding(String encodedPassword) { return false; } }
这个接口就三个方法
第一个encode方法:加密的方法,返回的String就是加密之后的字符串
第二个matches方法:密码比对的方法,rawPassword是明文密码,encodedPassword是加密后的密码,你把这来个参数传进来,它会自动帮你比对,然后放回一个boolean值
第三个upgradeEncoding方法:是说加密方案是否需要升级
首先我们可以看看这个这个接口的实现类(alt+h)
其中MessageDigestPasswordEncoder就是md5了
常用的还有BCryptPasswordEncoder,
BCryptPasswordEncoder方法采用了SHA-256+随机盐+密钥对密码进行加密。
class SecurityDemoApplicationTests { /** * security中密码自带盐 */ @Test void contextLoads() { BCryptPasswordEncoder B = new BCryptPasswordEncoder(); for (int i = 0; i < 10; i++){ System.out.println(B.encode("123")); } } }
我们使用这个方法对123进行加密,得到
可以设置密码的强度 4-31的数字,数字越大,密码强度越高,所需要的时间就越久 可以防止有人频繁去试密码,我们比对的时间会更长。
在spring security中默认使用的加密方法是
全局搜索一个PasswordEncoderFactories
这个类是干嘛的呢,大家可以自己点开看看,里面初始化了一个DelegatingPasswordEncoder
对象,这里是把所有的加密方式都写出来了,匹配你的密码的加密方式,默认是”bcrypt“
这里记录一个密码升级的方法
先在UserService里实现一个UserDetailsPasswordService方法
里面有这么一个方法
当用户登录之后,这个方法会自动判断用户密码是否需要升级
判断依据是:
1.这个用户的密码加密方案是否是当前默认的方案。
2.同一种加密方案也可以升级的不同强度
在登录成功后密码从原本的
改为
也就是默认的加密方式。
也可以修改默认的加密方式
以上就是密码的加密与更新。