以下是 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
功能相同,但同步执行)。 - 返回值:布尔值。
最佳实践
- 避免手动生成盐:直接通过
bcrypt.hash(password, saltRounds)
自动处理盐的生成。 - 调整 rounds 值:根据服务器性能设置合适的 rounds(如
10-12
),数值越高加密越慢但更安全。 - 错误处理:在异步操作中使用
try-catch
捕获异常。 - 不存储明文密码:始终存储哈希值而非原始密码。
在 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 模块或处理其他场景,可以告诉我具体需求!