【问题标题】:bcrypt compare takes more than a minute to completebcrypt 比较需要一分钟以上才能完成
【发布时间】:2020-01-11 11:03:06
【问题描述】:

我刚刚为我的 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);

我知道比较功能应该很慢以帮助抵御暴力攻击。但是比较功能需要一分钟多的时间才能完成。用户不会等待完成。那么我的代码有问题吗?

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 这与暴力无关。此外,代码不应该花时间来比较。查询时间检查了吗?
  • 是的,调试器会立即跳转到密码比较。但随后需要一分钟才能继续前进。整个 HTTP 调用耗时 1 分 4 秒(我用 postman 测试过)
  • 你有源文件吗?
  • 是的,这是登录github.com/matthiashermsen/nest-api/blob/master/src/…时执行的代码
  • 顺便说一句。如果你想玩,这是我的 .env 文件配置SERVER_PORT = 3000 DATABASE_TYPE = postgres DATABASE_HOST = localhost DATABASE_PORT = 5432 DATABASE_USERNAME = postgres DATABASE_PASSWORD = postgres DATABASE_NAME = api DATABASE_LOGGING = true DATABASE_SYNCHRONIZE = true NODE_ENV = development AUTHENTICATION_SALT_ROUNDS = 12 TOKEN_SECRET = secret TOKEN_EXPIRATION_IN_SECONDS = 36000

标签: node.js bcrypt


【解决方案1】:

成本为 12 的 bcrypt 在任何真实计算机上花费的时间不应超过 1 秒。

这一定意味着你使用的 bcrypt 实现写得不是很好。

检查它是否不是 bcrypt 的好方法,尝试不同费用的调用:

Cost Duration
3 67 ms
4 135 ms
5 270 ms
6 560 ms
7 1,130 ms
8 3,250 ms
9 7,500 ms
10 15,000 ms
11 30,000 ms
12 60,000 ms

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2013-05-08
    • 2018-05-20
    相关资源
    最近更新 更多