文件校验和值在长时间未使用的驱动器上发生变化

文件校验和值在长时间未使用的驱动器上发生变化

我有一个驱动器,里面存储着我 3 年或更长时间没有使用的数据。然后我用 corz 校验和对很多文件进行了校验。

现在我正在将旧数据备份到另一个驱动器,为了安全起见,我进行了chkdsk全扇区扫描,并且没有任何问题。

我还验证了每个文件的校验和,并注意到其中一个 zip 文件已被更改,尽管我确定我没有对其进行任何更改。

我测试了 zip 文件,提取了内容,一切正常,但我无法回避它现在具有不同的校验和值的事实。

校验和

这可能是什么原因造成的?为什么测试和提取没有返回错误?

该 zip 文件仅存储了一个项目,我 100% 确定在校验和之后我没有更改它。有人可以解释一下,或者帮忙找出原因吗?

答案1

为什么测试和提取没有返回错误?

因为 zip 文件肯定是没有问题的。Zip 格式使用 CRC-32来检测损坏,并且随机改变的文件不太可能通过此测试。

因此我认为旧的校验和有问题。它是几年前计算错误的。


这可能是什么原因造成的?

您可能遇到过软件错误。认为可能存在仅在特定情况下才会出现的错误。另一方面,计算校验和相对简单。我们无法真正排除这种可能性,但我宁愿归咎于其他原因。

宇宙射线。或者其他什么东西使 RAM 中的单个位翻转,改变其状态。这不是最终的校验和位,因为两个校验和在许多位上有所不同。我猜在计算之前或计算过程中翻转了一个位,之后执行了多个操作,而这个单一的更改影响了整个结果。我可以从md5您的屏幕截图中看到,我猜您的校验和是 MD5。这是一个哈希函数;这样的函数是故意以某种方式创建(即定义、选择)的,因此当您翻转给定输入一半(平均而言)输出位中的单个位时,输出位也会翻转。翻转的位可能不是输入位,可能是一些间歇位;不过,难怪这两个和非常不同。

我提到了宇宙射线,但也有可能你的记忆不是 100% 可靠的,而且如果没有外部原因的话,可能会有点混乱。

这些事情确实会发生。以下是一些例子:

  1. 此作者写了一个开始产生错误的可执行文件。结果发现缓存 (RAM) 中的文件与磁盘上的同一文件确实有一点不同。

  2. 利用内存错误攻击虚拟机作者:Sudhakar Govindavajhala 和 Andrew W. Appel。

    我们的攻击方式是向 JVM [Java 虚拟机] 发送一个 Java 程序,该程序的设计使得其地址空间中的几乎任何内存错误都允许它控制 JVM。所有传统的 Java 和 .NET 虚拟机都容易受到这种攻击。

  3. 阿乔姆·迪纳堡注册域名与各种流行域名略有不同。来自世界各地的设备都访问了这些地址。

相关内容