MD5 哈希值与 Bash 和 PHP 不同

Him*_*har 62 linux security bash php md5sum

我试图生成字符串“hello”的MD5总和(使用 md5sum)。我尝试了不同的方法,如 Linux 中的 md5sum 工具、PHP 的 MD5() 函数以及各种在线文本到 md5sum 转换器。

echo "hello" | md5sum
Run Code Online (Sandbox Code Playgroud)

echo "hello" > file && md5sum file
Run Code Online (Sandbox Code Playgroud)

给出了结果b1946ac92492d2347c6235b4d2611184。但是,PHP 的 md5() 函数和几乎所有在线生成器都给出了输出5D41402ABC4B2A76B9719D911017C592.

是什么原因?

Jon*_*nno 100

@Cyrus 的回答正好说明了如何解决这个问题 - 解释一下,当使用echo它时,它会在字符串的末尾输出一个换行符。正如您在此在线输出中看到的那样,hello换行符输出的正是您之前获得的 MD5。使用会-n抑制换行符,然后会给你你期望的结果。

在此处输入图片说明

编辑

如果将其输出到hexdump,则可以清楚地看到它,它显示了那里的字节的十六进制。

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|
Run Code Online (Sandbox Code Playgroud)

请参阅字符串末尾的0a( \n)

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|
Run Code Online (Sandbox Code Playgroud)

使用-necho 不会\n在最后放一个新行 ( )

现在有一个空字符串

$ echo  "" | hd
00000000  0a                                                |.|
Run Code Online (Sandbox Code Playgroud)

只是换行符

$ echo -n  "" | hd
Run Code Online (Sandbox Code Playgroud)

空字符串,因此不hexdump显示输出

  • 我建议不要使用 `echo -n`,因为它是非标准且不一致的支持(请参阅 [the Single Unix Spec for `echo`](http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html)和[Sven Mascheck 提供的更详细的不兼容性目录](http://www.in-ulm.de/~mascheck/various/echo+printf/))。如果您希望它始终如一地工作,请改用 `printf`;使用起来有点复杂(除了要打印的数据之外,您还必须指定格式字符串),但 IMO 值得避免麻烦。在这种情况下,`printf "%s" "hello"` 可以解决问题。 (19认同)
  • 将 `echo hello` 和 `echo -n hello` 分别通过管道传输到 `hexdump -C` 会更有趣;) (2认同)

Cyr*_*rus 83

默认情况下,echo在输出的末尾包含一个换行符。但是,PHP 和您使用的在线站点不包括换行符。要取消换行符,请使用以下-n标志:

echo -n "hello" | md5sum
Run Code Online (Sandbox Code Playgroud)

输出:

5d41402abc4b2a76b9719d911017c592 -

看: help echo


或使用 printf:

printf "%s" "hello" | md5sum
Run Code Online (Sandbox Code Playgroud)

  • 除非您了解 OP 的操作系统,否则您不知道“他们自己的示例”的修改版本实际上会起作用。如果他们的 Linux 使用精简的 Busybox,`echo -n` 可以回显 `-n`。 (7认同)