0

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

回答

1

密码认证需要一秒多的时间?

如果您的用户能够容忍它,那么不是这样,但我认为几百毫秒就足够了。有关更具体的问题,请参见this excellent answer

如果我的服务器有8GB的内存,使用1GB的散列内存开销太高?

我不希望你的密码哈希策略需要接近那么多的内存。散列通常是CPU /计算限制任务。

+0

感谢您的评论。 Argon2是一种内存硬件功能,除了时间成本和并行性之外,还允许您指定内存开销参数,这就是为什么我想知道我可以合理地致力于多少内存散列。 – user3607758

+0

啊,如果你正在挑选一个任意数量的内存来使用,那么“多少太多”将取决于其他因素,例如你在最高负载下可以节省多少内存。 1GB似乎过度。它看起来像Argon2的CLI默认值是4096KiB。 –