【问题标题】:What are the differences between MD5 binary mode and text mode?MD5二进制模式和文本模式有什么区别?
【发布时间】:2013-08-02 00:34:27
【问题描述】:

这是我的测试:

...$ md5sum -b roy.html 
f9283ca2833ff7ebb6781ab8d23a21aa *roy.html
...$ md5sum -t roy.html 
f9283ca2833ff7ebb6781ab8d23a21aa  roy.html

这两种模式有什么不同吗?

【问题讨论】:

标签: encryption md5 md5sum


【解决方案1】:

‘-b’ ‘--二进制’

  • 将每个输入文件视为二进制,以二进制模式读取并
    输出一个“*”标志。这是--text 的倒数。在像这样的系统上 GNU 不区分二进制文件和文本文件,这
    选项仅将每个输入模式标记为二进制:MD5 校验和是
    不受影响。此选项是 MS-DOS 等系统的默认选项
    区分二进制文件和文本文件,读取除外
    标准输入是终端时的标准输入。

‘-t’ ‘--文本’

  • 将每个输入文件视为文本,以文本模式读取并 输出一个''标志。这是 --binary 的倒数。这个选项 是 GNU 等系统的默认设置,不区分 二进制和文本文件。在其他系统上,它是默认的 当标准输入是终端时读取标准输入。这种模式 如果使用 --tag 则永远不会默认为。

【讨论】:

  • 您能否举一个文件示例,其中 MD5SUM 会有所不同?
  • @Flimm 我不知道有任何 MD5 求和工具可以做到这一点,但是在某些编程语言中,各种换行符可以在读取时自动转换为平台默认值,除非“二进制读取模式” " 被指定。例如,\r\n(Windows 换行符)可以在 Linux 上转换为 \n,或者在 Windows 上\n 可以转换为\r\n
【解决方案2】:

我发现二进制模式和非二进制模式之间有一些有趣的区别。

我的用例是我正在尝试创建 256 位 AES 密钥以用于 AWS S3 块存储服务。这些密钥用于支持服务器端加密 (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 *-

Alpine 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,其输出类似于 Alpine Linux 在以下情况下所做的:

cat key | md5 -b
kVssbDNowZ+W6aeQiTicFQ==

我将尝试与 Alpine Linux 的 Sören Tempel 联系,以了解这些差异的原因。

【讨论】:

  • md5 的 -b 标志不是二进制输入模式——它是 base64 输出模式。它只是改变了输出格式;它对输入或哈希的生成方式没有影响。您只是选择对哈希进行 base64 编码而不是 base16(十六进制)。
  • 谢谢,这是最有用的答案!请参阅@jpmc26 关于多行文件的评论(DOS \r\n 可以在 Linux 上转换为 \n 或在文本模式下反转?)。
  • 关于digital preservation上使用校验和的所有读者:二进制模式是标准。
  • Linux 在 C 的文本模式下不进行转换,并在传递给 fopen 时忽略二进制标志。只有 DOS/Windows 会进行转换,在读取时从其自己的 \r\n 到 \n,在写入时反之亦然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多