3

我的第一个问题是,我听说过两次散列字符串(例如 sha1(sha1(password)) ),因为第二个散列具有固定长度,是真的吗?

我的第二个问题是,哪个更安全?(var1 和 var2 是 2 个字符串):

  1. sha1(var1 + sha1(var2))
  2. sha1(var1 + var2)

如果是第一个,是否值得付出性能成本?

4

8 回答 8

10

通过对字符串进行两次哈希处理,您会增加发生冲突的风险,这在安全方面是很糟糕的。

不是有无限数量的输入导致 2 128个可能的输出,而是有 2 128个可能的输入导致可能少于 2 128个输出。

在散列之前使用盐和胡椒至少可以使输入保持无限可能。哈希两次会增加脚本的运行时间,并增加发生冲突的风险,除非您维护无限输入源。

于 2009-08-04T03:01:36.530 回答
2
  • sha1(var1 + sha1(var2))
  • sha1(var1 + var2)

两者都不是很安全。不要重新发明轮子。HMAC就是为此而设计的;特别是,它采取措施(填充等)来避免某些散列算法中的某些弱点与上述“简单”实现交互不良的问题。

此外,双重哈希对提高安全性没有用处。考虑一下:充其量,您将从一个随机值映射到另一个随机值。但是,如果发生冲突,则来自第二个哈希的两个结果值相等,那么您就会因冲突而失去安全性。也就是说,你永远无法以这种方式摆脱碰撞,但你可以获得一个。

也就是说,现有的原像攻击可能不适用于双重哈希......但是!他们可能仍然有效。我没有资格说哪个,如果你在这里问这个,你可能也不是。当然,碰撞攻击,这在当今 MD5 中都是可行的,不会受到双重哈希的阻碍。

最好坚持使用经过数十年分析的成熟算法,因为使用密码学,制作看起来安全但实际上并不安全的东西太容易了。

于 2009-08-04T04:28:43.457 回答
0

我怀疑这会增加任何安全性。它会增加脚本的运行时间,但不会为哈希增加很多安全性。请记住,当有人试图破坏您的哈希时,他们不需要找到 var1 和 var2 的确切值,他们只需要找到导致相同哈希的值。

于 2009-08-04T02:58:38.017 回答
0

我不是密码学专家,但据我所知,除了减慢处理速度之外,多次散列值不会获得任何安全性。因此,如果你散列 1000 次,你的攻击(例如字典攻击)会慢 1000 倍,但这在散列一次或两次的情况下是完全不相关的。

于 2009-08-04T02:58:58.580 回答
0

只用一种,不加盐就可以轻松解决。

有许多包含大量这些哈希的大型表,因此几乎可以解决没有盐的单个哈希。

添加第二个哈希也无济于事,因为这些表已经存在并保存了值。

添加到密码中的动态盐将比多个哈希提供更多帮助。多个哈希并没有真正增加它。

于 2009-08-04T03:00:16.203 回答
0

我对此的感觉是,您正在用钢门建造一堵砖墙,但其他墙是用胶合板制成的。换句话说,您可以在散列密码中注入尽可能多的安全性,但仍然会有更简单的方法来破解您的系统。我认为采取广泛的安全方法而不是过分担心此类事情要好得多。

于 2009-08-04T03:00:43.147 回答
0

var1 + var2 在预期情况下会相同吗?我的意思是,在这种情况下,第一个命题应该没问题,因为你可以避免散列冲突。关于物有所值,这是您应该回答的问题。避免碰撞值得付出代价。

关于sha算法,它应该真正打乱结果。因此,多次应用它不应该有更好的结果,也不应该将它应用到“更随机”的输入中,应该会产生更好的结果。

于 2009-08-04T03:01:53.910 回答
0

在字典攻击的情况下,多次散列字符串会使攻击者的任务复杂化,从而使暴力破解“更长”。您的第一个问题尚不清楚,但多个散列并不安全,因为第二个散列具有固定长度。

但比多重哈希更重要的是,使用对于更好的安全性至关重要。

关于你的第二个问题,我想说说这两个中哪一个最安全并不是很简单,我认为选择选项 2 真的足够了。

于 2009-08-04T03:03:34.687 回答