【问题标题】:Maximum length for MD5 input/outputMD5 输入/输出的最大长度
【发布时间】:2011-03-24 14:19:33
【问题描述】:

可以进行 md5 哈希处理的字符串的最大长度是多少?或者:如果没有限制,那么md5输出值的最大长度是多少?

【问题讨论】:

标签: md5 hash-function


【解决方案1】:

MD5 输入的最大长度:最大可定义和可用的比特流 位定义约束流可能取决于操作系统、硬件约束、编程语言等...

MD5 输出的长度:固定长度始终为 128 位 为方便显示,通常以十六进制显示,因为每个十六进制数字(0-1-2-3-4-5-6-7-8-9-ABCDEF)占用4位空间,所以其输出可以显示为 32 个十六进制数字。 128 位 = 16 字节 = 32 个十六进制数字

【讨论】:

    【解决方案2】:

    md5 算法将消息长度附加到最后一个块的最后 64 位,因此可以公平地说消息可以是 2^64 位长(18 个 e18 位)。

    【讨论】:

    • 这将是 18 exabits 或 18 e3 petabits 或 18 e6 terabits 或 18 e9 Gigabits。
    【解决方案3】:

    该算法旨在支持任意输入长度。即您可以计算大文件的哈希值,例如 DVD 的 ISO...

    如果输入有限制,它可能来自使用散列函数的环境。假设您要计算一个文件并且环境有一个 MAX_FILE 限制。

    但输出字符串将始终相同:32 个十六进制字符(128 位)!

    【讨论】:

      【解决方案4】:

      您可能希望使用SHA-1 而不是MD5,因为 MD5 被认为是损坏的。

      您可以在this Wikipedia article 中阅读有关 MD5 漏洞的更多信息。

      【讨论】:

      • 它的创建者,以及 Bruce Schneier 和国土安全部都同意它已经被破坏了……你还需要多少“谣言传播”来说服你它实际上已经被破坏了一段时间?事实是,很容易找到生成特定散列的输入。当然,您可以通过使用足够大的盐对输入进行加盐来降低这种风险。附带说明:SHA-1 被认为是一样坏的。如果您建议人们升级,请建议他们升级到 SHA-2。
      • @kander 哦,我需要的很少。一个例子。给定一个哈希,你会带一个源字符串吗?不是某个伟大文章的链接,不是某人的意见,而只是一个源字符串?
      • 没有人真正提到他们在“破碎”一词下的真正含义。虽然,@YourCommonSense 是有道理的。
      • 您在谈论 MD5 的安全用途。但是 MD5(或任何其他散列技术)还有很多其他用途。一方面,我想用它通过哈希重命名文件。我当然不关心MD5的抗碰撞性。您发布的所有内容仍然是真实的,只是我的 2 美分。
      • 那要看用途。这个问题并没有说明哈希的用途是什么。 MD5 不被认为是损坏的。然而,它完全不适合密码等,因为它不被用作任何现代意义上的 CRYPTOGRAPHIC 散列函数。然而,它比 SHA1 快得多,所以如果我们只关心例如,它是一个非常好的使用。查找不安全的缓存文件名或为计数、校验和等创建快速哈希查找。它的工作非常好,但是这项工作与安全无关。 – ntg 1 分钟前编辑
      【解决方案5】:

      附加长度

      b 的 64 位表示(在 添加了填充位)附加到前一个的结果中 步。万一 b 大于 2^64,那么只有 使用 b 的低 64 位。

      • 哈希始终为 128 位。如果将其编码为十六进制字符串,则可以对每个字符进行 4 位编码,即 32 个字符。
      • MD5 未加密。通常,您不能“解密”一个 MD5 哈希来获取原始字符串。

      查看更多here

      【讨论】:

      • 消息长度不限消息是什么意思?是输入吗?我的问题是MD5("how many characters exactly?");
      • @Shafizadeh 您的输入可以在您当前的编程语言中尽可能长,在 Java 中这将是字符串中的 (2^31)-1 个字符。是的,“信息”就是输入。
      • @Shafizadeh ...或来自文件,输入可能与可用存储一样大。
      【解决方案6】:

      据我所知,md5的输入没有限制。一些实现要求将整个输入加载到内存中,然后再将其传递给 md5 函数(即,实现作用于内存块,而不是流),但这不是算法本身的限制。输出始终为 128 位。请注意,md5 不是加密算法,而是加密哈希。这意味着您可以使用它来验证数据块的完整性,但不能反转散列。 另请注意,md5 被视为已损坏,因此您不应将其用于任何与安全相关的事情(验证下载文件的完整性等仍然可以)。

      【讨论】:

        【解决方案7】:

        您可以有任何长度,但当然,如果字符串输入太长,计算机上可能会出现内存问题。输出始终为 32 个字符。

        【讨论】:

        • 如果输入的字符串太长,它首先不会存在于系统中,除非它在文件中,在这种情况下,您可以在读取块时将块传递给摘要函数,换句话说,您一次只需要block 字节的输入可用。
        【解决方案8】:

        128 位 MD5 哈希表示为 32 个十六进制数字的序列。

        【讨论】:

          【解决方案9】:

          MD5 将任意长度的消息处理成 128 位的固定长度输出,通常表示为 32 个十六进制数字的序列。

          【讨论】:

          • 自我说明:MD5哈希长度=128 bits=16 bytes=32 hex digits
          • [A normal Edit] 32 个十六进制数字,字符串仅包含 'a-z' 中的单词和 '0-9' 中的数字
          • 我注意到以前的 cmets 有一个小错误。文本应为引号 :) "32 个十六进制数字,字符串仅包含来自 'a-z' 的 字母 和来自 '0-9' 的数字"
          • @Shafizadeh 正如答案所述,输入具有任意长度。这意味着参数可以是您需要的任何长度。
          • @Peping 一个小的修正:输入可以是只要使用的编程语言中使用的数据类型就可以。示例:Java 的字符串在内部使用数组,因此,字符串只能包含 (2^31)-1 个字符(或更少,取决于堆大小)。这也是 Java 中 MD5 函数的最大输入。但纯粹从理论上讲,MD5 函数确实可以处理任意长度的输入。 ;)
          猜你喜欢
          • 1970-01-01
          • 2012-10-22
          • 2020-03-12
          • 2012-06-02
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多