许多提供下载的网站还提供可供下载的文件的 MD5 或 SHA1 哈希值。
一个例子-

向最终用户提供这种设施背后的安全目的是什么?
许多提供下载的网站还提供可供下载的文件的 MD5 或 SHA1 哈希值。
一个例子-

向最终用户提供这种设施背后的安全目的是什么?
一个加密散列函数是每个人都可以高效地计算函数(有关于它没有什么秘密的),并提供了一些有趣的特点:
对于手头的情况,碰撞不是问题。原像抗性是指不可能找到一条消息m,该消息 m 在经过哈希处理后会产生给定的输出。第二个原像抗性类似:您知道一条消息m,它在散列时会产生一些输出x,并且您找不到另一条产生相同输出的消息m'(与m不同)。如何实现这种不可能性是一个相当复杂的主题(参见this)。
小输出大小是我们使用它们进行下载的原因。如果您从信誉良好的来源(发布者的启用 SSL 的网站)获得 MD5 哈希,那么您可以从任何地方下载实际数据,例如像BitTorrent这样的 P2P 网络。获得数据后,您(在您的机器上)对其进行哈希处理,然后检查 MD5 或 SHA-1 哈希值是否与您从可靠来源获得的哈希值匹配。在匹配时,您知道您拥有正确的文件,直到最后一位,因为,为了在保持正确哈希值的同时向您提供更改的文件,恶意的攻击者将不得不破坏哈希的第二个原像抗性功能——而且,现在,没有人知道如何做到这一点。
如果您从与哈希值相同的来源下载文件,那么哈希值是无用的。已发布的 MD5 或 SHA-1的安全附加值是通过“弱”介质获取批量数据,同时安全传输散列值的情况。
哈希值也非常适合检测错误。它们旨在抵抗知道自己在做什么的智能攻击者对数据的修改;这也使它们能够抵抗来自无意识宇宙的随机变化。哈希函数是非常好的校验和。如果您下载一个大文件,例如 ISO 映像,将其刻录到 DVD 上,然后在其他机器上读回 DVD,那么就有足够的空间进行非恶意更改,尤其是任何一台机器上的坏 RAM(发生翻转位比通常假设的要多)。您可以随时重新计算数据的哈希值,并查看它是否与预期值匹配。
提供的 MD5/SHA1 哈希用作校验和以验证文件的完整性。特别是在 Linux/Unix 系统上,md5sum和sha1sum实用程序提供了一种方便的方法来验证文件没有被篡改。
当然,仅当您可以确定散列未被篡改时,提供的散列才有用。这意味着散列应该以安全的方式传输给最终用户,可能通过 HTTPS 或完全不同的通道。
向最终用户提供这种设施背后的安全目的是什么?
当您尝试下载文件/软件时,一些坏人可能会成功进行中间人攻击,并用恶意版本替换真实软件。哈希值可帮助您确保已下载原始软件。
在基于 linux 的环境中,您有 md5sum 和 sha1sum 实用程序。如果您使用的是 Windows,则可以使用 cryptool 之类的东西。
散列的意义在于,如果数据发生变化,散列也会发生变化。因此,如果您知道哈希是正确的(即hash(data_you_have) = announced_hash),并且如果您知道哈希是好的(即announced_hash = hash(genuine_data)),那么您就知道您拥有正确的数据(data_you_have = genuine_data)。
那么为什么要单独发送哈希?以防有人可以修改数据但不能修改哈希。如果您通过具有高带宽但可能会受到数据损坏的通道发送数据,并且通过更可靠但带宽很小的通道发送散列,则这是有道理的。
洪流就是一个很好的例子。该.torrent文件包含种子中每个文件的哈希值。它只有几千字节,可以通过网络轻松下载。另一方面,洪流的片段是从 Internet 上某个地方的随机未知机器下载的,您没有理由相信这些机器。因此,一旦下载了数据,您的 torrent 软件将验证哈希值是否匹配并拒绝任何哈希值不匹配的片段。
在这里,如果您从同一来源获取文件,则在网页上单独提供散列会更加方便.torrent:在这种情况下,无需单独验证散列。如果您.torrent从其他来源(例如跟踪器)获取文件,则该来源本身可能已损坏或恶意,并且哈希可让您验证您下载的是真实数据。
如果您通过 HTTP 从网站下载哈希,则需要信任以下各方:
但是,您不需要信任任何参与向您获取实际数据的人:只需信任哈希值。
您可以决定是否信任该站点(既提供有用的数据又不受恶意软件的影响)以及是否信任您自己的计算机没有恶意软件。至于互联网基础设施,除非您使用公共 wifi,否则这在实践中的风险非常低。
如果您通过证书良好的 HTTPS 网站下载哈希,则可以消除 Internet 基础架构的风险。您仍然需要信任网站所有者、您自己的机器以及提供证书所涉及的 Internet 基础设施部分(浏览器提供商、证书颁发机构)。