Note
bcrypt
专门用于处理密码的单向哈希算法的 Node.js 库
发布于 更新于
bcrypt
bcrypt 是一个专门用于处理密码的单向哈希算法的 Node.js 库。它主要完成两件事:
- 哈希密码:在用户注册时通过哈希密码把明文密码变为哈希值存储
- 校验密码:在登录时,把用户输入的明文密码与数据库的密码哈希进行匹配
bcrypt 官方推荐服务器使用异步方法,因为 bcrypt 属于 CPU 密集型计算,同步版本会阻塞 Node.js 主事件循环
安装和导入
// 安装
npm install bcrypt
// 导入
import * as bcrypt from 'bcrypt';
常用方法
| 方法 | 作用 |
|---|---|
hash() |
把密码转换成哈希 |
compare() |
校验明文密码和哈希是否匹配 |
bcrypt.hash()
将明文密码转换成可以保存到数据库里的密码哈希
参数和返回值
bcrypt.hash(
data: string | Buffer,
saltOrRounds: string | number,
): Promise<string>
| 参数 | 含义 |
|---|---|
data |
表示要进行哈希的数据,在用户系统里通常就是明文密码 |
saltOrRounds |
成本因子,表示bcrypt的计算成本,即可以直接传数字(成本因子),也可以传已经生成的盐值 salt。数值越大,生成哈希越慢,暴力破解也越慢,服务器注册和登录也越消耗资源。普通项目可以设置为12 |
示例
// 方式一
await bcrypt.hash("123456", 12);
// 方式二
const salt = await bcrypt.genSalt(12);
const passwordHash = await bcrypt.hash("123456", salt);
console.log(passwordHash); // $2b$12$J4T9FxWgMlWm7jv9fMURXu...
bcrypt.compare()
判断一个明文密码,是否与某个 bcrypt 哈希匹配
const matched = await bcrypt.compare(inputPassword, user.passwordHash);
参数和返回值
bcrypt.compare(
data: string | Buffer,
encrypted: string,
): Promise<boolean>
| 参数 | 含义 |
|---|---|
data |
用户本次输入的明文密码 |
encrypted |
数据库中保存的 bcrypt 哈希 |
示例
const matched = await bcrypt.compare(inputPassword, user.passwordHash);