bcrypt 加密

🔐 什么是 bcrypt ?

bcrypt 是一个专门用来做密码加密的库。

它不是普通的 MD5、SHA1,那些太容易被破解。

bcrypt 最大的特点:

✔ 不可逆(无法解密)

✔ 自带随机盐(salt) ,每次生成的密文都不同

✔ 安全性非常高

✔ 适合密码存储

✔ 被业界大量使用(GitHub / Heroku / MongoDB / PHP 都在用)


🧠 bcrypt 的核心原理(很简单)

当你存密码,比如 123456 时,bcrypt 不会直接保存这个密码。

流程如下:

  1. 生成一个随机 salt(盐)
  2. 用你的密码 + 盐 做多轮哈希处理(默认 10 轮)
  3. 最后得到一个完全不同的加密字符串

✔ 即使两个用户密码一样,加密结果也完全不同。

✔ "加密后不能反向解密",只能对比。


🧪 bcrypt 的两个核心 API

1. 哈希加密:hash()

把密码转成安全的密文。

ini 复制代码
import * as bcrypt from 'bcrypt';

const saltRounds = 10;
const hash = await bcrypt.hash("123456", saltRounds);
console.log(hash);

输出类似:

perl 复制代码
$2b$10$yYHDGSCim30POqPxlHOK7OyM2bEPB0l/wA2VY0p3GG9AaJfV9jLGM

注意:

👉 每次 hash() 的结果都不同,但这不会影响验证。


2. 密码校验:compare()

登录时用户输入密码时做校验。

vbnet 复制代码
const isMatch = await bcrypt.compare("123456", hash);
console.log(isMatch); // true 或 false

compare() 会自动处理盐,不需要你自己做。


📦 bcrypt 在 NestJS 中怎么用?


1)安装(正确写法)

bash 复制代码
npm install bcrypt
npm install -D @types/bcrypt

2)注册时加密

javascript 复制代码
import * as bcrypt from 'bcrypt';

async register(dto) {
  const saltRounds = 10;
  const hash = await bcrypt.hash(dto.password, saltRounds);

  await this.userRepo.save({
    username: dto.username,
    password: hash
  });
}

3)登录时验证密码

javascript 复制代码
async login(dto) {
  const user = await this.userRepo.findOne({ where: { username: dto.username } });

  if (!user) throw new Error('用户不存在');

  const isMatch = await bcrypt.compare(dto.password, user.password);

  if (!isMatch) throw new Error('密码错误');

  return user;
}
相关推荐
HPtiger8 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训9 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen9 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy9 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据9 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
erzong23111 小时前
Linux操作系统:线程概念与控制
linux·算法
Nil20811 小时前
leetcode 5最长回文子串
算法·leetcode·职场和发展
xxwl58512 小时前
区域赛分类题解
c++·笔记·学习·算法
m0_6745719712 小时前
力扣 hot 100 python
python·算法·leetcode
青少儿编程课堂12 小时前
蓝桥杯+全国青少年信息素养大赛+电子学会PythonC/C++考级:最长公共子序列LCS解析
c++·python·算法·bfs·信息学竞赛