密码验证需要多长时间?

How long should password authentication take?

我知道在数据库中存储密码时,最好使用慢速哈希函数,例如 bcrypt、scrypt 或 argon2。我读过的大多数关于选择参数(例如时间和内存成本)的文档都建议将值设置得尽可能高,以在攻击者获得对您的数据库的访问权限时阻止密码破解尝试。我的问题是在 Web 应用程序中对用户进行身份验证时,什么样的资源消耗是可以接受的?我知道这个问题的答案会根据执行身份验证的服务器的规格、身份验证发生的频率等因素而有所不同,但我想得到一些关于什么是合理的,什么是不合理的一般性建议。吨。密码验证花费一秒钟是否太长?如果我的服务器有 8GB 内存,使用 1GB 的哈希内存成本是否太高?我希望有问题的应用程序只会偶尔执行密码身份验证,因为它对大多数请求使用基于令牌的身份验证。

Is taking one second for password authentication too long?

如果您的用户能够容忍,则不会,但我认为几百毫秒应该足够了。请参阅 this excellent answer 了解更具体的问题。

If my server has 8GB of memory, is using 1GB for the hash memory cost too high?

我不希望您的密码散列策略需要那么多内存。哈希通常是一项 CPU/compute-bound 任务。