网站上的下载有时会有 MD5 校验,以便人们确认文件的完整性。我听说这不仅可以在损坏的文件造成问题之前立即识别它们,还可以轻松检测到任何恶意更改。
就文件损坏而言,我遵循逻辑,但如果有人故意上传恶意文件,然后他们可以生成相应的 MD5 校验和,并将其与修改后的文件一起发布在下载网站上。这将欺骗下载该文件的任何人,使他们认为该文件未被修改。
MD5 校验和如何提供保护以防止故意地如果没有办法知道校验和本身是否已经被泄露,那么文件是否被修改了?
答案1
我听说这是为了让[...]也能检测到任何恶意更改。
那你听错了。MD5(或 SHA 或其他)校验和已提供(在下载链接旁边,具体来说) 仅用于验证下载是否正确。他们唯一想保证的是,您拥有与服务器相同的文件。仅此而已。如果服务器受到攻击,您就没戏了。就是这么简单。
答案2
一些包管理系统(如 dpkg)使用的解决方案是签署哈希值:使用哈希作为公钥签名算法之一的输入。请参阅http://www.pgpi.org/doc/pgpintro/#p12
如果您有签名者的公钥,则可以验证签名,从而证明哈希未被修改。这只留给您一个问题,即提前获取正确的公钥,尽管如果有人篡改了密钥分发,他们也必须篡改您可能用来验证的所有内容,否则您会发现发生了一些奇怪的事情。
答案3
您的假设是正确的。但是有一个例外。如果提供文件的服务器和哈希所在的页面不是由同一实体管理的。在这种情况下,软件开发人员可能想说“嘿,人们从那个地方下载这个,但只相信哈希 = xxxx”。(这可能对 CDN 有用)。我想这就是有人一开始这样做的原因。然后其他人只是跟着想着显示哈希会有多酷。甚至没有考虑它有多有用,甚至文件和哈希都不在同一个位置。
话虽如此,但这是值得的。不要像其他人所说的那样对安全性做太多假设。当且仅当您绝对信任原始哈希时,文件才是好的。否则,有足够动机和知识的攻击者可以篡改文件和哈希,即使它们位于不同的服务器中并由不同的实体管理。
答案4
这正是发布的校验和通常带有免责声明“这无法防止对文件的恶意修改”的确切原因。因此,简短的回答是“它们无法提供任何针对故意更改文件的保护”(尽管,如果页面是通过 HTTPS 传送的,HTTPS 本身可以防止修改;如果文件不是通过 HTTPS 传送的,但校验和是通过 HTTPS 传送的,那么这可能会有所帮助,但这种情况并不常见)。谁告诉你网页上发布的校验和用于检测恶意修改是错误的,因为这不是它们可以执行的角色;它们所做的只是帮助防止偶然损坏和懒惰的恶意损坏(如果有人懒得拦截向您提供校验和的页面)。
如果您想防止故意修改,您需要阻止人们篡改校验和,或者使其他人无法生成有效的校验和。前者可能涉及亲自提供或类似方式(因此校验和本身是可信的);后者涉及数字签名算法(您需要安全地将您的公钥发送给下载者;在 TLS 中,这通过最终直接信任证书颁发机构并让它们验证其他所有人来完成;它也可以通过信任网络来完成,但关键是某些东西必须在某个时候安全地传输,而仅在您的网站上发布某些东西是不够的)。