Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 嵌入式固件的代码签名:固件加密时,CRC是否足够?_Encryption_Embedded_Code Signing_Firmware - Fatal编程技术网

Encryption 嵌入式固件的代码签名:固件加密时,CRC是否足够?

Encryption 嵌入式固件的代码签名:固件加密时,CRC是否足够?,encryption,embedded,code-signing,firmware,Encryption,Embedded,Code Signing,Firmware,我正在为嵌入式系统(微控制器)编写固件。固件可以由引导加载程序更新(也由我编写)。 现在需要采取措施防止固件被操纵,因此系统必须仅在下载的固件具有某种有效签名的情况下执行该固件。 固件文件是加密的。它由引导加载程序(在微控制器中)解密,然后编程到闪存中。 由于固件是加密的,我认为对flash内容进行简单的CRC检查就足以证明固件的有效性。但我不是网络安全专家,所以。。。我需要更多吗? 我认为加密足够强大,闪存无法读取 由于固件是加密的,在我看来,一个简单的CRC检查 闪存上的内容应足以证明固件

我正在为嵌入式系统(微控制器)编写固件。固件可以由引导加载程序更新(也由我编写)。 现在需要采取措施防止固件被操纵,因此系统必须仅在下载的固件具有某种有效签名的情况下执行该固件。 固件文件是加密的。它由引导加载程序(在微控制器中)解密,然后编程到闪存中。 由于固件是加密的,我认为对flash内容进行简单的CRC检查就足以证明固件的有效性。但我不是网络安全专家,所以。。。我需要更多吗? 我认为加密足够强大,闪存无法读取

由于固件是加密的,在我看来,一个简单的CRC检查 闪存上的内容应足以证明固件 有效性但我不是网络安全专家,所以。。。我还需要更多吗

如果您选择了可靠的加密方法,并正确保护加密密钥,并且您还保证固件在传输后无法读取,并且引导加载程序拒绝固件(如果无法成功解密),则您已经保证固件的有效性。除非违反上述假设之一,否则只有拥有加密固件密钥的人才能生成引导加载程序将接受的固件

正如其他人所指出的,CRC不用于防止故意修改,因为您可以将垃圾数据附加到任何文件中以生成所需的CRC。但是,我仍然建议在固件升级过程的至少两个阶段使用CRC:

  • CRC在传输过程中加密数据,最好是在每个传输的数据包上,这样您就可以在不重新启动整个过程的情况下重新传输单个数据包(即,加密数据的256字节块上的CRC)
  • 在固件(减去引导加载程序)占用的闪存区域上,根据成功解密后引导加载程序生成的已解密固件的CRC(或静态固定CRC,某些µC-IDE支持此内置CRC)进行第二次加密,以确保未发生闪存写入错误。通常的做法是将该CRC值安全地保存到不属于CRC的某个闪存区域,以便引导加载程序可以在每次设备重置时验证应用程序的完整性

CRC和加密实际上没有什么关系。CRC用于确保闪存的完整性,加密用于保护数据免受入侵者的入侵。但是,如果校验和本身未加密,则可以对使用的CRC算法进行反向工程。这意味着可以在没有任何CRC错误的情况下更改闪存。但是,由于闪存是读保护的,我不认为这有什么关系。CRC对于检测有意修改是无用的,失败是微不足道的。您必须具有某种MAC或数字签名才能检测篡改。您没有提到密钥是如何管理的,但是正确使用AES-GCM将在一次通过中提供加密和篡改检测。不,CRC是不够的。但是有一些加密算法可以满足您的需要。选择一种加密算法,该算法除了提供机密性外,还提供完整性和/或身份验证。完整性确保信息未被篡改。认证确保信息来自官方来源。@Lundin说。如果已检查加密,则表示已验证系统中的传输过程。在此之后,您(如果您的假设是正确的)必须防止闪存中的意外数据丢失。这当然是一种非常脆弱的安全形式,但在许多情况下都是合理的。谢谢所有的答案。更清楚一点:CRC是加密固件的一部分,因此除非加密被破坏,否则无法操作。微控制器没有硬件加密支持(如AES),而且资源非常有限。