以下是 bcrypt 库中最常用的方法及使用示例:


1. bcrypt.hash(password, saltOrRounds)

  • 作用:将明文密码加密为 bcrypt 哈希值。
  • 参数

    • password:需要加密的明文密码(字符串)。
    • saltOrRounds

      • 若为数字(如 10),则表示盐的 rounds(加密强度,建议至少 10)。
      • 若为字符串,则是预先生成的盐(需通过 bcrypt.genSalt 生成)。
  • 返回值:加密后的哈希字符串(Promise)。
  • 示例
import * as bcrypt from 'bcrypt';

const password = 'mySecurePassword';
const saltRounds = 10;

bcrypt.hash(password, saltRounds)
  .then(hash => {
    console.log('Hash:', hash);
    // 将 hash 存入数据库
  })
  .catch(err => console.error(err));

2. bcrypt.compare(password, hash)`

  • 作用:验证明文密码与存储的哈希值是否匹配。
  • 参数

    • password:用户输入的明文密码。
    • hash:之前加密存储的哈希值。
  • 返回值:布尔值(true 表示匹配,false 表示不匹配)。
  • 示例
import * as bcrypt from 'bcrypt';

const enteredPassword = 'mySecurePassword';
const storedHash = '$2b$10$...'; // 从数据库获取的哈希

bcrypt.compare(enteredPassword, storedHash)
  .then(isMatch => {
    if (isMatch) {
      console.log('密码验证成功');
    } else {
      console.log('密码错误');
    }
  })
  .catch(err => console.error(err));

**3. **bcrypt.genSalt(rounds)

  • 作用:生成指定 rounds 的盐(可选,通常直接通过 hash 方法内置生成)。
  • 参数rounds(默认 10)。
  • 返回值:生成的盐字符串(Promise)。
  • 示例
import * as bcrypt from 'bcrypt';

bcrypt.genSalt(12)
  .then(salt => {
    console.log('生成的盐:', salt);
    // 使用盐手动加密
    bcrypt.hash(password, salt);
  })
  .catch(err => console.error(err));

**4. **bcrypt.hashSync(password, saltOrRounds)

  • 作用:同步加密密码(非异步,阻塞线程,不推荐在高并发场景使用)。
  • 参数:与 hash 相同。
  • 返回值:直接返回哈希字符串。
  • 示例
const hash = bcrypt.hashSync('password', 10);

**5. **bcrypt.compareSync(password, hash)

  • 作用:同步验证密码(与 compare 功能相同,但同步执行)。
  • 返回值:布尔值。

最佳实践

  1. 避免手动生成盐:直接通过 bcrypt.hash(password, saltRounds) 自动处理盐的生成。
  2. 调整 rounds 值:根据服务器性能设置合适的 rounds(如 10-12),数值越高加密越慢但更安全。
  3. 错误处理:在异步操作中使用 try-catch 捕获异常。
  4. 不存储明文密码:始终存储哈希值而非原始密码。

在 NestJS 中的典型用例

// 用户服务中密码加密示例
async createUser(password: string): Promise<string> {
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(password, salt);
  // 保存 hashedPassword 到数据库
  return hashedPassword;
}

async validateUser(enteredPassword: string, storedHash: string): Promise<boolean> {
  return await bcrypt.compare(enteredPassword, storedHash);
}

如果需要进一步集成到 NestJS 模块或处理其他场景,可以告诉我具体需求!

最后修改:2025 年 03 月 17 日
如果觉得我的文章对你有用,请随意赞赏