SHA-256 或 MD5 用于文件完整性
Posted
技术标签:
【中文标题】SHA-256 或 MD5 用于文件完整性【英文标题】:SHA-256 or MD5 for file integrity 【发布时间】:2012-12-17 20:43:36 【问题描述】:我知道 SHA-256 在安全性等方面优于 MD5,但是,如果我要使用一种仅检查文件完整性的方法(即与密码加密等无关),是否存在使用 SHA-256 有什么好处?
因为 MD5 是 128 位,而 SHA-256 是 256 位(因此是两倍大)...
加密时间会增加一倍吗?
如果时间不是至关重要的,例如在备份程序中,只需要文件完整性,有人会反对 MD5 的不同算法,甚至建议不同的技术吗?
使用 MD5 会产生校验和吗?
【问题讨论】:
术语挑剔:MD5 和 SHA-* 都不加密任何东西。它们是哈希函数。 @delnan 实际上,我很高兴你能明白这一点,谢谢。但是,某种东西的哈希表示不是加密吗? 没有。对于初学者来说,加密是可逆的(根据定义),而哈希不能反转(根据鸽巢原理)。 嗯,两者根本不同,因此,对两者之一的各种攻击甚至对另一个都没有意义,因此“更安全”没有多大意义恕我直言。想澄清一下你的意思吗? 嗯,他们是,但这只是意味着他们服务于不同的目的,因此受到不同的攻击。对于散列函数,最常见的攻击是产生冲突,因为这就是您击败基于散列的安全措施(例如散列密码或签署证书)的方式。您不会通过仅存储其哈希值来隐藏任何内容,因为对于每个人,它都会“丢失”/无法访问,而不仅仅是攻击者。 【参考方案1】:SHA256 和 MDA5 都是散列算法。他们获取您的输入数据,在本例中为您的文件,并输出一个 256/128 位数字。这个数字是一个校验和。没有进行加密,因为无限数量的输入可能导致相同的哈希值,尽管实际上很少发生冲突。
根据this answer,SHA256 的计算时间比 MD5 多一些。
顺便说一句,我会说 MD5 可能适合您的需要。
【讨论】:
谢谢,但作为一个题外话问题,您是说加密必须像 GUID 一样产生唯一的“代码”/“ID”吗? @DaveRook 然后你会如何解密消息? @PaulManta - 我不知道,因为我这样做只是为了完整性,我从未真正考虑过这样的加密,但知道这一点真是太棒了。谢谢。 @dave 我认为这个话题有点混乱,因为 SHA 被称为加密哈希。这意味着(我远非专家)是您可以使用它来散列密码。这样,如果攻击者获取了您的用户密码文件,他就无法使用哈希来重建原始密码。加密的不同之处在于它是可逆的。 @Dave 您在下面提到您正在寻找哈希函数列表。查看有关哈希函数的***文章:en.wikipedia.org/wiki/List_of_hash_functions【参考方案2】:每个答案似乎都表明您需要使用安全哈希来完成这项工作,但所有这些都被调整为缓慢以迫使暴力攻击者拥有大量计算能力,并且根据您的需要,这可能不是最好的解决方案。
有专门设计用于尽可能快地散列文件以检查完整性和比较的算法(murmur
、XXhash
...)。显然,这些不是为安全而设计的,因为它们不符合安全散列算法(即随机性)的要求,但对于大型消息的冲突率较低。如果您追求的不是安全性而是速度,这些功能使其成为理想选择。
此算法的示例和比较可以在这个出色的答案中找到:Which hashing algorithm is best for uniqueness and speed?。
例如,我们在问答网站使用murmur3
对用户上传的图片进行哈希处理,因此即使用户在多个答案中上传了同一张图片,我们也只存储一次。
【讨论】:
【参考方案3】:到 1): 是的,在大多数 CPU 上,SHA-256 的速度只有 MD5 的 40%。
到 2): 在这种情况下,我会主张与 MD5 不同的算法。我肯定更喜欢被认为是安全的算法。不过,这更多的是一种感觉。在这种情况下,这很重要,而不是现实的,例如。如果您的备份系统遇到攻击基于 MD5 的证书的示例案例,您可能在此类示例中有两个文件具有不同的数据,但 MD5 校验和相同。对于其他情况,这无关紧要,因为 MD5 校验和几乎只有在故意引发时才会发生冲突(= 不同数据的相同校验和)。 我不是各种散列(校验和生成)算法的专家,所以我不能建议另一种算法。因此,这部分问题仍然悬而未决。 建议的进一步阅读是***上的Cryptographic Hash Function - File or Data Identifier。在该页面的下方还有一个加密哈希算法列表。
到 3): MD5 是一种计算校验和的算法。使用此算法计算的校验和称为 MD5 校验和。
【讨论】:
【参考方案4】:底层的 MD5 算法不再被认为是安全的,因此,虽然 md5sum 非常适合在与安全无关的情况下识别已知文件,但如果文件有可能是故意和恶意的,则不应依赖它篡改。在后一种情况下,强烈建议使用较新的哈希工具,例如 sha256sum。
因此,如果您只是想检查文件损坏或文件差异,当文件的来源受信任时,MD5 应该就足够了。如果您希望验证来自不受信任来源的文件的完整性,或者通过未加密连接来自受信任来源的文件的完整性,MD5 是不够的。
另一位评论者指出 Ubuntu 和其他人使用 MD5 校验和。 Ubuntu 已经迁移到 PGP 和 SHA256,除了 MD5,但更强大的验证策略的文档更难找到。有关详细信息,请参阅HowToSHA256SUM page。
【讨论】:
我知道我迟到了,但感谢您提出这一点!如果您使用校验和来验证攻击者没有在篡改您的文件,那么 MD5 是一个糟糕的主意。如果攻击者知道他们在做什么,理论上他们可以找到正确的冲突,使他们能够在不更改文件校验和的情况下执行代码,从而避开任何基于校验和的安全验证。 SHA 算法在现代 CPU 上表现得足够好,并且可以更好地扩展(随着文件大小变大,我们的校验和也必须变大)。如果您要处理大型高清视频文件,我会使用 SHA-512。【参考方案5】:-
不,速度没那么快,但也没那么慢
对于备份程序,可能需要比 MD5 更快的东西
总而言之,我会说除了文件名之外的 MD5 是绝对安全的。 SHA-256 会因为它的大小而变得更慢且更难处理。
您也可以毫无问题地使用比 MD5 更安全的东西。如果没有人试图破解您的文件完整性,这也是安全的。
【讨论】:
谢谢,但问题是我不知道我还能用什么!我不是在寻求建议,我很乐意研究其他方法,但你能推荐 MD5/SHA256 以外的方法吗? 取决于您使用的编程语言和运行时环境。【参考方案6】:MD5 比 SHA256 更快,这在技术上是公认的,因此仅验证文件完整性就足够了,而且性能更好。
您可以查看以下资源:
Speed Comparison of Popular Crypto Algorithms Comparison of cryptographic hash functions【讨论】:
啊,您提供的链接还显示了其他算法。我想我现在需要找到哪些可用于 .NET 并找到最快的。谢谢 @DaveRook 此外,如果您搜索著名的网站,如 Sun、Ubuntu 等,您可能会注意到它们提供 MD5 校验和以确保文件完整性。这可能支持其对此类任务的价值。【参考方案7】:-
是的,在大多数 CPU 上,SHA-256 比 MD5 慢 2 到 3 倍,但主要不是因为它的哈希值更长。在此处查看其他答案以及this Stack Overflow questions 的答案。
这是不适合使用 MD5 的备份方案:
您的备份程序会对每个正在备份的文件进行哈希处理。然后它存储
每个文件的数据按其哈希计算,因此如果您要备份同一个文件
两次,您最终只会得到一份副本。
攻击者可以使系统备份他们控制的文件。
攻击者知道他们想要从
备份。
然后攻击者可以使用 MD5 的已知弱点来制作新的
与要删除的文件具有相同哈希值的文件。当那个文件是
备份,它将替换要删除的文件,并且该文件已备份
数据将丢失。
这个备份系统可以加强一点(并且提高效率)
通过不替换之前遇到过哈希的文件,但是
然后攻击者可以阻止具有已知哈希的目标文件
通过抢先备份一个特殊构造的伪造文件进行备份
具有相同哈希的文件。
显然大多数系统,备份和其他,不满足
这种攻击切实可行的必要条件,但我只是想要
举例说明 SHA-256 优于
MD5。您正在创建的系统是否属于这种情况
不仅仅取决于 MD5 和 SHA-256 的特性。
是的,像 MD5 和 SHA-256 生成的加密哈希是一种校验和。
哈希快乐!
【讨论】:
以上是关于SHA-256 或 MD5 用于文件完整性的主要内容,如果未能解决你的问题,请参考以下文章