1

我有客户端通过 Internet ( WCF) 连接到服务器。

要计算要保存在我当前使用的数据库中的哈希值:

var hash = BCrypt.HashPassword(password, 13);

为了验证它,我这样做:

var isApproved = BCrypt.Verify(passwordFromUser, hashFromDatabase);

哈希的生成必须是计算密集型的,是的。但是验证也必须是密集的?

没有安全但更快的方法来验证用户(它是在服务器上完成的)?

4

2 回答 2

4

是的,验证必须是密集的。确实,验证比原始一代更重要。(很难看出您将如何获得廉价的生成和昂贵的验证,但这没关系。)

关键是,如果验证密码的成本很低,那么攻击者可以快速检查大量密码。但是,如果您验证每个猜测的成本很高,那么使用蛮力破解密码就变得不那么可行了。

尽管验证相对昂贵,但它在正常应用程序的运行中仍然不太可能是非常大的成本,除非您受到攻击(此时您不想快速验证事物)。如果您获得足够多的合法登录尝试,导致您的服务器出现任何类型的问题,这表明您有足够的用户,您可能能够承受一定程度的扩展......

于 2013-09-02T19:54:01.793 回答
1

验证必须是计算密集型的,因此当密码数据库被盗时,通过快速检查大量密码来恢复密码的成本很高,正如 Jon Skeet 所解释的那样。

但是,在正常操作中,当客户端通过 Internet 连接到您的服务器时,您可以通过限制来自客户端的身份验证尝试的速率来防止攻击者检查大量密码。在这种情况下,服务器需要执行昂贵的验证有点不可取,因为服务器是“好人”。

看看Salted Challenge Response Authentication Mechanism (SCRAM),它提供了一种机制,其中验证在客户端和服务器之间进行拆分,客户端承担重任。

于 2013-09-02T20:16:39.967 回答