在这里是用的bcrypt加密算法,这种现在比较流行 而且无法进行解密
引入依赖
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.10</version>
</dependency>
bcrypt hash 字符串结构
一个 bcrypt hash 字符串应该像下面这样(摘自 Wikipedia):
$2<a/b/x/y>$[cost]$[22 character salt][31 character hash]
举个栗子:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
Alg Cost Salt Hash
2a
: 算法的标识符,代表是 bcrypt 的版本,有 2a、2y、2b 三个版本。
10
: 成本因子:代表轮询加密 2^10 = 1024 次。
N9qo8uLOickgx2ZMRZoMye
: 16-byte (128-bit) 的 salt, 用 Radix-64 编码成为 22 个字符。
IjZAgcfl7p92ldGxad68LJZdL17lhWy
: 24-byte (192-bit) 的 hash, 用 Radix-64 编码成为 31 个字符。
特点
bcrypt 有三个特点:
- 每一次 Hash 出来的值不一样。
- 计算非常缓慢。
- 每次的 salt 是随机的生成的,不用担心 salt 会泄露。
bcrypt 对同一个密码每次加密时使用的 salt 是不一样的, 因此每次生成的 Hash 也是不一样的,但是 Hash 中包含了 salt,在下次校验时,从 Hash 中取出 salt,salt 跟password 进行 Hash 得到密文。密文和保存在 DB 中的 Hash 是同样的原文和 salt 加密出来的,所以必定是相同的字符串。bcrypt 算法将 salt 随机并混入最终加密后的密码,验证时也无需单独提供之前的 salt。
根据源码可以看出来
测试样例:
这里可以看到 对相同的密码 生成的密文不一样
并且bcrypt没有解密方式 只能用checkpw方法进行校验
然后可以把浏览器传输过来的参数和存到数据库里边的密文进行比较