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

问题描述

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

我还是想确定,所以我需要比较几个字符来安全地验证两个文件是否相同?比较例如前5个字符还是后5个字符就足够了吗?

解决方法

快速

您应该检查每个字符。你不应该自己检查它。对于 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 获取有效的校验和。你得到散列并将每个字符与我提供的单行字符进行比较。您已经保护了自己免受非碰撞、部分碰撞的影响,并且您可能通过不手动比较每个字符节省了一些时间。

,

如果不检查所有字节,为什么要使用SHA-256?有更短的功能,例如SHA1,MD5等。

  • 如果您正在编写检查校验和的软件-您必须检查哈希的所有字节
  • 如果您正在谈论手动比较-那么请确保使用copy + find进行检查。逐字母比较更容易出错。

最终,您要检查多少个字符取决于您要纠正的错误程度以及拥有的文件数量。可能没有正确的答案。

但是我认为是的-对于大多数实际目的,检查前5个字符就足够了。我不知道SHA256背后的数学原理,但是如果我们假设所有字符都是相同的概率,那么不同文件获得相同的5个散列字母的概率将是16分之一(大约百万分之一)。如果您有100个文件,那是非常好的机会。

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

PPS:SHA256用于加密/安全性。如果只是为了完成典型的手动任务而需要文件完整性,那么较短且安全性较低的哈希函数将非常适合。