双重哈希安全性

3

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

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

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

如果是第一个,那么性能成本值得吗?


4
我认为你在第一个问题中漏掉了一些单词。什么是真的?在你的第二个问题中,更安全用于什么目的? - Greg Hewgill
8个回答

10

将字符串进行两次哈希,会增加发生冲突的风险,这在安全方面是不好的。

如果你有无限数量的输入可以导致2128个可能的输出,那么你会有2128个可能的输入,但是只能得到少于2128个输出。

在进行哈希之前使用盐和胡椒粉至少可以使输入保持无限的可能性。哈希两次会增加脚本的运行时间,并增加冲突的风险,除非你保持了无限输入的来源。


1
@安德鲁,有没有讨论这个的研究论文? - Vineet Reynolds
1
注意,Google员工们:
  1. 查找关键字拉伸、bcrypt、PHK-MD5等:迭代哈希——恰好用于减速!这是它们的卖点。
  2. 注意:将函数h(x)更改为h(h(x))不会减少x的原始输入集:在两种情况下都是相同的无限大。 碰撞仅发生因为SHA1不完美。
  3. 盐值是为了防止查找表攻击(而不是避免碰撞)。
  4. 请参见https://dev59.com/onRC5IYBdhLWcg3wSu97#17396367,或https://crackstation.net/hashing-security.htm。
- Sz.
然而,安迪在他的主要观点上仍然是正确的,即sha1(sha1(password))是不好的。至于OP:是的,sha1(var1 + sha1(var2))更好,并且通常值得(通常无关紧要的!)性能成本。(我上面的意思是“额外的碰撞”;对于我的重新编辑感到抱歉。) - Sz.

2
  • sha1(var1 + sha1(var2))
  • sha1(var1 + var2)

这两种方法都不是非常安全。不要重复造轮子。 HMAC 就是为此而设计的;它采取了一些步骤(如填充等)来避免某些哈希算法与上述“简单”实现互相作用时出现问题。

另外,双重哈希并不能提高安全性。考虑以下情况:最好的情况是从一个随机值映射到另一个随机值。然而,如果存在碰撞,则第二个哈希结果中的两个值将相等,这样就会因为出现碰撞而失去安全性。也就是说,你永远无法通过这种方式消除碰撞,但却可能增加碰撞。

尽管如此,现有的预像攻击可能不适用于双重哈希……但是!它们可能仍然有效。我不够资格说哪种方法更好,如果你在这里询问,你可能也不够资格。当今 MD5 可能只受到碰撞攻击的影响,而双重哈希并不能阻止这种攻击。

最好坚持经过数十年分析证明的已知算法,因为在密码学中,很容易制造出看起来安全但实际上不安全的东西。


0

我怀疑这不会增加任何安全性。它会增加脚本的运行时间,但对哈希的安全性质量没有太大影响。请记住,当有人试图破解您的哈希时,他们不需要找到var1和var2的确切值,他们只需要找到一个结果相同的哈希即可。


第一次暴力破解的结果不是第一次哈希的哈希值吗?忽略碰撞等因素,那么你需要破解新的哈希值,对吧?当然,这是在假设你不知道哈希值是双重哈希的情况下。 - MitMaro
是的,但你可以使用同一个哈希表来实现,这样你只需要2n的运行时间,而不是n。当n非常大时,这并不会提高安全性。 - Marius

0

我不是密码学专家,但据我所知,除了减慢过程之外,多次哈希值不会增加安全性。因此,如果您哈希1000次,您将使攻击(例如字典攻击)变慢1000倍,但在仅哈希一次或两次的情况下,这相当无关紧要。


0

只使用一个哈希值且没有盐,可以轻松解决它。

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

添加第二个哈希值也不会有太大帮助,因为这些表格已经存在并保存了这些值。

将动态盐添加到密码中比添加多个哈希值更有帮助。多个哈希值实际上并没有增加太多价值。


0

我对此的感觉是,你正在用钢门建造一堵砖墙,但其他墙壁却是用胶合板制成的。换句话说,你可以在哈希密码方面注入尽可能多的安全性,但仍然会有更容易破解系统的方法。我认为,采取广泛的安全措施比过分担心这些事情要好得多。


0

在预期情况下,var1 + var2 会是相同的吗?我的意思是,在这种情况下,第一个命题应该是可以的,因为您将避免哈希冲突。关于是否值得成本,这是您应该回答的问题。避免冲突是否值得成本。

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


0

对一个字符串进行多次哈希会使字典攻击者的任务变得更加复杂,从而使暴力破解变得“更长”。您的第一个问题不太清楚,但是多个哈希并不会因为第二个哈希具有固定长度而不安全。

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

关于您的第二个问题,我认为很难直接说哪个更安全,我认为选择2就足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接