Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption MD5二进制模式和文本模式之间有什么区别?_Encryption_Md5_Md5sum - Fatal编程技术网

Encryption MD5二进制模式和文本模式之间有什么区别?

Encryption MD5二进制模式和文本模式之间有什么区别?,encryption,md5,md5sum,Encryption,Md5,Md5sum,以下是我的测试: ...$ md5sum -b roy.html f9283ca2833ff7ebb6781ab8d23a21aa *roy.html ...$ md5sum -t roy.html f9283ca2833ff7ebb6781ab8d23a21aa roy.html 这两种模式有什么不同吗 “-b” “--二进制” 以二进制模式读取每个输入文件,并将其视为二进制文件 输出“*”标志。这是文本的倒数。在这样的系统上 不区分二进制文件和文本文件的GNU,这 选项仅将每个输入

以下是我的测试:

...$ md5sum -b roy.html 
f9283ca2833ff7ebb6781ab8d23a21aa *roy.html
...$ md5sum -t roy.html 
f9283ca2833ff7ebb6781ab8d23a21aa  roy.html
这两种模式有什么不同吗

“-b” “--二进制”

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

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

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

我的用例是,我正在尝试创建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:

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,试图找出这些差异的原因。

您能举一个MD5SUM不同的文件示例吗?@Flimm我不知道有任何MD5 sum工具可以做到这一点,但在一些编程语言中,除非指定了“二进制读取模式”,否则在读取时,各种换行符可以自动转换为平台默认值。例如,在Linux上,
\r\n
(Windows newline)可以转换为
\n
,或者在Windows上,
\r\n
可以转换为
\r\n
。请所有读者注意,校验和的使用:二进制模式是标准的。md5的-b标志不是二进制输入模式,而是base64输出模式。它只是改变了输出格式;它对输入或哈希的生成方式没有影响。您只需要选择base64而不是base16(十六进制)对哈希进行编码。谢谢,这是最有用的答案!另请参阅@jpmc26关于多行文件的评论(在Linux上DOS
\r\n
可以转换为
\n
,在文本模式下可以转换为反向?)。对于所有读者,关于校验和在上的使用:二进制模式是标准的。Linux在C的文本模式下不进行转换,并且在传递到fopen时忽略二进制标志。只有DOS/Windows进行转换,读取时从它自己的\r\n转换到\r\n,写入时从它自己的\r\n转换到\r\n。
cat key | md5 -b
kVssbDNowZ+W6aeQiTicFQ==