【问题标题】:How should I incorporate the salt in my password hash?我应该如何在我的密码哈希中加入盐?
【发布时间】:2011-01-03 19:43:04
【问题描述】:

会强多少

return sha1($salt.sha1($passwd));

被比作:

return sha1($salt.$passwd);

$salt 是长度为 12 的每个用户字符串,由强随机 ASCII 组成。

【问题讨论】:

  • 我可能弄错了,但是为什么密码的哈希值应该比密码的哈希值更弱呢?也就是说,只要散列算法做它宣传的事情。如果它没有,那么你根本不应该使用它,无论多么频繁。

标签: php security hash salt


【解决方案1】:

乍一看,如果没有深厚的加密知识,我会说它一点也不强大。

顺便说一下,通常建议使用

sha1($login.$salt.$passwd);

这样两个密码相同的用户就不会拥有相同的哈希值。

【讨论】:

  • 在哈希中包含登录名解决了一个问题,但又引入了另一个问题。现在用户无法更改他/她的登录名,因为它会破坏哈希并且无法重新计算哈希,因为我们不知道用户的密码。
  • 解决方案是生成每个用户的盐。
  • @Asaph - 我想说像更改用户名这样的重大更改应该要求他们输入密码以确认,无论如何。这样一来,您就可以使用它来重新创建哈希,并且如果其他用户在公共计算机上保持会话打开,则其他用户无法更改其用户名等重要内容。
  • 盐的定义是它是随机的(每个用户随机),所以在字符串前面加上登录名是完全没有意义的。
  • “盐的定义”并不是说它是随机的(或每个用户随机),而是让有权访问散列密码数据库副本的人更难执行字典攻击.这是如何完成的(每个用户,或给定数据库的单个盐)取决于使用场景。关于盐中的用户特定信息而不是用户名,您可以为此目的使用常量,如 UID - 尽管两个不同的用户具有相同的哈希值并没有内在问题,因为他们具有相同的密码。 ..
【解决方案2】:

据我所知,强度没有区别。

由于在密码哈希之前添加盐是常见的做法,因此攻击者通常知道盐。但这并没有违背盐的目的。

一般来说,将 $login/$username 添加到散列(Vinzz 的解决方案)中并不是一个好主意,因为如果用户更改他或她的用户名会导致问题。更好的解决方案是使用 随机盐

使用的散列算法确实有所作为。 SHA1 被认为是 cryptographically broken,不应用于散列密码。

一般来说BCRYPT(一种基于 Blowfish 的自适应成本散列算法)被认为是最好的实践(PHP 的 crypt();CRYPT_BLOWFISH 标志)
其他可靠的选项是 SHA256 及更高版本。

编辑:
我在这里写了一个关于加盐的更长答案:stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/

【讨论】:

  • 我没有投反对票,但恕我直言,它没有抓住重点。问题是关于密码的双重哈希。
【解决方案3】:

它的强度正好是原来的两倍,因为攻击者需要执行两倍的 SHA1 计算才能进行蛮力攻击。

当然,这仍然不是很令人印象深刻。另一方面,在一个循环中执行 SHA1 5000 次对于授权来说是可行的,但会使攻击花费 5000 倍的时间——这种技术被称为key strengthening。然而,它实际上只是 Jacco 提到的适应性成本哈希算法的穷人替代品。

【讨论】:

  • ...或拒绝服务,如果有人向您的登录表单发送垃圾邮件。
  • 5000 次 SHA1 仍然比您需要的 DB 请求快。
猜你喜欢
  • 2011-12-06
  • 2011-04-29
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2013-09-11
  • 2010-11-30
相关资源
最近更新 更多