8

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

4

6 回答 6

13

SHA512 不是一个糟糕的选择。但用不了多久它就会破解大多数长度的密码。接受杰夫的建议。使用bcryptPBKDF2。它们对 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 哈希。

于 2012-04-12T14:25:21.777 回答
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

于 2012-04-12T14:12:05.420 回答
4

MD5 确实不推荐了。大多数 php 安装都包含hash扩展。目前散列函数的最佳选择是 SHA-512。您可以使用具有以下功能的 SHA-512:

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

如果您愿意,还有其他输出尺寸较小的替代方案,例如SHA-256RIPEMD-160

更新:阅读您更新的问题,我建议使用 php crypt函数。

于 2012-04-12T14:10:47.557 回答
1

你可以像这样使用散列,你有很多算法来散列你的数据。

hash('sha256', $data);
于 2012-04-12T14:09:58.843 回答
0

MCrypt提供了许多更安全的方法(以及 md5 本身,顺便说一句)。

于 2012-04-12T14:08:26.437 回答
0

我建议去阅读散列函数。您也可以阅读有关Mcrypt的信息。我猜这是目前最好的哈希值。Mcrypt 提供基于 CPU 周期的散列。

于 2012-04-12T14:08:52.417 回答