BCryptPasswordEncoder使用

在 Spring Security 中有一个加密的类 BCryptPasswordEncoder ,它的使用非常的简单而且也比较有趣。让我们来看看它的使用。

首先创建一个 SpringBoot 的项目,在创建项目的时候添加 Spring Security 的依赖。然后我们添加一个测试类,写如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
final private String password = "123456";

@Test
public void TestCrypt()
{
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

String encode1 = bCryptPasswordEncoder.encode(password);
System.out.println("encode1:" + encode1);

String encode2 = bCryptPasswordEncoder.encode(password);
System.out.println("encode2:" + encode2);
}

上面的代码中,首先实例化了一个 BCryptPasswordEncoder 类,然后使用该类的 encode 方法对同一个明文字符串进行了加密,并输出。运行上面的代码,查看输出。

1
2
encode1:$2a$10$SqbQb0pD3KYrH7ZVTWdRZOhPAelQqa..lUnysXoWag6RvMkyC5SE6
encode2:$2a$10$0sjBLlwrrch2EjgYls197e9dGRCMbQ7KUIt/ODPTSU0W.mEPaGkfG

从上面的输出可以看出,同一个明文加密两次,却输出了不同的结果。是不是很神奇?但是这样有一个问题,如果使用 BCryptPasswordEncoder 去加密登录密码的话,还能进行验证么?当然是可以验证的。验证的话,使用的是 BCryptPasswordEncoder 的 matches 方法,代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
final private String password = "123456";

@Test
public void TestCrypt()
{
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

String encode1 = bCryptPasswordEncoder.encode(password);
System.out.println("encode1:" + encode1);

boolean matches1 = bCryptPasswordEncoder.matches(password, encode1);
System.out.println("matches1:" + matches1);

String encode2 = bCryptPasswordEncoder.encode(password);
System.out.println("encode2:" + encode2);

boolean matches2 = bCryptPasswordEncoder.matches(password, encode2);
System.out.println("matches2:" + matches2);
}

复制

使用 matches 方法可以对加密前和加密后是否匹配进行验证。输出如下:

1
2
3
4
encode1:$2a$10$qxU.rFLeTmZg47FyqJlZwu.QNX9RpEvqBUJiwUvUE0p4ENR.EndfS
matches1:true
encode2:$2a$10$NyGEOsQ1Hxv2gvYRmaEENueORlVDtSqoB/fHN76KkvQDeg7fbTy22
matches2:true