MD5 校验和包含校验位吗?
我必须手动复制一些 MD5 校验和(没有其他方法),并且想知道是否有任何代码可以验证校验和是否有效,就像验证信用卡号一样。
需要明确的是,我不是问如何从文件生成 MD5 总和,以便我可以将其与我给出的总和进行比较,我是问是否可以(我怀疑是否可以)进行验证MD5 和是真正的 MD5 和,实际上没有对用于生成和的字节进行任何引用。
我想找出一个可能的拼写错误。
答案1
它实际上是加密哈希设计标准(MD5 的目标)的结果不是是这样的事情。
当您将文件输入理想的 128 位加密哈希时,您可以不是预测任何除了运行哈希之外,还可以了解 128 位输出(或它们之间的关系)。如果可以的话,您实际上并没有获得 128 位哈希值。例如,如果散列具有奇偶校验位(使得 1 的总数始终为奇数 [奇奇偶校验] 或始终为偶数 [偶奇偶校验] 的位),那么您实际上拥有 127 位散列。
为了确保您不会因打字错误而意外生成有效的哈希值,您需要有高于 50/50 的机会检测到它。所以你会丢失更多位。
问题是您想要 128 位哈希是有原因的:通常需要一个额外的位双打攻击哈希所需的工作。
如果冗余是哈希预期设计的一部分,那么它将被称为 124 位哈希,带有 4 位 CRC(等等)。如果这不是有意的,那么它实际上是哈希的部分密码分析(破解)。
实用的解决方案
由于您想捕获拼写错误,因此只需添加任何校验和或校验数字并将其写在旁边即可。你可以使用类似 perl 的东西算法::Verhoeff添加校验位。
答案2
基本上,它没有任何校验和位。要识别拼写错误,您可以尝试在同一通道上共享 MD5 和的校验和(例如 MD5)并进行检查。
答案3
MD5校验和本身就是一个校验和。让校验和有自己的校验和/校验位会很奇怪。
任何符合 16 字节唯一标准的随机和都可以是 MD5 校验和。这 16 个字节可以表示为 32 个十六进制数字、128 位或任何您喜欢的数字。