从官方网站下载的ISO文件进行验证是否值得?

我从https://www.ubuntu.com/download下载了ISO文件,选择了默认的“Ubuntu桌面版”选项。

该网站链接了https://tutorials.ubuntu.com/tutorial/tutorial-how-to-verify-ubuntu这个页面,提供了如何验证Ubuntu的指导。

这似乎相当繁琐,我在想从官方网站下载的ISO文件是否存在问题。我注意到验证过程本身需要我下载我不熟悉的软件,这给我引入了另一个攻击向量,尽管我正在关闭另一个。

就我所知,我打算仅使用Live USB,并不完全安装Ubuntu。这有影响吗?


9我的政治答案是“是的,去做吧”。除了很久以前第一次下载时可能做过一次之外,我从来没有这样做过。我总是在下载和评估软件或补丁/错误修复程序,而不愿意费心去做额外的步骤。此外,我的系统都不是生产环境的,如果它们明天出现问题,我只会耸耸肩然后继续前进。 - WinEunuuchs2Unix
14Torrent是一种替代选择,如果你不想检查md5sum的话。当你通过Torrent获取文件时,它会自动进行检查 :-) 使用Torrent方法通常比普通下载更快,但一些互联网服务提供商会阻止它,因为他们认为它只用于非法目的。 - sudodus
潜在的问题是:是否曾经有过恶意分发被篡改的Ubuntu ISO文件的记录? - rackandboneman
2MD5校验和在处理大文件时的主要用途是确保下载文件的完整性(例如,检测传输是否提前取消),而不是为了减少中间人攻击的可能性。 - rexkogitans
1@rackandboneman 不,那根本不是核心问题。 - David Richerby
16有趣的事实:你可能会花更多时间来问这个问题,而不是在你一生中计算校验和。 - el.pescado - нет войне
绝对是一个值得的步骤。相关链接:https://askubuntu.com/questions/566650/md5-checksum-not-matching?rq=1 - Elder Geek
1@rackandboneman Ubuntu?我不知道有这样的情况。但是不久前Linux Mint确实发生过类似的事情。 - helrich
1两年前薄荷的失败证明了你总是需要检查它。 - Rinzwind
8个回答

是的,这是值得的。

只需要几秒钟来对下载的ISO文件进行sha256sum等操作,这样可以确保你没有受到中间人攻击等。除此之外,这几秒钟也是为了防止因为下载错误导致的时间浪费和调试工作(其他人不会遇到这些问题,因为他们的下载没有出错,例如你可能因为网络问题而尝试调试,但实际上是因为少了几个错误的位导致网络出现问题...)将校验和检查视为非常廉价的保险。

通常情况下,用于sha256sum的软件将来自另一个源头(通常是旧版本,甚至偶尔是不同的操作系统/发行版),它非常小,并且对于我们大多数人来说已经存在。

此外,它允许我从本地镜像下载,但因为我从Canonical源获取了sha256sum,所以我有保证镜像没有篡改它。再次强调,这是一种非常廉价的保险,只需花费我大约3秒钟的时间。


12然而,如果下载使用了HTTPS传输方法,那么所有的完整性检查已经完成。 - Nayuki
17@Nayuki 如果文件在服务器上出现损坏(磁盘/文件系统驱动器故障,镜像错误等),那么这些完整性检查将毫无意义。 - Ruslan
7@奈由纪 仅因为您通过HTTPS访问网站并不意味着从您的个人电脑到存储下载文件的链路是端对端加密的。请参阅几年前的谷歌数据中心互连问题。 - user
33如果有人中间人攻击了ISO镜像,谁能保证他们在你在网站上查看时没有中间人攻击校验和呢?(如果你使用的是镜像,这将非常有用。)很少见到校验和和下载来源于同一实体。 - Lan
2是的,我同意Lan的观点(尤其是如果ISP进行中间人攻击)。但是我总是从另一个设备下载校验和(通常在同一建筑物上,并使用wget命令来获取md5sum),如果我认为风险足够大,我可以通过VPN连接到不同位置上的设备并使用不同的ISP进行下载,甚至可以来自不同州...但是对于我来说,从不同的网站使用wget通常已经足够了。 - guiverc
1@Nayuki 另外,通过HTTPS下载也不能保证提供文件的服务器是出于善意行动。 - Shadur
16永远不要假设校验和能够检测到中间人攻击。给定的校验和也可能是伪造的。正确的方法是验证“签名”,但这需要使用GPG(我只做过一次,而且很麻烦)。 - micheal65536
3@Michael 这仍然需要你获取你想要信任的实体的公钥。这通常会导致与校验和完全相同的问题。 - Voo
1从ISO文件克隆到USB驱动器后,您还可以使用校验和方法来验证克隆过程是否成功,但这并不简单,因为您必须从USB驱动器中读取正确数量的字节。在此链接上有一个用于此任务的工具,一个小型shell脚本。 - sudodus

是的,非常推荐您验证所下载的图像,以下是一些原因:

  • 只需几秒钟的时间,就可以告诉您文件的完整性是否正确,也就是说,文件没有损坏。(由于技术原因,如不稳定的互联网连接,可能导致传输错误,这是文件损坏的常见原因,正如@sudodus评论中所提到的。)
  • 如果文件损坏,并且您将此ISO镜像刻录到CD/USB驱动器中,它将无法工作,或者在安装过程中可能失败,这将导致浪费时间和光盘。
  • 您可以确保使用的是任何类型的ISO镜像或软件的官方干净版本,而不是修改过的版本(可能是攻击者制作的),请参阅此报告:Watch Dogs pirates hit by scurvy Bitcoin-mining malware
如果你已经有一个GNU Linux发行版,你可以使用md5sum,如果你在Windows上,你可以使用WinMD5Free
希望能对你有所帮助。

3对于Windows系统,您可以使用内置的certutil工具: https://superuser.com/a/898377/521689 - Kanchu
1我也回答了,但我给你的回答点赞,因为我觉得它也很好地回答了问题,而且对更多读者来说很有用,因为它没有像其他回答那样涉及太多技术细节。 - bitoolean
@sudodus 网络有自己的完整性检查。虽然错误可能会绕过这些检查(TCP只使用简单的校验和,无法检测单词交换,但大多数链路使用CRC),但这通常不是人们所担心的事情。 - Barmar
如果攻击者能够破坏一个文件,那么改变MD5框中的值也应该是可以实现的。 - Pascal Engeler

检查你的/proc/net/dev,看看你到目前为止收到了多少个错误的TCP帧。如果你看到一个个位数值(希望是零),请继续阅读。如果你有很多网络错误,那么务必使用MD5来验证你的下载(尽管我更愿意调查根本原因,因为不可靠的网络意味着你无法信任通过HTTP接收到的任何内容)。
当你通过TCP进行下载时,它会对所有传输的数据进行校验和,所以出现完全相同大小的损坏下载的可能性非常小。如果你确信你正在从官方网站下载(如果你使用HTTPS并且证书检查通过,通常就是如此),验证你的下载是否完整通常就足够了。良好的网络浏览器通常会自动进行检查,如果它们没有获得预期的数据量,会显示类似于“下载失败”的提示,尽管我曾经见过一些浏览器只是决定保留不完整的文件而不向用户显示任何信息,在这种情况下,你可以手动检查文件大小。
当然,验证校验和仍然具有其价值,在服务器上下载的文件损坏的情况下可以保护你,但这种情况并不经常发生。然而,如果你打算将下载用于重要的事情,这是一个值得采取的步骤。
如@sudodus在评论中所说,使用Bittorrent而不是HTTPS是另一个选择,因为种子客户端在处理不完整/损坏的数据时比网络浏览器做得更好。
请注意,校验和并不能真正防止你受到攻击,这就是HTTPS的作用。

5TCP校验和对于像ISO文件这样大的数据来说不够大。它只有16位;在嘈杂的链路上,很有可能会出现一些损坏。 - Mark
1@Mark 对于一个大的ISO文件,将会有很多TCP校验和:每个需要传输数据的TCP段都会有一个校验和。 - Anthony Geoghegan
3@AnthonyGeoghegan,没错。每个片段都有独立的机会被损坏,考虑到ISO文件中涉及的片段数量,很有可能其中一个片段会以与该片段校验和仍然匹配的方式被损坏。 - Mark
1@Mark,你能检查一下你的/proc/net/dev并告诉我你收到了多少个错误的TCP帧吗?我的电脑在运行了140天后还是0个。如果我没记错的话,经过认证的千兆以太网设备提供的误码率应该是10^-10或更好。当然,这都取决于你对“好机会”的定义... - Dmitry Grigoryev
1@Mark 你使用的是哪种没有CRC或类似功能的第二层协议?以太网具有CRC检查和TCP校验和。我还没有计算过这个,但我无法理解你如何得出“相当大的机会”的结论。 - Voo
1根据我所了解,@DmitryGrigoryev,/proc/net/dev 只记录以太网帧的校验和错误:即您计算机与路由器之间的链路上的错误。它无法检测您与服务器之间其他二十多个链路上的错误。 - Mark
@Mark 确实,但我不希望你的供应商或托管提供商使用比你更不可靠的设备。而且零乘以两打仍然是零。 - Dmitry Grigoryev
2@Voo 以太网的循环冗余校验(CRC)是无用的,因为即使在不应该改变的情况下,它也会被重新计算:http://www.evanjones.ca/tcp-and-ethernet-checksums-fail.html - Navin
1@Navin 谢谢你提供的链接。这确实改变了计算结果。 - Voo
@Mark 感谢你的澄清。我不知道TCP校验和并非完全可靠:https://dl.acm.org/citation.cfm?doid=347059.347561 - Anthony Geoghegan
@Navin 当你的开关有问题或者服务器上的文件损坏时,是没有用的。 - Dmitry Grigoryev

是的,但Ubuntu似乎让它比应该更难。

在最好的情况下,您只需下载foo.iso和foo.iso.sig并单击.sig文件(或在.sig文件上使用shell上的gpg),在导入密钥一次后。这需要几秒钟。

Ubuntu似乎通过强制您从文件中检查sha256总和来使其变得更加复杂,而仅有文件本身被签名。这对他们很方便,但对他们的用户来说更费力。

另一方面,当文件仅由sha256sum * >SHA256SUMS生成时,您可以使用sha256 -c进行检查,并获得OK/Bad/Not-Found作为输出。


我亲身经历了不进行校验和的困难。我曾经刻录了一个ISO文件到光盘上,在下载过程中出现了损坏,结果无法启动或者在运行时出现错误。
就像其他人说的那样,这只需要很少的时间。

那次经历最糟糕的地方就是如果你再次刻录ISO文件,光盘上会出现同样的错误。 - thomasrutter
1这就是为什么我使用可重写的CD和DVD。 :-) - fixit7
7我已经有十多年没有写过任何CD/DVD了。当有大量廉价的U盘可供选择时,写入和购买它们都不值得花费时间和金钱。 - phuclv

其他人已经给出了我忘记的技术细节的答案(尽管我是一名程序员,我的工作不涉及网络通信),所以我只想告诉你一个个人经验。
很久以前,当我经常刻录CD时,有一次我下载了一个Linux发行版ISO,它看起来下载正确。但CD却失败了,所以我检查了下载的文件,它没有匹配。因此,我重新下载并成功了。自从我成为一名高级电脑用户和编程人员以来,这种情况只发生过一次,在15年内(我从11岁开始使用电脑,19年前,并且刻录了一千多张光盘)。但这证明它确实可能发生。
它也曾经在BitTorrent上发生过一两次,所以它也不是绝对可靠的。当强制重新检查下载的文件时,它会标识出损坏的部分。
我的结论是HTTP(依赖于TCP)可能是最安全的,但Internet意味着存在你的设备和服务器之间的中间节点,而无法预测途中会发生什么(数据包甚至经常丢失),有时计算机可能无法确定数据是否正确。
没人能回答是否值得为你麻烦一番 - 这取决于上下文,我相信你自己可以判断。对我来说,大部分时间都不值得。不过,如果我要安装一个操作系统,我会在下载的镜像之前检查一下。
注意:我只有一两次注意到下载损坏并不意味着只有那时发生过。也许其他时候它不会妨碍你,所以你没有注意到。
编辑:甚至在工作中,我还有其他更有经验的程序员争论(甚至带有相当的愤怒)这些数据完整性验证哈希使得我们能够“知道”一个文件是否与原始文件完全相同,但我知道(我已经阅读过)两个文件产生相同的哈希并不意味着它们是相同的 - 它只是意味着它们不可能是不同的。它们有用的方式是当文件不相同时,尤其是当它们非常不同的时候,它们的哈希码几乎永远不会相同(这个测试失败的可能性甚至更小)。简而言之 - 如果哈希码不同,你就知道文件是不同的。

你只看到了一个使用案例,在大规模自动化设置中,它有助于进行验证;在执行任何需要处理图像的操作之前,运行脚本来检查。

媒体检查

现代版本(20.04 及更高版本)会自动进行扫描。我通常会在每天首次启动时进行扫描(如果在同一台设备上的同一天重新启动,则可能会跳过扫描)。

如果您不想事先进行检查,您可以在安装后切换到终端,并始终执行以下操作:

dmesg |grep squashfs

寻找错误。标准安装应只在扫描dmesg时找到版权信息;如果出现任何其他带有squashfs的行,我会将其视为安装可能不可信。

如果使用较旧的版本(20.04之前的版本),我总是会进行手动CD完整性检查,主要是因为我发现将数据写入USB媒体最麻烦(每年我遇到10多次失败,即使这只占写入数量的一小部分;但仍然是显著的)。

Ubuntu 23.04桌面版

实际验证的方式因版本而异,在Ubuntu 23.04桌面版系统中,我会使用以下命令:

sudo journalctl | grep casper-md5check

我要寻找的内容是

May 11 08:37:42 ubuntu casper-md5check[3924]: Checking ./casper/install-sources.yaml..../casper/install-sources.yaml: OK
May 11 08:37:42 ubuntu casper-md5check[3924]: Checking ./casper/vmlinuz..../casper/vmlinuz: OK
May 11 08:37:47 ubuntu casper-md5check[3924]: Checking ./casper/initrd......./casper/initrd: OK
May 11 08:37:47 ubuntu casper-md5check[3924]: Checking ./boot/memtest86+x64.bin..../boot/memtest86+x64.bin: OK
May 11 08:37:47 ubuntu casper-md5check[3924]: Checking ./boot/grub/grub.cfg..../boot/grub/grub.cfg: OK
May 11 08:37:47 ubuntu casper-md5check[3924]: Checking ./boot/grub/loopback.cfg...../boot/grub/loopback.cfg: OK
May 11 08:37:47 ubuntu casper-md5check[3924]: Check finished: no errors found.
May 11 08:37:47 ubuntu systemd[1]: Finished casper-md5check.service - casper-md5check Verify Live ISO checksums.

我关注的关键信息是(即,我可能需要多次运行此命令,因为该过程将继续作为后台任务运行):

检查完成:未发现错误。

ISO镜像验证

对于ISO镜像预写入验证,或者如何验证您的Ubuntu下载,我使用zsync进行下载,并在下载结束时检查ISO镜像的完整性;我倾向于相信这一点,并在启动时进行自检。

如果我通过种子下载,我倾向于在另一台设备上使用wget下载的校验和文件进行快速sha256sum检查。无论如何,我通常会对以前下载的ISO镜像文件执行此检查。

为什么要这样做?

这些检查只需几秒钟到一分钟的时间。如果有一个位出错,调试安装或损坏的数据可能需要几个小时,如果你幸运的话,更有可能是几天、几周或几个月。

每天通常至少有一个错误报告被提交(在launchpad上;我通过#ubuntu-bugs-announce进行监控),这些报告是由那些遇到问题并认为这是一个本可以通过这些检查来预防的错误的用户提交的。这些错误报告只是被标记为“无效”,并附上他们的dmesg输出中的几行内容。因此,我经常看到用户浪费数小时尝试重复永远不会成功的过程(通常是数天),因为他们跳过了这些检查,从而使用了已损坏的媒体开始,其中应该预期存在问题。
我认为这是一种非常廉价的保险。

这是有些重复的问题;来自另一个被标记为重复的问题,因此将被删除。我觉得它有一些值得保留的额外细节。https://askubuntu.com/questions/1311183/do-i-need-to-check-the-integrity-of-a-ubuntu-install 这个链接更加更新,并提供了示例(#ubuntu-bugs-announce)。 - guiverc
如果你想要了解不同的解释,你也可以阅读https://bugs.launchpad.net/ubuntu/+bug/1874662,这个罕见的错误被标记为重复(直接粘贴无效/squashfs问题会更常见且更快)。 - guiverc