验证密码的快速但安全的方法?

时间:2013-09-02 19:48:13

标签: c# security bcrypt bcrypt.net

我让客户端通过互联网连接到服务器(WCF)。

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

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

要验证我:

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

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

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

2 个答案:

答案 0 :(得分:4)

是的,验证必须密集。实际上,验证比原始一代密集更重要。 (很难看出你如何进行廉价的生成和昂贵的验证,但这没关系。)

关键是如果验证密码便宜,那么攻击者可以快速检查批次密码。但是,如果您确认每次猜测的成本都很高,那么应用暴力破解密码就不那么可行了。

即使验证相对昂贵,但在正常应用程序的操作中仍然不太可能是非常重要的成本,除非您受到攻击(此时您不会< em>希望快速验证事情。如果您获得足够的合法登录尝试以使您的服务器闯入任何形式的汗水,这表明您已经拥有足够的用户,您可能有可能在某种程度上扩展...

答案 1 :(得分:1)

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

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

查看Salted Challenge Response Authentication Mechanism (SCRAM),它提供了一种机制,在客户端和服务器之间进行验证,客户端解除了重要部分。