23

可能重复:
PHP 密码的安全哈希和盐

警告不要使用 MD5 作为密码,使用 bcrypt 之类的替代方法


对于我的密码,我应该像这样使用盐吗(盐对每个用户都是唯一的,而不是直接与密码一起存储)......

$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);

或者如果我只是使用它可以吗:

$password = md5($password);

因为如果我使用了salt,即使用户编造了一个像密码这样的错误密码也没关系,因为salt(在这种情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975这样的密码条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password根据http://howsecureismypassword.net/它需要3个octodecillion年才能破解....所以意见?或者我应该更糟然后去

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

如果这个人已经走得足够远,可以得到盐哈希,还有什么可以阻止然后继续前进吗?< 更多的声明这最后一个密码


对于每个说我应该为每个用户做的人......我知道,这只是一个例子。

4

6 回答 6

13

您完全错误地使用了盐。盐应该是不可预测的;你的盐正好相反(固定)。由于固定哈希绝对没有任何好处,因此您似乎还指望攻击者不知道盐。这是通过默默无闻来定义安全性,这是另一种不好的做法。

你应该做的是:

  1. 使用不可预测的合理长度的字符串作为盐。从池中随机生成 8 个字符的字符串,例如小写/大写字母和数字都可以。
  2. 为每个用户使用不同的盐,并在他们每次更改密码时更改它。
  3. 从 MD5(被认为是损坏的)转移到另一个更适合此应用程序的哈希函数。SHA-1 更好,因为它不被认为是损坏的;bcrypt是最好的,因为它具有可配置的负载因子。
于 2012-10-04T10:10:00.933 回答
13

您应该更改盐,使其特定于每个用户,而不是系统范围的常量。这将使针对您的密码哈希的彩虹表攻击更加不方便。

在Troy Hunt的这篇文章中,有一篇很好的关于盐渍演变的文章。

编辑

$salt每个密码记录都有一些独特的东西,这增加了很多熵。这通常是一个随机的字节序列,与用户帐户一起存储。

散列传统上是在salt+的连接上完成的password

$passwordHash = hash($salt.$password);

正如其他人所说,不要使用 MD5 进行散列。它被打破。

不建议在散列之前对密码或盐应用额外的专有算法。相反,请查看诸如PBKDF2之类的行业实力解决方案,除了盐渍之外,它还需要多次(通常 > 10k)重复迭代,这将进一步减慢攻击者的速度。

如果您采用OWASP 指南,则应定期增加执行的哈希数(以抵消摩尔定律)。每个用户还应该保留哈希的数量,这意味着您需要存储哈希密码、盐和迭代次数的三元组。

于 2012-10-04T10:11:37.750 回答
9
  1. 不要MD5用作您的散列算法,使用更安全的东西,例如SHA256或什至bcrypt.

  2. 一定要对密码加盐,如果有人确实进入了您的数据库,他们将无法反转常见哈希的密码或使用彩虹攻击等技术。

http://michaelwright.me/php-password-storage

http://en.wikipedia.org/wiki/Bcrypt

于 2012-10-04T10:12:07.610 回答
4

首先,您永远不应该直接存储您已经识别的 md5。PHP 5.5 将带来在 1 行中轻松创建和验证密码的新方法,在此之前,您可以使用https://github.com/ircmaxell/password_compat(向前兼容)来生成和验证安全密码哈希。

于 2012-10-04T10:14:18.470 回答
3

我认为盐在这里的理解不正确。盐的想法是每个哈希应该是唯一的。原因是当您创建散列时,一些不同的字符串可能具有相同的散列。

在您的示例中,您也在对密码进行哈希处理,因此它看起来不会像:145ac26ff093c6e1317f7d5fb4c9fd11c77be975password

PS使用bcrypt。它更可靠。

于 2012-10-04T10:12:28.093 回答
1

盐是完全随机的,与您存储哈希的实际密码无关。

你真正应该做的是生成一个完全随机的盐,然后做

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

并存储用户的用户名、盐和哈希密码。

于 2012-10-04T10:12:11.663 回答