我发现二进制模式和非二进制模式之间有一些有趣的差异。
我的使用场景是为了在AWS S3块存储服务上创建256位AES密钥。这些密钥用于支持服务器端加密(SSE)。我花了几个小时(几乎是几天)来弄清楚为什么我的代码无法与S3交互,从未怀疑过我的密钥可能是问题所在。实际上,生成密钥并不是问题。我能够轻松地生成二进制密钥和二进制密钥的base64编码版本。
问题所在确实让我感到非常惊讶。我对md5并不陌生,几十年来一直使用它而从未出错。但事实证明,我基于二进制密钥生成的md5校验和是错误的。我的第一个指示是它比我看到的工作示例中的字符要多几个。我一直无法创建像示例中那样短的md5校验和,也不知道为什么会有差异。
我发现:
OSX(BSD)的md5没有二进制输入模式的概念。
OSX(BSD)的md5sum有一个用于二进制输入模式的标志,但它不会改变实际输出的哈希值,它只会改变与该哈希相关的元数据。
Alpine Linux的md5确实有二进制输入模式的概念。
Alpine Linux的md5sum没有二进制输入模式的概念。
Debian Linux似乎不存在md5。
Debian Linux的md5sum有一个用于二进制输入模式的标志,但它不会改变实际输出的哈希值,它只会改变与该哈希相关的元数据。
例如,运行时我得到以下输出:
OSX:
openssl rand 32 > key
cat key | md5
936e87c3f08e54d036c7a38dc9dbd540
cat key | md5sum
936e87c3f08e54d036c7a38dc9dbd540 -
cat key | md5sum -b
936e87c3f08e54d036c7a38dc9dbd540 *-
阿尔派 Linux:
openssl rand 32 > key
cat key | md5
915b2c6c3368c19f96e9a79089389c15
cat key | md5 -b
kVssbDNowZ+W6aeQiTicFQ==
cat key | md5sum
915b2c6c3368c19f96e9a79089389c15 -
Debian Linux:
openssl rand 32 > key
cat key | md5sum
a44f9c1d1f7a35f2374ad2987296b54b -
cat key | md5sum -b
a44f9c1d1f7a35f2374ad2987296b54b *-
我发现AWS S3至少期望的是一个二进制密钥的MD5值,就像阿尔派Linux在这种情况下所做的那样。
cat key | md5 -b
kVssbDNowZ+W6aeQiTicFQ==
我将尝试联系Alpine Linux的Sören Tempel,以了解这些差异的原因。