spring security 在配置登陆的时候可以加密。
一般来说,数据库中不会存放明文密码,而是存放密码的hash值,而且是加过盐的密码哈希值。
而spring security提供了相关的加密方案。
目前spring推荐使用的是 BCryptPasswordEncoder
,来进行数据的加密和验证。
BCryptPasswordEncoder有两个起作用的方法,encode和matches
BCryptPasswordEncoder每次的encode会生成一个新的盐值。
@Test
public void testEncoder() {
BCryptPasswordEncoder cryptPasswordEncoder = new BCryptPasswordEncoder();
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
logger.info(cryptPasswordEncoder.encode("dqn"));
}
可以知道hash值中的那些 $ 应该是盐的分隔符
在储存的时候可以把加盐后的哈希值存好。
matches方法负责比对存储好的哈希值是不是属于某个密码。
他会先把存好的哈希值中的盐提取出来,然后应用到密码上,计算出hash值后得到一个hash值,然后比对。
先用encode生成一个试一下:
logger.info("is true? {}",cryptPasswordEncoder.matches("dqn","$2a$1$95TYhnCLucrLeRDz9PVifuKm99u5mcMqRXe4bzirKOQZAjOhJ0Wr6"));
在Security的配置文件中加上BCryptPasswordEncoder
这是很简单的:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(username -> {
// return something;
}).passwordEncoder(new BCryptPasswordEncoder());
}
直接new