盐与密码

35 浏览
0 Comments

盐与密码

这个问题已经在这里有了答案:

可能是重复的:

PHP密码的安全哈希和盐

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


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

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

或者如果我只使用以下内容,是否可以:

$password = md5($password);

因为如果我使用了盐,即使用户制造一个像password这样的差密码,也无所谓,因为盐(在此情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975,所以他们的密码条目将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975password,根据http://howsecureismypassword.net/,它需要3千亿年才能破解...所以,你有什么看法?还是我该更糟糕,去

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

如果那个人已经走得足够远,以至于可以得到盐哈希,那么有什么能够阻止他们再走得更远吗?<更像是一个声明的最后一个密码


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

admin 更改状态以发布 2023年5月21日
0
0 Comments

你完全错误地使用了盐。盐应该是不可预测的;你的盐恰恰相反(固定的)。既然固定的哈希毫无益处,你似乎也认为攻击者不知道盐。这就是安全性通过模糊来实现的定义,这是另一种不好的做法。

你应该这样做:

  1. 使用不可预测的字符串作为盐,长度应该适中。从一个池中随机生成8个字符的字符串,如大小写字母和数字,就可以了。
  2. 为每个用户使用不同的盐,并在他们更改密码时更改它。
  3. 从已被认为是破解的MD5转移到另一个更适合该应用程序的哈希函数。 SHA-1更好,因为它没有被认为是破解的; bcrypt最好,因为它具有可配置的负载因子。
0
0 Comments

你应该将盐值改为针对每个用户的特定值,而不是系统范围的常量。这将使对密码哈希攻击的彩虹表攻击变得更加困难。

Troy Hunt在他的这篇文章中对盐的演变进行了良好的阐述。

Edit

$salt是与用户账户一起存储的一种独特的字节序列,可以为每个密码记录增加很大的熵。通常,这是一个随机的字节数组。

传统上是在salt + password的串联上进行哈希。

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

正如其他人所说,不要使用MD5进行哈希。它已经被攻破了。

在哈希之前对密码或盐应用其他专有算法是不推荐的。相反,应该考虑采用行业标准的解决方案,例如PBKDF2,除了盐之外,还需要进行许多重复的迭代(通常> 10k),这将进一步降低攻击者的速度。

如果采用OWASP指南,则应定期增加哈希次数(以抵消摩尔定律)。哈希次数还应该针对每个用户进行持久化存储,这意味着您需要存储哈希密码、盐和迭代次数的三重信息。

0