我在做的是有一个存储用户凭证(电子邮件,用户名和密码)的系统MySQL数据库,并且在使用加密,腌制和加密类型时看到了相互冲突的观点。
你会推荐什么最好的方法?编码在MD5或SHA1?腌制还是不腌制?只加密密码或全部3个元素?
我在做的是有一个存储用户凭证(电子邮件,用户名和密码)的系统MySQL数据库,并且在使用加密,腌制和加密类型时看到了相互冲突的观点。
你会推荐什么最好的方法?编码在MD5或SHA1?腌制还是不腌制?只加密密码或全部3个元素?
对于密码哈希使用PBKDF2这是NIST approved。对于每个密码和非平凡(超过1000)迭代计数,您应该使用随机非秘密盐。
对于用户名和电子邮件,可能不值得加密。
密码应该用强盐(MD5或SHA1很好)散列来保护,以防止使用彩虹表进行攻击。
你不应该散列电子邮件地址 - 只要你散列它,除了检查用户输入的内容之外,你无法将它用于其他任何事情,因此,如果散列会阻止你通过电子邮件发送该人。同样,用户名最好以纯文本形式存储,以便识别该用户。
请不要使用MD5或SHA1。它们都是密码破解的。 –
它只是真正的密码,你需要加密。实际上,你应该在至少 SHA-256真的(我敢肯定MD5和SHA1是可破解的)算法Hashing
(这就是你说的编码时的意思)和Salting
你的密码是额外的安全。
这里是上存储他们的首选方法的答案:Preferred Method of Storing Passwords In Database
用户名和电子邮件不应该被加密,你需要他们的明文,他们会更加有用的方式。
至于密码:他们应该绝对加密或散列,最好用盐。到目前为止,我使用了一种有趣的技术来做到这一点:AES,密钥本身就是密钥。因此,如果用户将他的密码设置为“blabla123”,那么我将通过调用AES_ENCRYPT('blabla123', 'blabla123')
将其存储在MySQL中。有2个优势是:
然后通过加密用户键入的内容和比较2个值来完成有效性。
我喜欢这个... –
我也喜欢这种方法!如果你采用这种方法,是否值得腌制? –
@PhilFaceplantYoung,我想你会想吃这个。这是开放的彩虹袭击没有盐。 –
最佳实践IMO是:
使用哈希算法如SHA256或SHA512。 MD5现在不安全,因为您可以反转散列/执行彩虹攻击。
使用强盐来确保攻击者无法猜测常见的散列密码,如果他们获得了进入数据库的权限。
请勿使用加密。
只有散列的密码,用户名和电子邮件都是纯文本。
+1哈希电子邮件和用户名将是艰难的,因为他们通常不是案件敏感。 –
这不是正确的答案。您想要使用适当的密码散列函数,例如PBKDF2或bcrypt。 – imichaelmiers
@imichaelmiers - 这并不意味着我的回答不正确。您推荐使用更强大的散列函数,但SHA256和512仍然有效,因为没有发现散列冲突。 –
+1对于PBKDF2好得多,尽管当性能不是问题时我通常使用10,000次迭代;) 举例:http://csharptest.net/470/another -a-how-to-store-a-salted-password-hash/ –
@ csharptest.net我同意你的迭代计数,很好的例子。 – jbtule