// 未分类
Spring Security 的登录密码验证
发布 2018-09-30 · 永久链接
no excerpt about this article
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值中的那些 **$** 应该是盐的分隔符

在储存的时候可以把加盐后的哈希值存好。
##### matches 方法
matches方法负责比对存储好的哈希值是不是属于某个密码。
他会先把存好的哈希值中的盐提取出来,然后应用到密码上,计算出hash值后得到一个hash值,然后比对。
先用encode生成一个试一下:
```
logger.info("is true? {}",cryptPasswordEncoder.matches("dqn","$2a$1$95TYhnCLucrLeRDz9PVifuKm99u5mcMqRXe4bzirKOQZAjOhJ0Wr6"));
```

## 在Security的配置中
在Security的配置文件中加上`BCryptPasswordEncoder`这是很简单的:
``` java
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(username -> {
// return something;
}).passwordEncoder(new BCryptPasswordEncoder());
}
```
直接new