PHP中的Md5替代品?

时间:2012-04-12 14:06:20

标签: php security encryption md5

用于加密用户数据(如存储在MySQL数据库中的密码和其他安全数据)的Md5算法的最佳替代方法是什么?

6 个答案:

答案 0 :(得分:13)

SHA512不是一个糟糕的选择。但是不久之后它就会破解大多数密码。以Jeff's Advice为准。使用bcryptPBKDF2。它们对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

进一步阅读: http://en.wikipedia.org/wiki/SHA-2

答案 2 :(得分:3)

确实不推荐使用MD5。大多数php安装都包含hash扩展名。哈希函数的最佳选择目前是SHA-512。您可以将SHA-512与以下功能一起使用:

<?php
    function sha512($string) {
        return hash('sha512', $string);
    }
?>

如果您愿意,还可以选择输出尺寸较小的其他选项,例如SHA-256RIPEMD-160

更新:阅读更新的问题,我建议使用php crypt功能。

答案 3 :(得分:1)

你可以像这样使用hash,你有足够的算法来散列你的数据。

hash('sha256', $data);

答案 4 :(得分:0)

MCrypt提供了许多更安全的方法(以及md5本身,btw)。

答案 5 :(得分:0)

我建议您阅读有关hash功能的内容。您也可以阅读Mcrypt。这是我猜的最好的哈希事情。 Mcrypt根据CPU周期提供散列。