我目前正在从事一个涉及存储和验证密码的项目。密码经过 100,000 次迭代散列,然后持久化到数据库,稍后在用户登录时检索并验证。它运行良好,因为在低负载期间,散列需要大约 1 秒来生成,并且大多数用户发现延迟可以接受。
问题是随着系统获得越来越多的用户(约 100 个并发),哈希现在正在使 cpu 最大化并需要超过 6 秒才能生成 - 这导致登录时间非常慢,不幸的是系统有无状态需要在每次调用时验证密码的 api。
据我了解,我们希望使哈希计算成本高昂以避免强力攻击,但鉴于攻击者不太可能访问我们的内存转储然后访问数据库,我正在考虑在之后实施折衷方案成功登录后,我将以较少的迭代次数(例如,5000)对密码进行哈希处理,并将其存储在内存中一小段时间。如果有请求想要验证相同的用户 ID,我会使用内存中安全性较低的版本进行验证,否则我会使用数据库中更安全的版本。这可以防止通过访问我们的数据库 bruce 强制我们的数据库的攻击,并且在高负载情况下,大多数请求都可以通过内存中较便宜的哈希来满足。
我意识到这不太安全,但这是一个合理的权衡吗?有什么我应该注意的问题吗?
阿德里安