关于php:盐和密码

Salt and passwords

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Secure hash and salt for PHP passwords

警告:不要将MD5用于密码,请使用类似bcrypt的替代方法

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

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

或者如果我只是使用:

1
$password = md5($password);

因为如果我使用salt,即使用户编了一个像password这样的坏密码,也没关系,因为salt(在本例中)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975,所以输入该密码的条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password,根据http://howsecureismypassword.net/,破解该密码需要花费10年的时间……那么意见呢?或者我应该更糟再去

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

如果这个人走得够远去拿盐土豆泥,有没有什么能阻止他走得更远呢?<这最后一个密码的更多语句

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


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

特洛伊·亨特在这篇文章中对盐渍的演变有一个很好的描述。

编辑

$salt每个密码记录都有其独特之处,这给它增加了许多熵。这通常是一个随机的字节序列,存储在用户帐户中。

哈希传统上是在saltpassword的串联上进行的。

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

正如其他人所说,不要使用MD5进行散列。它坏了。

不建议在散列之前对密码或salt应用其他专有算法。相反,请看一个行业级解决方案,如pbkdf2,它除了盐化之外,还需要多次(通常大于10 k)重复迭代,这将进一步减慢攻击者的速度。

如果采用OWASP准则,则应定期增加执行的哈希数(以抵消摩尔定律)。每个用户的哈希数也应该保持不变,这意味着您需要存储哈希密码、salt和迭代次数的三倍。


你用盐完全不正确。盐应该是不可预测的;你的盐正好相反(固定的)。由于固定散列绝对没有好处,因此您似乎还指望攻击者不知道的盐。这是通过默默无闻来定义安全,这是另一个不好的做法。

你应该做的是:

  • 使用长度合理的不可预测字符串作为盐。从池中随机生成的8个字符的字符串(如小写/大写字母和数字)很好。
  • 为每个用户使用不同的salt,并在每次更改密码时更改它。
  • 从MD5(被认为是坏的)移动到另一个更适合此应用程序的哈希函数。sha-1更好,因为它不被认为是坏的;bcrypt是最好的,因为它有一个可配置的负载系数。

  • 不要使用MD5作为散列算法,使用更安全的方法,如SHA256甚至bcrypt

  • 当然,如果有人进入了你的数据库,他们将无法逆转普通散列的密码或使用彩虹攻击等技术。

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

    http://en.wikipedia.org/wiki/bcrypt网站


    首先,您不应该直接存储MD5,您已经重新登录了它。php 5.5将引入新的方法,以便在一行中轻松地创建和验证密码,在此之前,您可以使用https://github.com/ircmaxell/password_compat(向前兼容)来生成和验证安全密码哈希。


    我想这里对盐的理解是错误的。盐的概念是每个哈希都应该是唯一的。原因是,创建哈希时,某些不同的字符串可能具有相同的哈希。

    在您的示例中,您也在散列密码,因此它看起来不会像:145ac26ff093c6e1317f7d5fb4c9fd11c77be975password

    P.S.使用BCRYPT。它更可靠。


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

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

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

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