如何验证下载的文件

验证下载的文件可确保您下载的内容是您的想法。在本教程中,您将了解到什么是文件验证,为什么它很重要,以及如何使用命令行工具在各种操作系统上进行验证。

作者选择电子前沿基金会作为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位个人电脑的Ubuntu Minimal CD ISO (amd64,x86_64)。 在下载时,请注意下载链接旁边的MD5和SHA1总和。 您将在整个教程中使用这些校验和。

文件验证如何工作

文件验证,也称为哈希 ,是检查您的机器上的文件与源文件是否相同的过程。当您散列文件时,您将得到一个校验和 ,一个随机字母数字字符串长度。 散列文件不会对文件进行加密,您不能通过算法将校验和运行回原始源文件。

生成校验和的过程通常称为单向加密函数 当您对文件执行散列时,它会被“汇总”为一串随机字符。 例如,假设您有一个包含1000个字符的文档。 当使用MD5算法对文件进行散列时,结果校验和将是32个随机字符。 如果您要散列2000个字符长的文件,则生成的MD5校验和仍然是32个字符。 即使源文件只有10个字符长,MD5校验和仍然是32个随机字符。

每当你对同一个文件执行散列操作时,只要该文件的每一位都没有改变,你总是会在散列中获得相同的字符串。 但是,即使有一件事情不同,就像文件中的额外空间一样,校验和也会完全不同。

有两种类型的校验和通常会用于文件验证, MD5SHA

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

结果将如下所示:

8388f7232b400bdc80279668847f90da  mini.iso

该随机字符串以'8388f'开头,是校验和,这是您需要与下载页面上提供的校验和进行比较的。

由于对文件的任何修改都会导致完全不同的校验和,为了节省时间,只需检查前几个字符,最后几个字符与源代码相同,而不是每个字符。

例如,如果您想快速验证'mini.iso'的校验和是否匹配,请验证两个校验和都以'8388f'开始并以'f90da'结尾。 如果两者匹配,那么完全散列很可能(几乎100%)是相同的。

如果您想100%确定,只需从本地检查输出下的网站复制并粘贴校验和,以查看每个字符是否排齐:

8388f7232b400bdc80279668847f90da  mini.iso
8388f7232b400bdc80279668847f90da

现在我们来看看检查SHA散列。 最常见的SHA哈希命令是sha1sumsha256sum 通过将路径传递给文件来执行sha1sum命令:

sha1sum mini.iso

结果将如下所示:

cce936c1f9d1448c7d8f74b76b66f42eb4f93d4a  mini.iso

将结果值与网页上的值进行比较以验证它们是否匹配。

现在让我们看看在macOS上验证文件。

在macOS上执行文件验证

与Linux不同,macOS只有两个哈希命令( md5shasum ),而不是每个算法都有一个。 但我们仍然可以使用这些工具执行我们所需的所有检查。

尽管不同的应用程序和不同的操作系统,但这些工具产生的散列在每个操作系统上都是相同的。

由于md5是独立算法,因此它是macOS上的自己的命令。 执行md5命令,将路径传递给您要检查的文件:

md5 mini.iso

结果将如下所示:

MD5 (mini.iso) = 8388f7232b400bdc80279668847f90da

如您所见,macOS上的输出与Linux上的输出不完全相同,但仍显示文件名和32个字符的随机字符串。 将字符与原始MD5校验和进行比较,并确保它们匹配。

现在我们来看看验证SHA校验和。 macOS有一个实用程序用于执行任何称为shasum SHA检查。 运行它时,您提供了您想要的SHA检查类型作为参数。

执行以下命令,使用-a标志指定SHA1:

shasum -a 1 mini.iso

结果将如下所示:

cce936c1f9d1448c7d8f74b76b66f42eb4f93d4a  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

结果将如下所示:

MD5 hash of file mini.iso:
8388f7232b400bdc80279668847f90da
CertUtil: -hashfile command completed successfully.

对于SHA算法,我们将执行相同的命令,但我们将使用SHA1而不是MD5

SHA之后的数字指定SHA的不同版本或迭代。 所以我们使用SHASHA1来进行SHA1散列,或者如果我们需要SHA 256算法,则使用SHA256

certutil -hashfile mini.iso SHA1

结果将如下所示:

SHA1 hash of mini.iso:
cce936c1f9d1448c7d8f74b76b66f42eb4f93d4a
CertUtil: -hashfile command completed successfully.

将结果散列与下载页面上的散列进行比较,以确保它们匹配。

结论

无论您是确保刚刚下载的文件在下载过程中没有被破坏,或者验证恶意的人没有入侵下载服务器,检查文​​件哈希所花费的额外时间是值得的。

如果命令行对于简单的文件验证来说太麻烦了,这里有一个
您可以使用一些基于GUI的工具: