我正在尝试是否可以使用 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/类似的哈希算法?