出于您的目的,您可以使用加密哈希,例如SHA256。它是非常可靠的,碰撞不太可能,但你应该测试速度是否正常。
此响应中有一个示例实现: https://stackoverflow.com/a/55033209/4593267
要检测故意篡改数据,可以向散列数据添加密钥。设备需要具有密钥的副本,因此它不是一种非常安全的方法,因为密钥可以通过逆向工程或其他方法从设备中提取。如果设备受到良好的保护,例如,如果设备位于安全位置,安全芯片或非常远的位置,例如太空卫星,并且您确信没有提供远程访问的缺陷,这可能就足够了。
否则,需要一个非对称的加密系统,只有这些数据文件的合法来源知道私钥,以及设备用来验证加密散列的公钥,如duskwuff的回答所述。
如果您只关心意外或非恶意篡改,则CRC应该足够了。
(我在这里使用了一个有点循环的'恶意'定义:如果有人去重新计算或操纵CRC以使其编辑工作的麻烦,那就算是'恶意'而我们不会反对它。)
我的目的是检测篡改此文件的内容
如果您需要检测故意篡改文件,则需要某种加密 签名 - 不只是哈希。
如果您可以保护设备内的密钥,请使用 HMAC 作为签名算法可能就足够了。但是,如果从设备中提取秘密,用户将能够使用此伪造签名。
如果无法保护设备中的密钥,则需要使用非对称签名算法。 Libsodium的 crypto_sign 蜜蜂 为此提供一个很好的API。或者,如果要直接使用基础算法, EdDSA 是一个不错的选择。
crypto_sign
这些选项中的任何一个都需要为签名分配相对大量的空间(32到64个字节),并且验证签名将比非加密签名花费更多的时间。如果您需要有效防止篡改,这在很大程度上是不可避免的。