2012-05-01 278 views
15

可能重复:
Secure hash and salt for PHP passwords最佳实践

我在做的是有一个存储用户凭证(电子邮件,用户名和密码)的系统MySQL数据库,并且在使用加密,腌制和加密类型时看到了相互冲突的观点。

你会推荐什么最好的方法?编码在MD5或SHA1?腌制还是不腌制?只加密密码或全部3个元素?

回答

11

对于密码哈希使用PBKDF2这是NIST approved。对于每个密码和非平凡(超过1000)迭代计数,您应该使用随机非秘密盐。

对于用户名和电子邮件,可能不值得加密。

+1

+1对于PBKDF2好得多,尽管当性能不是问题时我通常使用10,000次迭代;) 举例:http://csharptest.net/470/another -a-how-to-store-a-salted-password-hash/ –

+0

@ csharptest.net我同意你的迭代计数,很好的例子。 – jbtule

0

密码应该用强盐(MD5或SHA1很好)散列来保护,以防止使用彩虹表进行攻击。

你不应该散列电子邮件地址 - 只要你散列它,除了检查用户输入的内容之外,你无法将它用于其他任何事情,因此,如果散列会阻止你通过电子邮件发送该人。同样,用户名最好以纯文本形式存储,以便识别该用户。

+1

请不要使用MD5或SHA1。它们都是密码破解的。 –

2

它只是真正的密码,你需要加密。实际上,你应该在至少 SHA-256真的(我敢肯定MD5和SHA1是可破解的)算法Hashing(这就是你说的编码时的意思)Salting你的密码是额外的安全。

这里是上存储他们的首选方法的答案:Preferred Method of Storing Passwords In Database

1

用户名和电子邮件不应该被加密,你需要他们的明文,他们会更加有用的方式。

至于密码:他们应该绝对加密或散列,最好用盐。到目前为止,我使用了一种有趣的技术来做到这一点:AES,密钥本身就是密钥。因此,如果用户将他的密码设置为“blabla123”,那么我将通过调用AES_ENCRYPT('blabla123', 'blabla123')将其存储在MySQL中。有2个优势是:

  • 你不存储加密密钥的任何地方
  • 每个密码使用不同的密钥进行加密。所以,即使你确定了一把钥匙,它的用处也会受到限制。

然后通过加密用户键入的内容和比较2个值来完成有效性。

+0

我喜欢这个... –

+0

我也喜欢这种方法!如果你采用这种方法,是否值得腌制? –

+1

@PhilFaceplantYoung,我想你会想吃这个。这是开放的彩虹袭击没有盐。 –

6

最佳实践IMO是:

  • 使用哈希算法如SHA256或SHA512。 MD5现在不安全,因为您可以反转散列/执行彩虹攻击。

  • 使用强盐来确保攻击者无法猜测常见的散列密码,如果他们获得了进入数据库的权限。

  • 请勿使用加密。

  • 只有散列的密码,用户名和电子邮件都是纯文本。

+0

+1哈希电子邮件和用户名将是艰难的,因为他们通常不是案件敏感。 –

+1

这不是正确的答案。您想要使用适当的密码散列函数,例如PBKDF2或bcrypt。 – imichaelmiers

+0

@imichaelmiers - 这并不意味着我的回答不正确。您推荐使用更强大的散列函数,但SHA256和512仍然有效,因为没有发现散列冲突。 –