MD5 输入/输出的最大长度
Posted
技术标签:
【中文标题】MD5 输入/输出的最大长度【英文标题】:Maximum length for MD5 input/output 【发布时间】:2011-03-24 14:19:33 【问题描述】:可以进行 md5 哈希处理的字符串的最大长度是多少?或者:如果没有限制,那么md5输出值的最大长度是多少?
【问题讨论】:
关注维基:en.wikipedia.org/wiki/MD5 【参考方案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】: 消息长度为unlimited。哈希始终为 128 位。如果将其编码为十六进制字符串,则可以对每个字符进行 4 位编码,即 32 个字符。 MD5 未加密。通常,您不能“解密”一个 MD5 哈希来获取原始字符串。附加长度
b 的 64 位表示(在 添加了填充位)附加到前一个的结果中 步。万一 b 大于 2^64,那么只有 使用 b 的低 64 位。
查看更多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 函数确实可以处理任意长度的输入。 ;)以上是关于MD5 输入/输出的最大长度的主要内容,如果未能解决你的问题,请参考以下文章