用于加密用户数据(如存储在MySQL数据库中的密码和其他安全数据)的Md5算法的最佳替代方法是什么?
答案 0 :(得分:13)
SHA512不是一个糟糕的选择。但是不久之后它就会破解大多数密码。以Jeff's Advice为准。使用bcrypt或PBKDF2。它们对EC2或其他并行处理技术具有抵抗力。可能没有免疫力,但有抗药性。
在这种情况下,更好的散列不是更好的原因是MD5中的ABC
变为一个值,SHA512中的ABC
变为一个值。计算所有3个字母的密码为actually easier for SHA512 than it was for MD5。关键是很难做到。这意味着一个缓慢的哈希,一个使用大量RAM,和/或一个在EC2上不能轻易完成的哈希。
最好的选择是不再单独使用密码。确定您的网站是否真的需要登录,如果是,请先尝试使用第三方提供商。如果这不是一个选项,请考虑来自RSA的密码+令牌。如果您没有其他可行选项,请仅使用密码。
当对密码进行散列时,关键是散列(密码+盐),并且每个用户的盐需要是唯一的,并且也应该很难或无法猜测。使用用户名符合第一个标准,并且优于不使用盐或每个用户使用相同的盐,但每个用户的独特随机盐是更好的选择。理想情况下,在单独的数据库中,如果不是位置,则使用自己的凭据。它也应该不是键入用户名,而是键入user_id或甚至是user_id的哈希。您希望该数据库是SQL注入证明。不接受来自没有散列的用户的输入是一种很好的方法。你最好让查询本身进行散列。慢?是的,这也是一件好事。
盐本身应该包含它可以获得的所有难以预测的数据。用户名+用户ID +时间戳+来自dev / urandom的垃圾+最新的推文,其中包含单词taco。越长越好。 SHA512是哈希的一个很好的选择。
摘要:hash = bcrypt(密码+盐),salt = sha512(用户名+ user_id + timestamp + microtimestamp + dev / urandom bits +其他噪音)。
如果你仍然担心这一切。随意使用SHA512密码。你将获得SHA512的优势,当破解时只会显示出更难以强制加密的哈希值。
答案 1 :(得分:8)
尝试使用php hash()函数http://php.net/manual/en/book.hash.php
示例代码:
$hash = hash('SHA512', $pass);
这转变了这个:
SHA512("The quick brown fox jumps over the lazy dog")
分为:
0x07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6
答案 2 :(得分:3)
确实不推荐使用MD5。大多数php安装都包含hash
扩展名。哈希函数的最佳选择目前是SHA-512。您可以将SHA-512与以下功能一起使用:
<?php
function sha512($string) {
return hash('sha512', $string);
}
?>
如果您愿意,还可以选择输出尺寸较小的其他选项,例如SHA-256
或RIPEMD-160
。
更新:阅读更新的问题,我建议使用php crypt功能。
答案 3 :(得分:1)
你可以像这样使用hash,你有足够的算法来散列你的数据。
hash('sha256', $data);
答案 4 :(得分:0)
MCrypt提供了许多更安全的方法(以及md5本身,btw)。
答案 5 :(得分:0)