返回文章列表 →

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);