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