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