我知道我们使用哈希函数来检查文件等的完整性......但我的问题是我们如何检查从某个服务器下载的文件的完整性?
如何检查下载文件的完整性?
诚信被定义只是相对要告诉字节的“正确”的顺序是什么样的权威来源。散列函数不会创建完整性,它们会传输完整性。基本上,如果您有:
- 一份文件;
- 一个哈希值,假定正确;
然后你可以重新计算文件的哈希函数,看看你是否得到相同的哈希值。
你仍然必须从某个地方开始。一些软件分销商随软件提供“校验和”(或“md5sum”或“sha1sum”)文件,其中包含哈希值。假设你得到了正确的校验和文件,这允许你验证你是否下载了正确的文件,直到最后一位;无论您如何下载可能的大文件(即使它来自一些阴暗的对等网络或其他任何东西;您不能欺骗哈希函数),这都有效。
现在这并不能解决完整性问题;它只是将其简化为确保您获得正确哈希值的问题。哈希值很小(SHA-256 为 32 字节),因此这带来了很多可能性。在从 P2P 系统下载文件的上下文中,您可以从 HTTPS 网站获取哈希值(HTTPS 使用 SSL 确保服务器身份验证——您可以保证与您想要的服务器通信——以及传输完整性——您收到的内容保证是服务器发送的内容)。在与人交换 PGP 公钥的情况下,哈希值(通常称为“指纹”或“指纹”)足够短,可以手动传输(打印在名片上,通过电话拼写......)。
数字签名扩展了这个概念,但它们也是从散列函数开始的。所有数字签名算法都不是对消息本身进行签名,而是对消息的散列进行签名(只要散列函数是安全的,即可以抵抗冲突和原像,这同样好)。
对于许多软件,文件的提供者还提供文件的哈希值,以便您验证其完整性。
例如,这里是 Fedora 项目为 Fedora 19 x86_64 ISO 提供的校验和示例。
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# The image checksum(s) are generated with sha256sum.
6e7e263e607cfcadc90ea2ef5668aa3945d9eca596485a7a1f8a9f2478cc7084 *Fedora-19-x86_64-DVD.iso
ef9eb28b6343e57de292f2b2147b8e74a2a04050655e0dc959febd69b0d5d030 *Fedora-19-x86_64-netinst.iso
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAEBCAAGBQJRzjLNAAoJEAdHfmX7SxjmzQEP/jzXXe4rxRzA9NLrgWtRUp1b
nK+gpMgGXC5+zSWnKTQBUWMx0rx7uys/UQH934hz1rdMOqLkCe1XlVWp+0ya55nC
13OhOeeJhbdECzFvcSAkDh9Aj2Z9AnDeHbDvJXpEjvGiSLLsYWsjifIkMYDoNTRV
QlLWwOTlCCUZtEGEI1x0TWYlr0HUtkL5QAzQ4CSO7xGYE6YH/xwHje/8n7B25NHU
r2sSdlz3KORQyStqYK78cWlR70PT+3o00SO7ReHNVIZwCL8PjsOEm41Q4tjw3BF7
KLp+fcQTOgzLRY1VVk0n0POeJHbVB2TULjIW4F/vCiA3N6Uq595ebNxgSOBg8tRs
t7fkbktVB6+WeBCcGvJI7MWzYq0ukwRBAH+ZBLhpnEIsHOoFF6LRoiE0UncdhGb+
OmZqn8wZKzMf401E/vj7dEy+X3lAST+5mBm0EJQaFz2cbQCzuxfhnSc27w9Zq3ii
3Tgo1ubInXD/fu1WFH/Tu2aOmbNQwDr4YQDYOeuzokA3d/2bETIhEmYxmfGptfMw
fGG/u4QQMdXyPPKvdIkOTAp5d0tWnTucpkbHs1goygsCMz6XWvIZJt4bAbSRwXoa
qYXh8IpJAM0CrU0353RMDCNpDlpSXGeEy5riaFpFCe7SKZBzp2dJ1LsMJl1NJXxn
QavVCbllLFFjaTuYKrDZ
=oBpz
-----END PGP SIGNATURE-----
如果不使用所提供的校验和,也会提供说明。
通常,如果文件是通过与校验和相同的介质提供的,则几乎没有真正的好处,因为设法破坏下载的攻击者也将具有替换提供的校验和的能力。但是,这在通过种子或 CDN 等不安全连接下载文件的情况下非常有用。在这种情况下,软件提供商可以在其服务器上提供小校验和,同时通过更高带宽的介质(例如种子或 CDN)提供文件。