快速而强大的校验和算法,适用于较小的数据文件(〜10KB)

时间:2019-03-06 22:41:07

标签: c embedded checksum

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

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

谢谢!

编辑:- 感谢大家的深刻见解和建议。

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

3 个答案:

答案 0 :(得分:4)

  

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

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

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

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

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

答案 1 :(得分:1)

出于您的目的,您可以使用诸如SHA256之类的加密哈希。它非常可靠,几乎不可能发生碰撞,但是您应该测试速度是否正常。

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

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

否则,就需要一个非对称密码系统,该密码系统只有那些数据文件的合法来源才知道的私钥,以及设备用来验证密码哈希的公钥,如黄昏的回答中所述。 / p>

答案 2 :(得分:1)

如果您仅担心意外或非恶意篡改,则CRC应该足够。

(我在这里使用“恶意”的某种循环定义:如果有人麻烦重新计算或操纵CRC以使其编辑工作正常进行,则视为“恶意”,因此我们不反对它。