hash
生成哈希值, compare
验证密码,支持同步和异步方法,哈希时自动加盐,确保密码存储安全,适用于Node.js环境,推荐异步操作避免阻塞。
bcryptjs是一个广泛使用的密码加密库,专为处理用户密码等敏感数据设计,它通过哈希加盐(Salt+Hashing)技术实现密码不可逆加密,能有效抵御彩虹表攻击,以下是详细的使用指南和最佳实践。
通过npm或yarn安装:
# 使用npm安装 npm install bcryptjs # 使用yarn安装 yarn add bcryptjs
在代码中引入模块:
// CommonJS语法 const bcrypt = require('bcryptjs'); // ES6模块语法 import bcrypt from 'bcryptjs';
const plainPassword = 'user123'; // 用户输入的原始密码 // 生成盐(saltRounds推荐设为10-12) bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(plainPassword, salt, (err, hash) => { console.log('加密后的哈希值:', hash); // 示例输出:$2a$10$3euPcmQFCiblsZeEu1s3/.JXnpCZhNkx7HQoH23MAgQEEuU1F7qEm }); }); // 简写形式(自动生成盐) bcrypt.hash(plainPassword, 10, (err, hash) => { // 直接存储hash到数据库 });
const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync(plainPassword, salt);
bcrypt.compare(plainPassword, hash, (err, result) => { if(result) { console.log('密码匹配'); } else { console.log('密码错误'); } });
const isMatch = bcrypt.compareSync(plainPassword, hash);
参数 | 说明 |
---|---|
saltRounds | 计算复杂度(迭代次数),建议值10-12,每+1时间消耗翻倍 |
hash | 加密结果字符串,包含算法版本、盐值、哈希值(格式:$2a$10$…) |
salt | 随机生成的字符串,确保相同密码哈希值不同 |
genSalt
自动生成,避免手动设置固定盐值Q:bcryptjs与bcrypt的区别?
A:bcryptjs纯JavaScript实现,兼容性更好;bcrypt依赖C++绑定,速度更快但安装可能需编译环境。
Q:哈希值包含哪些信息?
A:包含三部分:$2a$
表示算法版本,10$
表示迭代次数,剩余部分包含22字符的盐和31字符的哈希值。
Q:如何处理错误?
A:异步方法需在回调函数中检查err参数,同步方法建议使用try/catch。
await
+promisify
转换为Promise写法: import { promisify } from 'util'; const hashAsync = promisify(bcrypt.hash); const compareAsync = promisify(bcrypt.compare);
参考文献
- bcryptjs npm官方文档
- OWASP密码存储指南
- Node.js安全最佳实践