用于在MySQL表中存储用户密码的最佳PHP散列方法?

时间:2011-06-24 19:14:13

标签: php mysql encryption passwords

我一直在阅读Stack Overflow问题大约15分钟,而且每一个问题似乎都与我之前读过的问题相矛盾。 Bcrypt,SHA1,MD5等。我目前MD5是我的密码,但我希望在发生破坏时让我的数据库更安全。

我知道这已被问了一百万次,但我似乎无法在其他任何地方找到合适的答案。

感谢。

6 个答案:

答案 0 :(得分:11)

你看到矛盾的答案是因为没有正确的答案。您应该使用应用程序可以支持的最安全的方法。更安全=更多开销。

MD5已被打破并破获。

根据this article,SHA1已被破坏。但它还没有被破解。

bcrypt(据我所知)没有被发现被打破。

如果有足够的CPU周期,最终可以规避任何散列或加密算法。您的决定应该平衡数据的安全性和应用程序的性能。

鉴于这些警告,bcrypt目前是事实上的标准。它专为强度而非速度而设计,并且不会被打破。有关bcrypt的信息索引,请参阅bcrypt article on Wikipedia

答案 1 :(得分:9)

我会选择bcrypt。它大大降低了生成彩虹表的能力。

http://codahale.com/how-to-safely-store-a-password/

  

重要的是要注意盐对于防止字典攻击或暴力攻击是无用的。您可以使用大盐或许多盐或手工采摘,遮荫种植,有机喜马拉雅粉红盐。考虑到数据库中的哈希值和盐,它不会影响攻击者尝试候选密码的速度。

答案 2 :(得分:2)

首先,MD5现在不是一个很好的选择。如果攻击者进入你的数据库并获得MD5哈希值,那几乎可以肯定他也能够破解它们。 MD5的弱密码哈希值甚至可以通过休闲计算机破解。

你应该谷歌一些关于盐化哈希的文章,并使用该方法结合更强的哈希算法(至少SHA1),并且可能重复几次这个过程。

我不会写关于salting的文章,因为很多文章已经写过了,而且在Stack Overflow上你可以找到很多关于这个问题的好讨论。 例如。  Why do salts make dictionary attacks 'impossible'? 要么  How does password salt help against a rainbow table attack?

答案 3 :(得分:1)

使用MD5,SHA1或SALT所需的任何加密。

对于这个例子,我只是为了解释而使用MD5。

因此用户选择密码,例如将其存储在$ password中。

现在创建一个特定于您的应用程序的salt。

$salt = 'my very own salt'; // or maybe make a random string for your salt

然后做

$more_difficult_password = md5($salt . $password);

这样一来,如果MD5字符串以某种方式受到损害,人们就不能使用字典攻击。

答案 4 :(得分:1)

当用户注册时,使用例如以下函数创建随机salt

$bytes = 50;
$salt = base64_encode(openssl_random_pseudo_bytes($bytes));

将其存储在数据库表中。最好的方法是将其存储在外部数据库中。在此之后,创建一个随机代码并将其与salt一起存储到外部数据库中。比将随机代码存储在用户表中,攻击者几乎不可能找到你的盐。

在此之后,以这种方式存储您的密码:

$password_to_store_in_mysql = hash('sha512', $salt . $user_password);

当用户登录时,从外部数据库中取出盐,检查盐和密码是否匹配。

答案 5 :(得分:0)

您可以使用您的密码来使用您网站的密钥和每个用户的特定盐。您的网站密钥应保存在您的数据库中,然后获取并使用。

组合成为。

$secret = "your key from database";
$salt = "user salt";// make it randomly
$password = $_POST['password'];

$new_pass = md5($secret.$salt.$password);

现在这种组合将存储在数据库中。

在登录时,再次使用此组合进行匹配。

我认为它可以帮助您更好地保护您的应用程序。

干杯.. !!