SHA256生成文件和文件内容的哈希值不同

5
我使用在线SHA256转换器来计算给定文件的哈希值。在那里,我看到了一个我不理解的效果。
为了测试目的,我想要计算一个非常简单的文件的哈希值。我将其命名为“test.txt”,它的唯一内容是字符串“abc”,后跟一个新行(我只是按了回车键)。
现在,当我将“abc”和换行符放入SHA256生成器中时,我得到的哈希值为
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb。
但是当我将完整文件放入同一个生成器中时,我得到的哈希值为
552bab6864c7a7b69a502ed1854b9245c0e1a30f008aaa0b281da62585fdb025。
这个差异从哪里来?我使用了这个生成器(事实上,我尝试了几个,它们总是产生相同的结果):

https://emn178.github.io/online-tools/sha256_checksum.html

请注意,如果没有换行符,则不会产生此差异。 如果文件只包含字符串“abc”,则哈希值为
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
对于文件以及仅针对内容。

可能是由于不同的换行符表示方式引起的。请参见此处 - Robby Cornelissen
3个回答

4

正如我在评论中所指出的,这两种表示方式的差异是由于不同操作系统上换行符的表示方法不同(请参见此处的详细信息):

  • 在UNIX和类UNIX系统中,换行符用换行字符(\n)表示。
  • 在DOS和Windows系统中,换行符用回车和换行字符(\r\n)表示。

比较以下两个命令及其输出,这些输出对应于您问题中的SHA256值:

echo -en "abc\n" | sha256sum
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

echo -en "abc\r\n" | sha256sum
552bab6864c7a7b69a502ed1854b9245c0e1a30f008aaa0b281da62585fdb025

1
非常感谢您对 \n 和 \r\n 的明确计算。尽管两个答案都是正确的(我也给两个答案点了赞),但因为这个原因我选择接受了这个答案。 - Thern

2

谢谢您的回答。我有类似的想法,但我不使用Linux(或OS Mac),所以我不知道不同的编码可能来自哪里。这些文件是在Windows 10中使用Notepad++创建的。 - Thern
1
你用来进行转换的网站很可能是运行在Linux上的。 - Robby Cornelissen
1
您所使用的网站正在使用github.com,而所有github服务器均托管在Linux机器上。我建议您使用应用程序来获取校验和。 - Claudio Corchez

0

我也遇到了同样的问题。但是以十六进制模式提供数据有助于理解实际行为。 enter image description here

在进行SHA计算之前需要对数据进行规范化处理,这将消除此类问题。规范化需要在生成端和验证端都进行。


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