比较 SHA-256 校验和:我需要检查多少个字符?

Comparing SHA-256 checksums: how many characters do I need to check?

校验和可用于验证文件(例如下载的 dmg)是否未被更改。但是检查整个校验和很乏味,因为 SHA-256 校验和有 64 个十六进制字符。幸运的是,该算法的设计使得内容差异很小的两个文件将具有非常不同的校验和。

不过,我想确定一下,我需要比较多少个字符才能安全地验证两个文件是否相同?比较前或后 5 个字符是否足够?

如果不检查所有字节,为什么要使用 SHA-256?还有更短的函数,如 SHA1、MD5 等

  • 如果您正在编写检查校验和的软件 - 您必须检查散列的所有字节
  • 如果您谈论的是人工肉眼比较 - 请务必使用复制+查找来检查它们。 Letter-by-letter比较更容易出错。

最终您要检查多少个字符取决于您想要正确的程度和您有多少文件。可能没有正确答案。

但我认为是的 - 对于大多数实际用途,检查前 5 个字符就足够了。我不知道 SHA256 背后的数学原理,但如果我们假设所有字符的概率均等,那么不同文件获得相同 5 个哈希字母的概率将是 16⁵ 分之一(大约百万分之一)。如果您有 100 个文件,这是相当不错的几率。

PS: Git 选择使用 7 个字符作为短版本的 SHA1。

PPS:cryptography/security中使用了SHA256。如果它只是关于典型 hands-on 任务的文件完整性 - 更短且安全性较低的哈希函数将非常适合。

快速

你应该检查每个字符。你不应该自己检查它。对于 Windows/Powershell 使用此:

get-filehash ./relativeLocationOfFileToCompare | select -expandproperty hash | compare-object theHashYouWantToCompare

get-filehash ./kali-linux-2020.4-vbox-i386.ova | select -expandproperty hash | compare-object 64f6ca69ccb3efc79e350977d33109c380a744c26158c4e3956141535242e2ca

更多

您需要检查每个字符,因为恶意方可能会造成部分冲突,即前 20 个字符相同。

我对为什么要使用校验和的理解

你想要软件。您转到实际的供应商网站,即 kali.org。您点击下载软件。 Kali.org 实际上并没有向您发送软件;他们告诉您的浏览器转到他们的 cdn 并下载软件。 cdn是稍微不可信的第三方。 cdn 可能已经流氓,或者 cdn 可能会受到损害。怎么办。

Kali.org 没有受到损害(如果 kali 受到损害,则存在更大的问题并且不使用校验和来解决它们)。因此,您可以从 Kali.org 中获取有效的校验和。您获得哈希并将每个字符与我提供的单行进行比较。您已保护自己免受非碰撞、部分碰撞的影响,并且您可能通过不手动比较每个字符而节省了一些时间。