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