盐和密码

2022-08-30 18:22:32

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

警告不要使用MD5作为密码,使用像bcrypt这样的替代方案


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

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

或者如果我只是使用:

$password = md5($password);

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

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

如果这个人已经走得足够远,得到了盐哈希,那么有任何东西能够阻止然后继续前进吗?< 更多声明这最后一个密码


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


答案 1

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

特洛伊·亨特(Troy Hunt)在这篇文章中有一篇关于腌制演变的很好的文章。

编辑

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

散列传统上是在 + 的串联上完成的。saltpassword

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

正如其他人所说,不要使用MD5进行哈希处理。它坏了。

不建议在散列之前将其他专有算法应用于密码或 salt。相反,看看像PBKDF2这样的行业实力解决方案,除了腌制之外,它还需要多次(通常>10k)重复迭代,这将进一步减慢攻击者的速度。

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


答案 2

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

你应该做的是:

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

推荐