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

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

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

如果是第一个,值得付出性能代价吗?

有帮助吗?

解决方案

通过对字符串进行两次哈希处理,会增加冲突的风险,这从安全角度来说是很糟糕的。

而不是无限量的输入导致 2128 可能的输出,你将有 2128 可能的输入导致可能少于 2128 输出。

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

其他提示

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

两者都不是很安全。不要重新发明轮子。 哈马卡 就是为此而设计的;特别是,它采取步骤(填充等)来避免某些哈希算法中的某些弱点与上述“简单”实现相互作用不良的问题。

此外,双重散列对于提高安全性没有用。考虑:最好的情况是,您将从一个随机值映射到另一个随机值。但是,如果发生冲突,第二个哈希值的两个结果值相等,则您已经 丢失的 以碰撞结束的安全。也就是说,你永远无法通过这种方式消除碰撞,但你可以获得碰撞。

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

最好坚持使用经过数十年分析的经过验证的算法,因为使用密码学,很容易做出一些东西 看起来 安全但事实并非如此。

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

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

仅使用一种且不加盐就可以轻松解决问题。

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

添加第二个散列也没有多大帮助,因为这些表已经存在并保存了值。

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

我对此的感觉是,你正在建造一堵带有钢门的砖墙,但其他墙壁是由胶合板制成的。换句话说,您可以在哈希密码中注入尽可能多的安全性,但仍然有更简单的方法来破解您的系统。我认为最好采取广泛的安全方法,而不是过多担心此类问题。

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

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

在字典攻击的情况下,对字符串进行多次散列将使攻击者的任务复杂化,使得暴力破解的时间“更长”。您的第一个问题不清楚,但多个哈希值并不会降低安全性,因为第二个哈希值具有固定长度。

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

关于你的第二个问题,我想说,很难说哪一个最安全,我认为选择2就足够了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top