如何验证下载文件(pgp、sha 等)的校验和?

信息安全 哈希 中间人 正直
2021-08-27 15:45:33

也许我对通过 Internet 下载的软件的验证疏忽了,但我(或我见过的任何人)从未尝试过验证我下载的内容的校验和。因此,我不知道如何验证下载项目的完整性。

那么如何验证下载文件的校验和呢?

4个回答

通常这将在所有者方面开始,显示您希望下载的文件的校验和。看起来像下面这样:

md5: ba411cafee2f0f702572369da0b765e2

sha256: 2e17b6c1df874c4ef3a295889ba8dd7170bc5620606be9b7c14192c1b3c567aa

现在取决于您使用的操作系统,一旦您下载了所需的文件,您就可以计算它的哈希值。首先导航到您下载的文件的目录,然后:

视窗

CertUtil -hashfile filename MD5 / CertUtil -hashfile filename SHA256

Linux

md5sum filename / sha256sum filename

苹果系统

md5 filename / shasum -a 256 filename


从网站检查哈希所带来的问题是它不能确定文件是否可以安全下载,只是您下载的是正确的文件,逐个字节。如果该网站已被入侵,那么您可能会看到另一个文件的哈希值,而这又可能是恶意的。

校验和 vs 哈希 vs 签名

您在问题标题中提到了校验和、PGP 和 SHA,但这些都是不同的东西。

什么是校验和?

校验和只是以高度的信心验证没有导致复制文件与原始文件不同的损坏(对于“高”的不同定义)。一般来说,校验和不能保证没有进行故意修改,并且在许多情况下,在仍然具有相同校验和的情况下更改文件是微不足道的。校验和的示例是 CRC、Adler-32、XOR(奇偶校验字节)。

什么是加密哈希?

加密哈希提供了简单校验和的附加属性(所有加密哈希都可以用作校验和,但并非所有校验和都是加密哈希)。

加密散列(未损坏或不弱)提供碰撞和原像抗性。防冲突意味着创建两个具有相同哈希的文件是不可行的,而原像抵抗意味着创建与特定目标文件具有相同哈希的文件是不可行的。

MD5 和 SHA1 在碰撞方面都被破坏了,但对原像攻击是安全的(由于生日悖论碰撞更容易生成)。SHA256 是当今常用的,并且对两者都是安全的。

使用加密哈希来验证完整性

如果您计划使用散列来验证文件,则必须单独的可信来源获取散列。从您下载文件的同一站点检索哈希并不能保证任何事情。如果攻击者能够修改该站点上的文件或拦截和修改您的连接,他们可以简单地将文件替换为恶意版本并更改哈希以匹配。

如果您的对手可以修改合法文件(例如,提供看似无辜的错误修复),则使用不抗冲突的哈希可能会出现问题。他们可能能够在原始文件中创建一个无辜的更改,使其具有与恶意文件相同的哈希值,然后他们可以将其发送给您。

验证哈希的最佳示例是从软件的受信任网站(当然使用 HTTPS)检索哈希,并使用它来验证从不受信任的镜像下载的文件。

如何计算文件的哈希值

在 Linux 上,您可以使用md5sumsha1sumsha256sum等实用程序。Connor J 的回答给出了 Windows 的示例。


什么是签名?

与校验和或哈希不同,签名涉及秘密。这很重要,因为虽然文件的哈希值可以由任何人计算,但签名只能由拥有秘密的人计算。

签名使用非对称加密,因此有一个公钥和一个私钥。使用私钥创建的签名可以通过公钥验证,但公钥不能用于创建签名。这样,如果我用我的密钥签名,你就可以确定是我。

当然,现在的问题是如何确保使用正确的公钥来验证签名。密钥分发是一个难题,在某些情况下,您又回到了使用哈希的位置,您仍然必须从单独的可信来源获取它。但正如这个答案所解释的,你甚至可能不需要担心它。如果您通过包管理器或使用签名的可执行文件安装软件,则可能会使用预安装的公钥为您自动处理签名验证(即,密钥分发由对安装介质和安装者的隐含信任处理)。


相关问题

我使用快捷方式脚本自动验证Linux 上的 SHA 256 和

如果您使用sha256sum filename,您必须自己比较这些总和,这很难、不可靠和缓慢。

解决方案:相反,您可以在您的.bashrcor.zshrc配置中创建一个简单的函数并按以下方式运行它:

sha256 <expected-sha-256-sum> <name-of-the-file>

它将在单个命令中将预期的 SHA 256 总和与实际的总和进行比较。

功能是:

sha256() {
    echo "$1 $2" | sha256sum --check
}

在此处找到更多详细信息

Linux 特定

TLDR;

sha256sum -c thefile.sha
// thefile: OK

成功!除非您在不包含 shasum 目标的目录中运行该命令,否则您将获得:

sha256sum: thefile: No such file or directory
thefile: FAILED open or read
sha256sum: WARNING: 1 listed file could not be read

/TLDR;

自己验证

使用 md5sum 手册页可以找到您需要知道的所有内容:

man md5sum

不是因为md5sum它特别有用,而是因为如果您转发搜索/BUGS,您将被视为对您的选项的一个很好的概述:)

不要将 MD5 算法用于安全相关目的。相反,使用 SHA-2 算法,在程序 sha224sum(1)、sha256sum(1)、sha384sum(1)、sha512sum(1) 或 BLAKE2 算法中实现,在 b2sum(1) 中实现

他们都有相同的选项,除了b2sum有一个额外的--length选项。

以下产生一个sha签名:

sha256sum yourFilename > yourFilename.sha

其中yourFilename.sha包含:

9f22b735f8f416bb8195cef9436ddec04db709132dae87137026b9725cf5678a  yourFilename

检查只需使用--check选项运行:

sha256sum -c yourFilename.sha
// yourFilename: OK

如果这看起来有点不满意和神奇,你可以去手动路线:

sha256sum yourFilename > homebrewSHA

并将其与您从 Internet 下载的 sha 文件进行比较:

diff suspiciousInternetSHA homebrewSHA

如果 diff 打印出任何东西,那么那些不是您正在寻找的机器人。否则,你很好!