散列编码字符串之间是否存在熵差异?

信息安全 哈希 编码
2021-08-27 11:56:44

当然,如果我将(例如)SHA-2 应用于 base64 编码的字符串,它将给我与原始数据不同的结果,但从熵的强度角度来看,有区别吗?

有一个固定的输入(在位级别上,例如在 base64 中:MSB 始终为 0,或字节:例如,附加一堆 0)到哈希会降低它的强度吗?

2个回答

它不会增加熵。

执行蛮力攻击的攻击者可以简单地应用您在散列之前使用的相同编码。

你问了一些很好的问题。您应该知道的第一件事是信息、熵和字节字符串/数组是相关的。系统的熵是Log(信息)。在这种情况下,信息是一个字符串(密码、base64 编码或其他)。但是,要查找字符串的信息内容,我们不会根据它的长度和其中的字符来衡量它。相反,我们根据它可以容纳的值的范围来衡量信息。

因此,抛硬币有两种状态:正面或反面。因此,它有一点信息:Log2(2) = 1。

100,000 个唯一词的列表的熵内容是多少?这不是字母字母的所有可能组合(对于长度为 6 或 28 位的单词,这将是 26^6)。事实上,它不到 17 位。为什么?因为我们在列表中没有超过 2^17 个单词。

理解熵的关键是理解某事物可能选择的范围,然后取 Log(|RANGE|) 得到熵。

让我们看一些示例并假设您使用的是 SHA-512(您没有为 SHA-2 算法选择长度,所以我选择了 512 位)。

这意味着任何生成的哈希的最大熵上限为 512 位。这并不意味着散列包含 512 位熵,特别是如果您从熵较小的输入开始。此外,严格来说,即使 SHA-512 散列也不完全包含 512 位,我相当肯定有些散列输出是不可能的 - 它不涵盖可能的 2^512 数字的整个范围。但是,这是一个合理的上限。

这里有些例子。所有哈希输出的长度都是 512 位,但是:

  1. Hash(the_result_of_a_coin_flip) = 1 位熵 MAX。
  2. Hash(1_rnd_byte) = 8 位熵 MAX。
  3. 哈希(64_bytes_from_a_true_random_num_gen)= 512 MAX。
  4. Hash(64_bytes_from_a_pseudo_RNG) = 512 MAX,但是如果 PRNG 种子更小它会(低得多)。
  5. 哈希(1024_bytes_from_a_true_RNG)= 512 位最大熵。
  6. Hash(32_rnd_bytes_base64_encoded) = 256 位的 MAX 熵。
  7. Hash(64_rnd_bytes_base64_encoded) = 512 位的 MAX 熵。
  8. Hash('00000'+64_rnd_bytes+'00000') = 512 位 MAX 熵。

如果您查看这些示例,您会发现哈希算法限制了熵,因为您无法将更多的熵(以位测量)放入算法的输出中。此外,您无法使用哈希创建更多熵 - 示例 1 和 2 显示了这一点。但是,您可能会丢失散列函数的熵 - 示例 5 显示了这种丢失(从 8192 位下降到 512)。

示例#7显示了您的要求,我相信。我们从 512 位熵(64 字节)开始,对它们进行 base 64 编码,然后对它们进行哈希处理。正确构建的散列函数应保留输入的大部分熵,直至其最大输出大小。

Example #8 显示了第二个问题的答案。在输入中添加和/或附加一组固定的字节不会改变输出的熵。您的固定输入部分的熵为零,因为其中没有信息 - 它是固定的 (|Range| = 1) 并且 Log(1) = 0。

我希望这有帮助。