用于小型数据文件 (~10KB) 的快速且强大的校验和算法

Fast and robust checksum algo for a small data file (~10KB)

我有一个数据文件需要推送到嵌入式设备。文件的典型大小范围从几个字节到最大约 10K。我的目的是检测对该文件内容的篡改(chksum 是数据文件中的最后一个元素)。数据范围是字符串、有符号和无符号整数的混合。我正在寻找一种强大的算法来避免大量碰撞以及不使用大量周期来计算的东西。我正在考虑 Fletcher16()CRC-32 和解决方案

对我的数据类型的简单算法有什么建议吗size/contents?

提前致谢!

编辑:- 感谢大家富有洞察力的回答和建议。

一些背景:这不是一个超级安全的数据文件。我只是想能够检测是否有人误写了它。该文件由模块生成,软件应该只是 read only。最近有几个例子,人们将它从目标文件系统中拉出来,编辑并推回目标,希望这能解决他们的问题。 (顺便说一句,如果仔细编辑的话)。但这违背了自动生成这个文件的目的和这个模块的存在。我想检测这样好玩的“黑客”和优雅地中止

为了您的目的,您可以使用加密哈希,例如 SHA256。非常靠谱,撞车的可能性极小,但是你应该测试速度是否还可以。

此响应中有一个示例实现:

要检测对数据的故意篡改,您可以向散列数据添加密钥。设备需要有密钥的副本,因此这不是一种非常安全的方法,因为可以通过逆向工程或其他方法从设备中提取密钥。如果设备受到很好的保护,例如,如果它位于安全位置、安全芯片或非常偏远的位置,例如 space 中的卫星,并且您确信提供远程访问没有缺陷,这可能就足够了。

否则需要非对称加密系统,其中只有这些数据文件的合法来源知道私钥,以及设备用来验证加密哈希的 public 密钥,如记录在 duskwuff 的回答中。

My intention is to detect tampering with the contents of this file

如果您需要检测对文件的故意篡改,您需要某种加密签名——而不仅仅是散列。

如果您可以保护设备内的密钥,使用 HMAC 作为签名算法可能就足够了。但是,如果从设备中提取秘密,用户将能够使用它来伪造签名。

如果您无法保护设备内的密钥,则需要使用非对称签名算法。 Libsodium's crypto_sign APIs provide a nice API for this. Alternatively, if you want to use the underlying algorithms directly, EdDSA 是一个不错的选择。

这些选项中的任何一个都需要为签名分配相对大量的 space(32 到 64 字节),并且验证该签名将比非加密签名花费更多的时间。如果你需要有效防止篡改,这在很大程度上是不可避免的。

如果您只关心意外或非恶意篡改,CRC 就足够了。

(我在这里使用了一个有点循环的 'malicious' 定义:如果有人不厌其烦地重新计算或操纵 CRC 以使他们的编辑工作,那算作 'malicious' 并且我们不防御它。)