DengQN·一个普通程序员;
Spring Security 的登录密码验证
2018-09-30 17:00 66
#密码#值#哈希#方法#加密#中#盐#配置#存放

spring security 在配置登陆的时候可以加密。

一般来说,数据库中不会存放明文密码,而是存放密码的hash值,而且是加过盐的密码哈希值。

而spring security提供了相关的加密方案。

BCryptPasswordEncoder

目前spring推荐使用的是 BCryptPasswordEncoder,来进行数据的加密和验证。

BCryptPasswordEncoder有两个起作用的方法,encode和matches

encode方法

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值中的那些 $ 应该是盐的分隔符 Encode结果

在储存的时候可以把加盐后的哈希值存好。

matches 方法

matches方法负责比对存储好的哈希值是不是属于某个密码。

他会先把存好的哈希值中的盐提取出来,然后应用到密码上,计算出hash值后得到一个hash值,然后比对。

先用encode生成一个试一下:

logger.info("is true?  {}",cryptPasswordEncoder.matches("dqn","$2a$1$95TYhnCLucrLeRDz9PVifuKm99u5mcMqRXe4bzirKOQZAjOhJ0Wr6"));

matches

在Security的配置中

在Security的配置文件中加上BCryptPasswordEncoder这是很简单的:

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(username -> {
         //   return something;
        }).passwordEncoder(new BCryptPasswordEncoder());
    }

直接new