我的第一个问题是,我听说过两次散列字符串(例如 sha1(sha1(password)) ),因为第二个散列具有固定长度,是真的吗?
我的第二个问题是,哪个更安全?(var1 和 var2 是 2 个字符串):
- sha1(var1 + sha1(var2))
- sha1(var1 + var2)
如果是第一个,是否值得付出性能成本?
我的第一个问题是,我听说过两次散列字符串(例如 sha1(sha1(password)) ),因为第二个散列具有固定长度,是真的吗?
我的第二个问题是,哪个更安全?(var1 和 var2 是 2 个字符串):
如果是第一个,是否值得付出性能成本?
通过对字符串进行两次哈希处理,您会增加发生冲突的风险,这在安全方面是很糟糕的。
不是有无限数量的输入导致 2 128个可能的输出,而是有 2 128个可能的输入导致可能少于 2 128个输出。
在散列之前使用盐和胡椒至少可以使输入保持无限可能。哈希两次会增加脚本的运行时间,并增加发生冲突的风险,除非您维护无限输入源。
两者都不是很安全。不要重新发明轮子。HMAC就是为此而设计的;特别是,它采取措施(填充等)来避免某些散列算法中的某些弱点与上述“简单”实现交互不良的问题。
此外,双重哈希对提高安全性没有用处。考虑一下:充其量,您将从一个随机值映射到另一个随机值。但是,如果发生冲突,则来自第二个哈希的两个结果值相等,那么您就会因冲突而失去安全性。也就是说,你永远无法以这种方式摆脱碰撞,但你可以获得一个。
也就是说,现有的原像攻击可能不适用于双重哈希......但是!他们可能仍然有效。我没有资格说哪个,如果你在这里问这个,你可能也不是。当然,碰撞攻击,这在当今 MD5 中都是可行的,不会受到双重哈希的阻碍。
最好坚持使用经过数十年分析的成熟算法,因为使用密码学,制作看起来安全但实际上并不安全的东西太容易了。
我怀疑这会增加任何安全性。它会增加脚本的运行时间,但不会为哈希增加很多安全性。请记住,当有人试图破坏您的哈希时,他们不需要找到 var1 和 var2 的确切值,他们只需要找到导致相同哈希的值。
我不是密码学专家,但据我所知,除了减慢处理速度之外,多次散列值不会获得任何安全性。因此,如果你散列 1000 次,你的攻击(例如字典攻击)会慢 1000 倍,但这在散列一次或两次的情况下是完全不相关的。
只用一种,不加盐就可以轻松解决。
有许多包含大量这些哈希的大型表,因此几乎可以解决没有盐的单个哈希。
添加第二个哈希也无济于事,因为这些表已经存在并保存了值。
添加到密码中的动态盐将比多个哈希提供更多帮助。多个哈希并没有真正增加它。
我对此的感觉是,您正在用钢门建造一堵砖墙,但其他墙是用胶合板制成的。换句话说,您可以在散列密码中注入尽可能多的安全性,但仍然会有更简单的方法来破解您的系统。我认为采取广泛的安全方法而不是过分担心此类事情要好得多。
var1 + var2 在预期情况下会相同吗?我的意思是,在这种情况下,第一个命题应该没问题,因为你可以避免散列冲突。关于物有所值,这是您应该回答的问题。避免碰撞值得付出代价。
关于sha算法,它应该真正打乱结果。因此,多次应用它不应该有更好的结果,也不应该将它应用到“更随机”的输入中,应该会产生更好的结果。
在字典攻击的情况下,多次散列字符串会使攻击者的任务复杂化,从而使暴力破解“更长”。您的第一个问题尚不清楚,但多个散列并不安全,因为第二个散列具有固定长度。
但比多重哈希更重要的是,使用盐对于更好的安全性至关重要。
关于你的第二个问题,我想说说这两个中哪一个最安全并不是很简单,我认为选择选项 2 真的足够了。