快速而强大的校验和算法用于小型数据文件(~10KB)[关闭]

问题描述 投票:0回答:3

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

对于我的数据大小/内容的简单算法的任何建议?

提前致谢!

编辑: - 感谢大家提供有见地的答案和建议。

一些背景:这不是一个超安全的数据文件。我只是希望能够发现是否有人误写了它。该文件由模块生成,应该只是SW的read only。最近出现了一些情况,人们已将其从目标文件系统中拉出来,编辑并推回到目标,希望能解决他们的问题。 (如果仔细编辑,那将会是什么样的)。但这违背了自动生成此文件的目的以及此模块的存在。我想发现和如此俏皮的“黑客”并优雅地中止。

c embedded checksum
3个回答
4
投票

我的目的是检测篡改此文件的内容

如果您需要检测故意篡改文件,则需要某种加密签名 - 而不仅仅是哈希。

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

如果无法保护设备中的密钥,则需要使用非对称签名算法。 Libsodium's crypto_sign APIs为此提供了一个很好的API。或者,如果您想直接使用基础算法,EdDSA是一个不错的选择。

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


1
投票

出于您的目的,您可以使用加密哈希,例如SHA256。它是非常可靠的,碰撞不太可能,但你应该测试速度是否正常。

此响应中有一个示例实现:https://stackoverflow.com/a/55033209/4593267

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

否则,需要一个非对称的加密系统,只有这些数据文件的合法来源知道私钥,以及设备用来验证加密散列的公钥,如duskwuff的回答所述。


1
投票

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

(我在这里使用了一个有点循环的'恶意'定义:如果有人去重新计算或操纵CRC以使其编辑工作的麻烦,那就算是'恶意'而我们不会反对它。)

© www.soinside.com 2019 - 2024. All rights reserved.