如何验证下载的文件
作者选择 Electronic Frontier Foundation 作为 Write for DOnations 计划的一部分接受 300 美元的捐款。
介绍
您可能已经下载了一些开源软件,例如 Linux 发行版 ISO,下载链接旁边是下载文件校验和的链接。 你有没有想过那个校验和链接是干什么用的? 该校验和用于验证您刚刚下载的文件的完整性。
2016 年 2 月 20 日,流行的 Linux 发行版 Linux Mint 的网站遭到 黑客攻击 ,用于安装该发行版的 ISO 遭到入侵。 在发现受感染的 ISO 之前,许多人下载并可能安装了带有后门的 Linux Mint 版本。
如果下载更改后的 ISO 的个人执行文件验证以查看他们下载的内容是否与原始文件具有相同的校验和,则可以在用户级别避免这种危险的安装。 被黑的 ISO 具有与原始 ISO 完全不同的校验和。
虽然文件验证可以表明文件可能已被黑客入侵,但它通常更有助于向用户显示他们下载的文件不完全正确或在下载过程中已被更改。 如果在下载过程中丢弃了 TCP 数据包,那么您下载的文件可能只是一个毛病,执行文件验证会让您知道您下载的内容与源服务器上可用的内容不同。
在本教程中,您将了解什么是文件验证,为什么它很重要,以及如何使用命令行工具在各种操作系统上进行验证。
先决条件
在本文中,您将使用每个主要操作系统中内置的命令行工具进行文件验证。
您需要一个文件来验证,以及该文件的 MD5 和 SHA1 校验和。
我们将使用 Ubuntu 安装 ISO 进行文件验证。 下载适用于 64 位 PC(amd64、x86_64)的 Ubuntu Minimal CD ISO。 下载时,请注意下载链接旁边的 MD5 和 SHA1 总和。 您将在整个教程中使用这些校验和。
文件验证的工作原理
文件验证,也称为 哈希 ,是检查您机器上的文件是否与源文件相同的过程......当您对文件进行哈希处理时,您会得到一个 校验和 [ X202X],具有设定长度的随机字母数字字符串。 散列文件不会加密文件,您无法获取校验和并通过算法运行它以获取原始源文件。
生成校验和的过程通常称为 单向加密函数 。 当您对文件执行散列时,它被“汇总”为一串随机字符。 例如,假设您有一个包含 1000 个字符的文档。 当使用 MD5 算法对文件进行哈希处理时,生成的校验和将为 32 个随机字符。 如果您要散列一个 2000 个字符长的文件,则生成的 MD5 校验和仍然是 32 个字符。 即使源文件只有 10 个字符长,MD5 校验和仍然是 32 个随机字符。
每次对同一个文件执行散列时,只要该文件的每一位都没有更改,您将始终在散列中得到相同的字符串。 但是,即使有一点不同,比如文件中有一个额外的空间,校验和也会完全不同。
您通常会看到两种类型的校验和用于文件验证,MD5 或 SHA。
MD5 算法在加密领域受到了很多批评,因为它很容易被破解,但在文件验证方面这不是问题。 在验证文件完整性时,加密工具的弱点并不重要。 这对我们有好处,因为 MD5 是一个成熟的规范,并且在执行哈希方面比其他方法更快。
最近,用于校验和的 SHA 散列算法的使用有所增加,因为它是某些现代加密中使用的散列算法。 然而,与 MD5 不同的是,SHA 有不同的版本,检查时使用正确的版本很重要。 版本标识为 1、2、3 等数字,或 SHA 连续运行的次数,如 256、384 或 512。 您使用的校验和应指定要使用的 SHA 版本。 如果该站点仅指定带有标签 SHA 的散列,没有数字,则可以安全地假设他们使用的是 SHA1。
出于文件验证的目的,这两种方法同样有效。 尽管算法不同,但两者都将返回具有设定长度的随机字符串,尽管 MD5 哈希比任何 SHA 哈希都短。
注意:有时也会提供 PGP/GPG 签名用于文件验证目的。 这些类型的签名不是很常见,而且需要更多的检查。 他们要求您下载校验和、站点的公钥,并在您的系统上设置 gpg
以执行检查。 这些步骤超出了本教程的范围。
检查下载文件的哈希值提供了两种不同的保证,它们都是值得的。 首先,通过匹配的校验和,您可以确定您刚刚下载的文件与源文件相同,并且没有被第三方更改。 其次,您知道文件在传输过程中没有损坏或修改。 这两种情况都很重要,因为如果发生任何一种情况,您的下载可能对您的机器有害或根本无法工作。
既然您知道什么是校验和以及为什么要对文件执行检查,那么让我们来看看如何为您的操作系统执行此操作。 我们将从查看 Linux 开始。
在 Linux 上执行文件验证
大多数 Linux 发行版都有用于每种散列算法的命令行工具。 工具名称的模式是“HASH-TYPE”加上单词“sum”。 所以要使用 MD5 哈希,程序名称是 md5sum
。 要使用 SHA 256 进行散列,命令是 sha256sum
。 如果您不确定确切的名称是什么,请输入哈希算法名称,然后按两次 Tab,大多数发行版将显示以该算法名称开头的所有命令。 我们将在下面介绍一些流行的检查。
我们将使用 MD5 散列算法执行我们的第一次检查。 执行 md5sum
命令并将路径传递给您要散列的文件:
md5sum mini.iso
结果将如下所示:
Output8388f7232b400bdc80279668847f90da mini.iso
以“8388f”开头的随机字符串是校验和,您需要将其与下载页面上提供的校验和进行比较。
由于对文件的任何修改都会导致完全不同的校验和,为了节省时间只需检查前几个字符,最后几个与源相同,而不是每个字符。
例如,如果您想快速验证“mini.iso”的校验和是否匹配,请验证两个校验和是否以“8388f”开头并以“f90da”结尾。 如果两者都匹配,那么很有可能(几乎 100%)完整的哈希是相同的。
如果你想要 100% sure,只需从网站复制并粘贴校验和到本地检查的输出下,看看每个字符是否对齐:
Output8388f7232b400bdc80279668847f90da mini.iso 8388f7232b400bdc80279668847f90da
现在让我们看看检查 SHA 哈希。 最常见的 SHA 哈希命令是 sha1sum
和 sha256sum
。 通过将路径传递给文件来执行 sha1sum
命令:
sha1sum mini.iso
结果将与此类似:
Outputcce936c1f9d1448c7d8f74b76b66f42eb4f93d4a mini.iso
将结果值与网页上的值进行比较以验证它们是否匹配。
现在让我们看看在 macOS 上验证文件。
在 macOS 上执行文件验证
与 Linux 不同,macOS 只有两个哈希命令(md5
和 shasum
),而不是每个算法一个。 但是我们仍然可以仅使用这些工具执行我们需要的所有检查。
尽管有不同的应用程序和不同的操作系统,但这些工具生成的哈希值在每个操作系统上都是相同的。
由于 md5
是一个独立的算法,它在 macOS 上是它自己的命令。 执行 md5
命令,将路径传递给您要检查的文件:
md5 mini.iso
结果将如下所示:
OutputMD5 (mini.iso) = 8388f7232b400bdc80279668847f90da
如您所见,macOS 上的输出与 Linux 上的输出并不完全相同,但仍然显示文件名和 32 个字符的随机字符串。 将字符与原始 MD5 校验和进行比较,并确保它们匹配。
现在让我们看看验证 SHA 校验和。 macOS 有一个用于执行任何 SHA 检查的实用程序,称为 shasum
。 运行它时,您提供所需的 SHA 检查类型作为参数。
执行以下命令,使用 -a
标志指定 SHA1:
shasum -a 1 mini.iso
结果将如下所示:
Outputcce936c1f9d1448c7d8f74b76b66f42eb4f93d4a mini.iso
将此值与原始文件的 SHA1 哈希值进行比较。 如果它们不匹配,您应该尝试下载文件并再次检查其哈希值。
如果您需要执行 SHA 256 检查,命令将是 shasum -a 256 mini.iso
。 如果您不提供类型,则默认为 SHA1。
接下来,让我们看看在 Windows 上验证文件。
在 Windows 上执行文件验证
Windows 7 及更高版本包括 certutil
应用程序,可以处理我们所有的散列需求。 输出看起来与 Linux 和 macOS 非常不同,但校验和将相同并且同样有效。 下面的两个示例都使用 PowerShell。
命令格式为certutil -hashfile path/to/file ALGORITHM
。
命令“certutil”不区分大小写,因此“CertUtil”、“certUtil”和“certutil”都有效。 但是,该算法区分大小写,这意味着“md5”不起作用,您需要输入“MD5”。
要验证 mini.iso
文件的 MD5 哈希,请执行以下命令:
certutil -hashfile mini.iso MD5
结果将如下所示:
OutputMD5 hash of file mini.iso: 8388f7232b400bdc80279668847f90da CertUtil: -hashfile command completed successfully.
对于 SHA 算法,我们将执行相同的命令,但我们将使用 SHA1
而不是 MD5
。
SHA
之后的数字指定 SHA 的不同版本或迭代。 因此,我们使用 SHA
或 SHA1
进行 SHA1 散列,或者如果我们需要 SHA 256 算法,则使用 SHA256
。
certutil -hashfile mini.iso SHA1
结果将如下所示:
OutputSHA1 hash of mini.iso: cce936c1f9d1448c7d8f74b76b66f42eb4f93d4a CertUtil: -hashfile command completed successfully.
将生成的哈希值与下载页面上的哈希值进行比较,以确保它们匹配。
结论
无论您是要确保刚下载的文件在下载过程中没有损坏,还是要验证不法分子没有入侵下载服务器,检查文件哈希所花费的额外时间都是值得的。
如果命令行对于简单的文件验证来说太不方便了,这里有一些基于 GUI 的工具,您可以使用以下工具: