将 SHA-256 转换为 SHA-1 和 MD5 - 增加位长/熵?

信息安全 哈希 md5 sha256
2021-08-15 09:22:47

我知道这是一个真正愚蠢的问题,我当然在说完全垃圾,但让我解释一下:

  1. 我们有一个很长的 SHA-256 哈希,例如: 474bfe428885057c38088d585c5b019c74cfce74bbacd94a7b4ffbd96ace0675(256bit)
  2. 现在我们使用长散列创建一个 SHA-1 和一个 MD5 散列并将它们组合起来。例如:c49e2143913627ea178e66571189628a41526bf3(SHA-1; 160bit ) + 6bb225025371aaa811748da8e011773d(MD5; 128bit )

所以现在我们得到了: c49e2143913627ea178e66571189628a41526bf36bb225025371aaa811748da8e011773d
(SHA-1 + MD5; 160bit + 128bit = 288bit)

它比输入字符串长,用288bit而不是256bit那么我们真的增加了熵吗?

简而言之,就是这样:

hash = sha256(input) # 256bit
result = sha1(hash) + md5(hash) # 288bit

(那应该是伪代码,不知道是否通过。)

这里推理的错误是什么?我相信你不能以这种方式增加熵/字符串长度......

编辑:也很重要:我什至可能降低熵还是保持不变?

4个回答

它比输入字符串长,用 288 位而不是 256 位。那么我们真的增加了熵吗?

不,你没有增加熵。

在这种情况下,“熵”基本上是指对内容或值正确的任何特定猜测的概率。

如果我告诉你我已经使用 SHA256 对单个小写美国英文字母的 ASCII 表示进行散列,并且散列是十六进制 ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb,那么该值的熵不是 256 位,而是更接近 5 位(log2(26) ~ 4.7) 因为你最多只需要进行 26 次猜测就可以得出我散列的字母是 的结论a(为了完整起见,我真正做的是printf 'a' | sha256sum -b在 UTF-8 本机系统上。)

因此,熵永远不会大于输入的熵。输入充其量是初始哈希,它有 256 位的熵。(如果您散列的字符串的熵少于 256 位,并且攻击者可以以某种方式猜测它及其值,它可能会更少。)当输入大小固定时,可以假设每个散列计算为 O(1)。

因此,通过连接作为 SHA-256 哈希的字符串的 SHA-1 和 MD5 哈希,您永远无法获得超过 256 位的熵。你所做的只是让它变长,并可能掩盖它的起源。

现在,在某些情况下,使用多个哈希实际上是有意义的。例如,许多 Linux 包管理器对同一个文件使用并验证多个不同的哈希值。但是,这样做并不是为了增加散列值的熵这样做是为了更难找到有效的碰撞,因为在这种情况下,原像或碰撞攻击必须对所有使用的散列同样有效。对于大多数目的而言,这种针对现代密码散列的攻击已经足够困难了。同时对几个不同的哈希进行类似的攻击将更加困难。

你当然没有增加熵。无论多少次以及如何重新散列,您仍然最多只能拥有此模式的 256 位熵可能输出。请注意,您最多将有256 位熵,因为您没有告诉我们输入中有多少熵。如果输入中的熵少于 SHa256 的熵,则 SHa256 也不会为您提供 256 位熵。哈希永远不会增加熵。

但是考虑到完整的 sha256 可能值,您实际上会因为碰撞而失去熵。一些 256 位值会有冲突,也就是说,对于 sha1 和 md5 的 256 位输入,会有 x1 和 x2 sha1(sha256(x1)) == sha1(sha256(x2)) 和 md5(sha256(y1) ) == md5(sha256(y2))。如果你现在实际上有更少的输出,你就会失去熵。

正如其他人所解释的那样,“熵位”是指最初用于创建 SHA-256 哈希的原始密码或其他文本的猜测能力。在您的示例中,熵不变。

您在这里所做的是提供 SHA-256 的 SHA-1 版本MD5 版本。这使得 SHA-256 比您可能使用的其他解决方案更容易猜测。

如果您试图让猜测原始输入变得更加困难,您应该简单地重复 SHA-256 函数。事实上,重复 SHA-256 数千次将使暴力破解原始输入变得更加困难,而对您的服务器负载或最终用户体验没有明显影响。

但是,对于密码存储,最好的办法是使用适当的密码哈希函数,该函数被设计为带有 Salt 的慢速哈希。这使您可以调整多少轮次(工作系数)以适应生产硬件上所需的处理时间。通常推荐使用 BCrypt。PBKDF2 或新的 SCrypt 都是不错的选择。

你增加了熵吗……很可能没有。

您所做的只是使用 2 个较旧的散列函数来获取新的散列。由于这没有新数据,因此熵不受影响。

这里的位数没有任何区别(因为它只是“另一种写入”原始哈希的方式。)

熵(在密码学中)与特定位是“0”或“1”的不确定性有关。为了增加这一点,您需要“新”数据,而不是简单地重新散列(在较低程度上)。当您使用原始散列函数重新散列时,您可以在大多数情况下保持熵的 smae 水平。从那时起,您就不会丢失位。