用于加密存储在 MySQL 数据库中的用户数据(如密码和其他安全数据)的 PHP 的 Md5 算法的最佳替代方案是什么?
6 回答
SHA512 不是一个糟糕的选择。但用不了多久它就会破解大多数长度的密码。接受杰夫的建议。使用bcrypt或PBKDF2。它们对 EC2 或其他并行处理技术具有抵抗力。可能不是免疫的,但有抵抗力。
在这种情况下,更好的哈希值不是更好的原因是ABC
在 MD5 中变为一个值,而ABC
在 SHA512 中变为一个值。SHA512计算所有 3 个字母的密码实际上比 MD5 更容易。关键是很难做到。这意味着一个缓慢的哈希,一个使用大量 RAM 的,和/或一个在 EC2 上无法轻松完成的哈希。
最好的选择是不再单独使用密码。确定您的站点是否真的需要登录,如果需要,请先尝试使用第三方提供商。如果这不是一个选项,请考虑来自 RSA 的密码 + 令牌。如果您没有其他可行的选择,请仅使用密码。
散列密码时,关键是散列(密码+盐),盐需要每个用户唯一,并且也应该很难或不可能猜到。使用用户名符合第一个标准,并且比没有盐或每个用户使用相同的盐要好,但每个用户使用唯一的随机盐是更好的选择。理想情况下,在一个单独的数据库中,如果不是位置,具有自己的凭据。它也应该不是在用户名上键入,而是在 user_id 甚至是 user_id 的哈希上。您希望该数据库是 SQL 注入证明。不接受未经哈希处理的用户输入是一种很好的方法。明智的做法是让查询本身进行哈希处理。慢的?是的,这也是一件好事。
盐本身应该包含它可以获得的所有难以预测的数据。用户名 + 用户 ID + 时间戳 + 来自 dev/urandom 的垃圾 + 带有 taco 字样的最新推文。越长越好。SHA512 在这里是一个不错的哈希选择。
总结:hash = bcrypt(password + salt), salt = sha512(username + user_id + timestamp + microtimestamp + dev/urandom bits + other noise)。
如果您在所有这些之后仍然担心。随意对 bcrypted 密码进行 SHA512 处理。您将获得 SHA512 的强度,它在破解时只会显示更难以暴力破解的 bcrypted 哈希。
试试 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
MD5 确实不推荐了。大多数 php 安装都包含hash
扩展。目前散列函数的最佳选择是 SHA-512。您可以使用具有以下功能的 SHA-512:
<?php
function sha512($string) {
return hash('sha512', $string);
}
?>
如果您愿意,还有其他输出尺寸较小的替代方案,例如SHA-256
或RIPEMD-160
。
更新:阅读您更新的问题,我建议使用 php crypt函数。
你可以像这样使用散列,你有很多算法来散列你的数据。
hash('sha256', $data);
MCrypt提供了许多更安全的方法(以及 md5 本身,顺便说一句)。