【问题标题】:SHA256 generation different for file and content of this file文件和该文件内容的 SHA256 生成不同
【发布时间】:2019-06-06 07:28:46
【问题描述】:

我使用在线 SHA256 转换器来计算给定文件的哈希值。在那里,我看到了一个我不明白的效果。

出于测试目的,我想计算一个非常简单的文件的哈希值。我将它命名为“test.txt”,它的唯一内容是字符串“abc”,后跟一个新行(我只是按了回车键)。

现在,当我将“abc”和换行符放入 SHA256 生成器时,我得到了哈希

edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

但是当我将完整的文件放入同一个生成器时,我得到了哈希

552bab6864c7a7b69a502ed1854b9245c0e1a30f008aaa0b281da62585fdb025

差异从何而来?我使用了这个生成器(实际上,我尝试了几个,它们总是产生相同的结果):

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

请注意,如果没有换行符,这种差异不会出现。如果文件只包含字符串“abc”,则哈希为

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

对于文件以及内容。

【问题讨论】:

  • 可能由不同的换行表示引起。见here

标签: sha256


【解决方案1】:

正如我在评论中所指出的,差异是由不同操作系统中换行符的表示方式引起的(详见here):

  • 在 UNIX 和类 UNIX 系统上,换行符由换行符 (\n) 表示。
  • 在 DOS 和 Windows 系统上,换行符由回车符后跟换行符 (\r\n) 表示。

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

echo -en "abc\n" | sha256sum
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

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

【讨论】:

  • 谢谢你,特别是对 \n 和 \r\n 的显式计算。因此,我接受了这个答案,尽管两个答案都是正确的(而且我都赞成)。
【解决方案2】:

您遇到的问题可能来自新行的字符编码。 在 Windows 中,新行用 \r\n 转义,在 linux 中用 \n 转义。

这 2 个有不同的 dec 值(\r 是 13,\n 是 10)。

您可以在这里找到更多信息:

https://en.wikipedia.org/wiki/Newline https://en.wikipedia.org/wiki/List_of_Unicode_characters

【讨论】:

  • 感谢您的回答。我有类似的想法,但我不使用 linux(或 OS Mac),所以我看不出不同的编码可能来自哪里。这些文件是在 Windows 10 中使用 Notepad++ 创建的。
  • 您用来进行转换的站点可能运行 Linux。
  • 您使用的站点使用的是 github.com,并且所有 github 服务器都托管在 linux 机器上。我建议您使用应用程序来获取校验和
【解决方案3】:

即使我也面临同样的问题。但以十六进制模式提供数据有助于理解实际行为。

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

【讨论】:

    猜你喜欢
    • 2023-02-05
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多