我刚刚为 REST API 实现了用户身份验证,并使用 bcrypt 进行密码哈希处理。创建用户时我基本上会这样做
const passwordSalt: string = await genSalt(12);
const passwordHash: string = await hash('pAsSwOrD', passwordSalt);
并将哈希值保存到数据库中。稍后,当用户登录时,我会将提供的密码与数据库密码哈希进行比较。
const passwordMatches: boolean = await compare('wRoNg pAsSwOrD', user.passwordHash);
我知道比较函数应该很慢,以帮助抵御暴力攻击。但比较功能需要一分多钟才能完成。用户不会等待它完成。那么我的代码有问题吗?
如果您需要更多信息,请告诉我。
成本为 12 的 bcrypt 在任何真实计算机上花费的时间不应超过 1 秒。
这一定意味着您正在使用的 bcrypt 实现写得不是很好。
检查它不是 bcrypt 的好方法,尝试使用不同成本的调用:
成本 | 持续时间 |
---|---|
3 | 67 毫秒 |
4 | 135 毫秒 |
5 | 270 毫秒 |
6 | 560 毫秒 |
7 | 1,130 毫秒 |
8 | 3,250 毫秒 |
9 | 7,500 毫秒 |
10 | 15,000 毫秒 |
11 | 30,000 毫秒 |
12 | 60,000 毫秒 |
少用盐,如 2 至 5 圈。
const saltRounds = 2;