计算文件哈希的最快方法?

时间:2008-11-19 10:16:34

标签: hash

许多文件将存储在数据库中,我需要文件哈希来唯一标识文件未被更改。 (一般情况下,将用作Windows个人防火墙部分)

2 个答案:

答案 0 :(得分:19)

如果我理解“用作Windows个人防火墙”部分,MD5不是一个很好的算法选择。

对MD5算法存在成功的攻击,它允许您找到一个不同的消息,该消息产生相同的哈希且工作量相对较少(与暴力相比)。那个用于的攻击没有真正的影响,例如:当MD5用于哈希密码等。与此同时,已发现新的攻击,因此MD5和SHA-1都可以以可怕的速度进行散列/冲突,并且破坏整个“正确腌制”的数据库和使用这些“老年”哈希值的单线程用户密码只是完全可行但已经证明了 但是,在“确保此文件未被篡改”的特定应用中,这种攻击始终是一个问题,而不仅仅是最近。 MD5可以非常安全地检测到一些错误或意外修改,但是试图绕过您的个人文件墙的恶意软件可能会通过查找受感染二进制文件的冲突来避免整个安全性,从而使哈希与原始文件匹配。

你应该在这种情况下使用SHA-256 [更新:同时,SHA-3已经出局,而我个人不同意NIST选择的获胜者(或者排除一些非常好的第2轮候选人的标准,这是使用SHA-3(Keccak)或SHA-3决赛选手之一的更安全选择。所有的决赛选手都经过了经验丰富的团队的精心设计,经过了非常彻底的分析,到目前为止还没有一个真实的攻击或已知的问题,可以想象会导致真实的攻击,而且他们都有“更多位”(这本身并不意味着什么,但更多的位不会伤害)]。

另外,记住除了哈希之外总是保存文件的长度,这甚至会以可忽略的成本硬化甚至是糟糕的哈希。如果可以的话,计算两个不同的哈希值。攻击者在一个哈希上发现某些消息比查找产生冲突的消息更容易 更容易具有完全相同的长度,甚至是在两个不同的哈希上碰撞且具有相同长度的消息 由于带宽(磁盘和内存)在计算哈希值时是一个不可忽略的因素,因此甚至可以以相当的速度同时计算单个哈希值或两个哈希值。 我在计算CRC并用块密码加密相同的块之后观察到了这种效果。无论计算CRC是否在整体运行时间上的差异小于1%,因此它基本上是一个自由操作。

如果您认为自己有充分的理由不使用众所周知的标准哈希(性能限制?),那么您可以构建自己的安全哈希。使用Merkle-Damgård构造(或最近的HAIFA),您可以将任何安全块密码转换为安全散列函数。例如,使用固定密钥用AES加密每个输入块,然后在加密那个输出块之前将输出加到下一个块。最后一个块之后的输出是您的哈希值。

虽然“构建自己的”通常不是一个好主意,但在这种情况下确实可能有正当理由,因为AES很快并且在最新处理器的硬件中受支持。在我的机器上,AES以大约130MB / s的速度运行。在i7(具有硬件支持)上,它在互联网上的报告速度约为570MB / s。

至于I / O有限,放松是正确的,磁盘很可能是限制因素,尽管它不是必须的。内存映射是你的朋友,特别是在你的特定情况下。

如果您检查了在防火墙上申请权限的文件,那么这些文件将是已加载到RAM中的可执行文件(它们可能会有什么不同,它们最终会被执行!)。因此,映射已经在RAM中的页面将仅添加页表条目,或多或少是无操作。即使数据不在RAM中,内存映射的性能(和易用性)也是完全令人惊叹的,如果速度有任何问题,我现在很少使用其他任何东西。

答案 1 :(得分:4)

这当然不可能。许多人仍然为此目的使用散列,MD5是一种流行的算法,它为文件提供128位“签名”,当文件内容发生变化时,很有可能发生变化。

在一般情况下,您需要查看文件的每一位以将其包含在散列中,并且性能可能会受I / O限制。它是对文件中所有数据的顺序扫描,更新用于每个新字节的任何哈希算法的状态。在现代CPU上,后者比前者更快。 This rather old analysis在Pentium 90 MHz CPU上显示约45 MB / s。