MD5哈希值是否总是大写或小写?

18

我正在将一个HMAC-MD5编码的参数传递到表单中,但供应商返回该参数无效。 然而,它与他们的哈希生成器给我的匹配,除了字母大小写不同。 为了解决这个问题,我使用了一个lcase命令。 我想知道这是否会在以后给我带来麻烦。 Coldfusion生成的散列字符串是大写字母,供应商似乎总是使用小写字母; 它始终只有一种或另一种情况吗? 还是它们可能混合使用?


你为什么要问这个?你需要它做什么? - Christian
2
就像我说的那样,我的哈希值与供应商的哈希值不匹配,仅仅是因为字母大小写的问题。他们用它进行身份验证。 - Patrick Schomburg
如果他们在使用MD5,那么他们还停留在过去。至于大小写问题,我已经试着回答了。 - tadman
我对哈希一无所知,听说它被用作大型电子支付处理器的支付网关已经过时,感到非常惊讶。 - Patrick Schomburg
1
是的,ColdFusion始终生成大写的十六进制字符A-F。在这里使用 lCase() 是完全安全的。 - Alex
好的。我觉得如果它们巧合地匹配起来会很奇怪,但我想确认一下。 - Patrick Schomburg
3个回答

23

与其他哈希函数一样,MD5也会产生二进制输出,对于MD5来说,它是16个字节。

由于这些字节很难处理,所以它们被编码为字符串。对于MD5,它们通常被编码为32个小写十六进制数字,因此每个字节由2个字符表示。

目标系统是否接受大写或小写编码或两者都可以,取决于系统,这与哈希函数无关,两者都是相同MD5哈希的不同表示形式。因此,要回答您的问题,请根据目标系统所需的格式设置输出。


md5 = 二进制(16) - Rodrigo Polo
3
@RodrigoPolo - 是的,这正是我在第一句中写的内容。 - martinstoeckli

2

虽然 RFC-1321 MD5 Message-Digest Algorithm 没有讨论十六进制字符串编码,但测试套件确实以小写字母显示结果。

The MD5 test suite (driver option "-x") should print the following results:

MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = 57edf4a22be3c955ac49da2e2107b67a

小写字母只是C/C++的printf()格式说明符%02x的输出结果,而不是必须的:"应该打印",而不是"必须打印"。
参考文献:RFC-1321 附录A.5测试套件

0
一个十六进制字符串可以包含 09afAF 范围内的任何字符,所以你应该预期到有大写和小写两种版本。
如果你在尝试连接两个高度独立的系统时遇到了麻烦,请根据你的需求强制使用大写或小写。

3
a-f和A-F不是同一件事吗? MD5是十六进制的,意味着包括0-9和a-f,但不包括A-F。 如果它们相同,那么它们是相同的东西。 - Christian
@Christian 他们应该是兼容的,但有些遗留软件非常难缠。 - tadman
一些(值得怀疑的)系统会在MD5加密或编码的基础上再进行额外的步骤,这使得大小写对于最终输出非常重要。为避免出现差异,请始终遵循文档/推荐的方式。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接