检查文件内容是否在C#中更改的最简单方法是什么?沙,crc32,md5还是别的



我想检查文件的内容是否发生了更改。我的计划是在文件的最后一行添加一个散列。

稍后,我可以读取文件,对其进行散列(散列除最后一行之外的所有内容),并将其与文件的最后一行进行比较(初始散列)。

我无法使用上次修改的日期/时间。我需要使用存储在文件中的哈希或任何类型的编码。我用C#对应用程序进行编码。做这件事最合理/最简单的方法是什么?我不知道下面哪一个对我来说是一个很好的匹配:Sha1,2,3-ccr16/32/64-md5?我不需要快速或安全的方法。

谢谢!

在我看来,如果将哈希存储在文件中,就好像会遇到鸡或蛋的问题。除非你对文件进行散列运算,否则你不会知道散列运算。但是,当您对文件进行散列并将该值添加到文件末尾时,散列将发生变化。很明显,您需要在不包括实际散列本身的情况下对文件进行散列你已经说过了,但我再加一次是为了澄清我的下一点

诀窍在于,散列/求和算法会给你整个文件(或字节流,或其他什么)的总和。他们不会给你一个";运行总数";事实上。这意味着在测试之前,您需要将哈希与其他内容分离出来,看看它是否发生了更改。除非你自己编写一个自定义哈希工具。

这当然可以使用所有的哈希算法,,但你问这个问题的事实让我相信,你可能不想写一个专门设计用于在到达存储哈希时退出的自定义(例如)SHA256工具。

在我看来,你有三个选择:

  1. 将哈希与文件分开存储,或者至少编写一个不包含哈希的临时文件,并对其进行哈希。这将允许您使用已经内置在C#中的哈希工具,而无需任何修改或花哨的技巧。我知道这与您列出的要求不完全匹配,但这是您可能会考虑的一个选项。

  2. 你没有提到文件的大小,但如果它足够小,你可以简单地将它拖到内存中减去哈希的字节,使用内置工具对内存中的数据进行哈希,然后进行比较。这将再次允许您使用内置工具。

  3. 使用一个自定义散列工具,该工具在到达"散列"的末尾时故意退出;有趣的";数据如果是这样的话,我无疑会推荐一种像CRC这样的非安全哈希方法,因为它会更容易理解和修改代码(毕竟它是一种更简单的代码)。您已经提到您不需要它来确保安全,因此这将满足您的要求。

如果你决定使用选项#3,那么我建议你仔细阅读罗塞塔代码,在C#中搜索CRC算法。从那里你可以读取你的文件,减去哈希的字节,通过你的哈希算法发送剩余的字节。这里列出的算法一次处理所有字节,但将累加器转换为一个参数,这样就可以分块发送数据,这将是微不足道的。这将允许您在原位处理任意大的文件。

[EDIT]FWIW,我已经走上了类似的道路。在我的案例中,我编写了一个自定义工具,它允许我们通过WAN增量复制非常大的文件。太大了,以至于我们在安全复制文件时遇到了问题。该工具的正确使用是远程访问源服务器,预运行CRC32检查并以任意间隔保存总和。然后将CRC32检查复制到客户端,并开始复制文件。如果目标在中间停止,或者可能以某种方式损坏,可以简单地提供本地分部的名称、远程源、包含CRC32和的文件,最后提供目标。程序将从本地部分开始复制,并且只有在发现部分CRC32总和问题时才会从远程开始复制。我们的问题是,字节拷贝末尾的简单简历并不总是有效的。这很令人沮丧,因为复制需要很长时间。我和我的队友笑了好几次,说我们可能会尝试U盘和信鸽。。。

你想保护自己免受什么伤害?

意外的变化?那么你的方法听起来不错。(当最后一行散列也被意外删除时,请确保添加处理。)

恶意更改?然后你需要对文件内容加上一些私钥进行散列,并使用安全的散列算法。MD5对意外更改很好,因为它很快,但在加密方面它被认为是坏的。

最新更新