0

我正在尝试是否可以使用 CRC32 作为我的固件无线更新的完整性检查机制,或者我是否应该使用诸如 MD5 之类的散列算法?

我的情况:

该平台是 STM32F091RC(512KB 闪存,32KB RAM),没有 MD5 或其他散列算法的硬件/外设。它确实提供了一个 CRC32 外设。固件下载的确切长度在 100KB 范围内,并将通过蜂窝数据网络(LTE - Cat M1 和 2G)传输。我不关心故意篡改——只关心由于噪声等引起的传输错误。所有传输都将使用 TCP 作为传输协议。据我所知,蜂窝数据包和它们封装的 TCP 数据包都有自己的数据包级别 CRC。对于不大于 1500B 的数据包,TCP 数据包是 CRC16,我相信蜂窝数据包更小并且有自己的 CRC(不确定 CRC 大小)。因此,已经完成了两组 CRC 校验,并对坏包进行了必要的重传。

CRC32 将更易于实现,并且占用空间更小/无占用。我假设 MD5 将提供更高级别的完整性保证(如果这是正确的术语!),但是以复杂性和占用空间为代价(它也可能更慢,但这不是真正的问题,因为这些下载只是非常偶然)。

我已经阅读了许多文章(关于堆栈溢出和其他地方),但仍然没有清楚地了解在从 CRC32 切换到 MD5 或类似的哈希算法之前我应该​​应用什么传输大小限制?一篇文章有​​:

编辑:查看关于 CRC 和 Lott 的答案的 Wikipedia 页面,这里是我们所拥有的:小于 64 字节:8 位 CRC 小于 16K 字节:16 位 CRC 小于 512M 字节:32 位 CRC

因此,基于上述情况,我认为 CRC32 会很好,但我没有很高的舒适度,因为这是我发现的唯一一个与这些类型的数字有关的部分。

对我应该做什么的任何观点非常感兴趣 - CRC32 或 MD5/类似的哈希算法?

4

1 回答 1

1

由于您不关心故意篡改,因此您不需要 MD5。您可以使用其他比 32 位更长的更快的非加密哈希。

您只需要弄清楚您认为可以接受的误报概率是多少。即,当实际上存在错误时,完整性检查错误地指示良好数据包的概率。取该概率的以 2 为底的对数的负数。您的哈希中至少需要那么多位。

于 2021-01-02T06:21:06.477 回答