【问题标题】:Fast and robust checksum algo for a small data file (~10KB) [closed]用于小数据文件(~10KB)的快速而强大的校验和算法[关闭]
【发布时间】:2019-03-11 22:18:49
【问题描述】:

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

对于我的数据大小/内容类型的简单算法有什么建议吗?

提前致谢!

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

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

【问题讨论】:

  • 如果你想防止篡改,你应该使用加密安全的哈希函数而不是校验和。
  • 哪个更重要:“检测篡改”或“不使用大量周期来计算”或两者(意味着你不会得到两者)。
  • @chux:我猜都是 :) 我已经更新了这个问题,以提供一些背景信息,说明它的来源..

标签: c embedded checksum


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    否则需要一个非对称加密系统,只有这些数据文件的合法来源知道的私钥和设备用来验证加密哈希的公钥,如黄昏的回答中所述。

    【讨论】:

    • 感谢您的回复!
    • SHA256 并不能防止篡改……
    • @duskwuff:你对我的用例有什么建议吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2017-08-13
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2013-06-21
      • 2011-11-12
      相关资源
      最近更新 更多