在数据库中存储密码哈希值

时间:2010-08-17 06:15:11

标签: security web-applications encryption

今天我提出了一个关于Web应用程序约定的问题。

为了安全起见,如果我们存储用户的密码,我们很可能正在加密它(使用MD5,SHA-1等)并存储消化哈希以使它们难以或不可能反转。 / p>

今天有许多彩虹表是通常的A-Za-z0-9序列的查找表,最多6个字符或广泛使用的密码。假设你是MD5一次用户密码并将哈希作为密码存储在数据库中,而且有一天黑客会破坏你的数据库,现在他们有很多md5哈希和电子邮件地址。当然他们会查找密码,当他们得到预先编制的匹配时,他们会尝试登录该用户的电子邮件帐户。

这可以通过消化消息两次或简单地将其反转来轻松解决。但是我想知道关于这个问题的惯例是什么以及(据你所知)企业应用程序或巨头(Facebook,Google)如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

您使用的是所谓的 salt 。在散列之前添加一些您组成的字符串。在检查密码时也要预先添加。这是一个应用程序范围的字符串。这使得通过彩虹桌查找起来更加困难。

所以如果你的盐是“kdi37s !!”将其保存在db md5(kdi37s!!P@$$w3rd)中并在检查时执行相同操作。

答案 1 :(得分:3)

使用一点salt并使用sha1左右进行哈希。

答案 2 :(得分:2)

结帐PBKDF2,这是正确方式之一。

答案 3 :(得分:2)

如果您使用BCrypt和salt(使用blowfish分组密码)等算法,则可以使您的数据库对brute force攻击非常安全。当然,您希望要求您的用户在密码中具有合理的复杂程度,如果用户的密码为a,则不需要花费很长时间来猜测它。

如果攻击者获得了您的数据库的副本,那么只能尝试10秒左右的密码将意味着需要很长时间才能获得任何密码。如果您担心摩尔定律,并希望将来证明这一点,您可以指定成本并使算法更慢。

纯SHA / X或MD5密码哈希的问题在于,通过设计这些算法非常快,这使得它对暴力攻击非常敏感。当然,如果你没有为哈希加盐,那么有大量的rainbow tables会破坏你的数据库中的所有密码。