【问题标题】:Why do md5 and sha-* only use alphanumeric characters in their hash result?为什么 md5 和 sha-* 在其哈希结果中只使用字母数字字符?
【发布时间】:2012-06-11 14:02:53
【问题描述】:

我知道不想使用 '\0',但扩展 ASCII 范围内的所有其余部分都可以使用,对吗?

这不会提供更好/安全/“更少冲突”的哈希吗?

【问题讨论】:

    标签: hash ascii sha md5sum


    【解决方案1】:

    您从错误的前提开始——它们产生的结果可以(确实)包括从 0 到 255 的所有 8 位值。例如,SHA-256 的测试向量之一是“ abc”。结果(十六进制)是:

    ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
    

    就在该测试中,结果包括值从 0x03 到 0xff 的字节。

    为了显示,可能(通常)以十六进制的形式呈现。对于在电子邮件中传输,它们通常使用 MIME 或 UUENCODE 之类的东西进行编码。然而,哈希本身并不受这种方式的限制。

    以这种方式转换结果对抗碰撞性没有影响 - 您仍然有 160/256/任何位的实际数据,但表示会扩展。

    【讨论】:

      【解决方案2】:

      结果只是十六进制编码以便更好地阅读。

      【讨论】:

        【解决方案3】:

        事实上,那些哈希算法输出的是数字,而不是字符串。它们仅使用字母 a-f 与数字 0-9 组合,这使得输出为十六进制数。

        【讨论】:

          【解决方案4】:

          MD5 产生一个 128 位的散列。 (16 字节) sha,取决于是 sha1 还是 sha256 产生 160 位(20 字节)或 256 位(32 字节)散列。 请注意,我说的是二进制长度/强度。时间越长,发生碰撞的可能性就越小。

          大多数用户将其粘贴到 DB 字段或诸如此类的事实使得使用 varions binary-ascii 转换算法将其转换为 ASCII 变得很方便。这根本不应该影响碰撞概率的强度,因为您最终会得到一个更大的 ASCII 字符串。

          FWIW 我已经在二进制形式的加密产品中使用 SHA1、SHA256 超过 5 年了,我建议按照以下顺序选择哈希,从最强到最弱:SHA256、SHA1、MD5。有一个网站可以“反转” MD5,所以我强烈建议不要这样做。

          【讨论】:

          • 根据其他答案,如果它是十六进制编码,您最终会得到 MD5 -> 32chars,SHA1 -> 40chars,SHA256 -> 64chars。在这种情况下,强度与二进制相同。
          猜你喜欢
          • 1970-01-01
          • 2011-03-19
          • 2011-01-27
          • 2017-10-12
          • 1970-01-01
          • 2015-08-21
          • 2017-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多