STM32安全固件更新的额外设计

发布者:数字奇迹最新更新时间:2023-07-06 来源: zhihu关键字:STM32  更新 手机看文章 扫描二维码
随时随地手机看文章

为了安全的额外设计

我们要让一般的固件更新变成安全的固件更新。体现在:

a. 固件是保密的

b. 固件是完整的

c. 固件是可靠的


固件的保密,在传输过程中是通过加解密技术保证的;在设备更新过程中的保密,则是通过STM32 安全启动所提供的安全机制来保证。

而固件的完整性,传输过程中的完整性则通过加密技术中的哈希函数 SHA256 或者 AESGCM 来保证。当然 ,单独谈完整性,在有攻击的情况下 ,是没有意义的 。哈希函数一般都是结合加密技术来保证完整性。在安全启动里,我们需要验证该固件是否可靠。在那时 ,我们需要重新计算该哈希值或者认证码,我们要进行比较,只有完全相等,才认为该固件没有被破坏。

固件的来源可靠性,则通过加密技术中的认证函数,或者是数字签名技术 ECDSA 或者是认证码 AES-GCM。

总结一下 ,如果我们需要让固件在更新过程是保密、完整、可靠的目标,我们要在流程上增加额外的环节,例如增加加密与解密的阶段。增加的环节会影响到传输过程中的设计选择,同时数据结构设计时需要增加额外的字段。


安全固件更新的额外流程


① 固件的加密与解密

我们要在发布之前对固件采用 AES 进行加密。使用的加密密钥应该和预埋在安全启动部分的密钥一样。对称密钥要进行保密。我们需要让安全启动保证对称密钥的保密、完整、可靠三个属性的保护。

相应的,在收到固件之后,需要对固件进行解密。STM32 SBSFU 的双镜像解密操作时是发生在启动时,而不是固件下载时。这种设计是为了双镜像的数据交换 。Flash 运行的代码不能是正在改写的的代码,而启动时两个镜像都没有在使用 。


② 固件的认证与验证

我们还要对固件进行签名或者认证。如果采用非对称密钥技术,则需要将公钥预埋在安全启动部分。由安全启动对该公钥进行完整可靠性的保证。相应的,在通过通讯接口接收到需要更新的固件,安全启动要校验签名或者使用对称密钥的认证码进行比对。


③ 固件版本的检查

针对可能的版本攻击,我们需要在安全启动的安全数据区,要保存软件的正确版本,我们要确保版本总是向前增长,而不是向后减小。


固件的传输选择

我们使用STM32 来构造安全固件更新,那么我们希望在数据链路上的传输的固件是加密的。

我们前面提到我们有两种固件更新的流程,一种是近距离通过UART 或者STLink 更新,一种是通过云端来更新固件。对于保密性,我们强调的是端到端的安全。除非我们非常信任第三方平台,否则,固件的加密应该是整体加密。也就是说,即使有了中间结点 IoT 平台,固件更新可以从起点就开始加密,同时不需要在中间结点解密。

考虑到安全,那么CRC32 是可以被加密级别函数所取代,所以 CRC32 校验和可以被加密级的哈希函数以及认证码取代。

当然,这种情况下,差分更新会受到影响。如果需要差分更新,则需要仔细评估整个更新链条的安全性。

对于压缩,因为 从 服务器端 传送 至设备端,可以认为风险低 。


固件的存储

考虑到一种整体安全的情况下,这也是我们STM32 客户所提到的一种案例,假设服务器被攻破了,那么所有的固件更新操作都可能是错误,推荐用户加入冗余。例如服务器会让 MCU 擦除掉 MCU 的固件。这个时候 MCU 作为一个被动执行者,不可能不执行。如果MCU 只保存一份正确的固件,那么下次重新启动时候,可能 MCU 就无法运行了。如果我们已经考虑到冗余,我们需要在MCU 里总是保存一份正确的固件代码。使用 IWDG 来判断启动时是否有正确的固件执行,如果没有,则总是从保存的正确的默认固件里启动。


安全固件更新的数据结构

在传输的数据结构中,增加了随机数字段,这是加解密算法所需要的字段;增加了哈希字段,这就是为了检查固件的完整性;增加了签名字段,这是为了检查的固件的可靠性。

在启动数据区中,增加了固件的版本,用户的密钥信息。


关键字:STM32  更新 引用地址:STM32安全固件更新的额外设计

上一篇:STM32 USB音频应用
下一篇:安全固件更新 - STM32 SBSFU的实现与应用

推荐阅读最新更新时间:2024-11-22 11:59

STM32一枚按键的旅行(GPIO+中断+NVIC分组)
首先看硬件原理图 GPIO的C13和E0是两个按键,平时是高电平,当按键下去的时候就接地变成低电平。(所以中断是下降沿触发) 开始软件配置: 宏定义两个按键 (仔细看是有必要的,因为你看 GPIO_Pin_13和GPIO_PinSource13的排序是不同的) #define TSKEY1GPIO GPIOC #define TSKEY1GPIOPIN GPIO_Pin_13 #define TSKEY1IRQ EXTI15_10_IRQn #define TSKEY1_ExtiPortsource GPIO_PortSourceGPIOC #define TSKEY1_Ex
[单片机]
<font color='red'>STM32</font>一枚按键的旅行(GPIO+中断+NVIC分组)
基于STM32的自动量程电压表的设计方案
方案中的整个系统可以用一块9V电池供电,实现了低功耗和便携功能。交流测量是用AD637真有效值转换芯片将交流信号转换成直流电压后测量;用带钳位保护的反向放大器进行输入电压转换,实现了10MΩ的输入阻抗和高安全性。电路中关键器件采用TI公司的精密运算放大器OPA07和仪表放大器INA128,实现了高精度的测量;ADC采用STM32f103ZET6片内自带的12位AD,实现了低功耗,量程自动切换功能。 0 引言 在智能仪器中,常常用到自动量程转换技术,这使得仪器在很短的时间内自动选取最合适的量程实现高精度的测量。自动量程的实现一般通过控制输入信号的衰减放大倍数实现,就电压表来说其输入测量电压会大于其AD 转换器的输入范围,所以
[单片机]
基于<font color='red'>STM32</font>的自动量程电压表的<font color='red'>设计</font>方案
STM32的PWM输入模式设置并用DMA接收数据
参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The procedure is the same except:  Two ICx signals are mapped on the same TIx input.  These 2 ICx signals are active on edges with opposite polarity.  One of the two TIxFP signals is selected as trigger input and the
[单片机]
<font color='red'>STM32</font>的PWM输入模式设置并用DMA接收数据
STM32晶振不起振
1.外部晶振虚焊 2.外部晶振的电容不匹配,可能是器件盒里面混入了大容值电容 3.芯片挂了 4.STM32f103有内部晶振。刚刚上电时,所有Clock都是源于内部晶振,所以当片内没有程序或内部程序没有使能外部晶振时,外部晶振是不会起振的。 在RCC_Configuration(void)看相关设置,有没有启动外部晶振HSE. PS:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法:  2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。  2.2)分别重映射OSC_
[单片机]
STM32学习笔记之EXTI(外部中断)
一:EXTI(外部中断)说明 =========================================分割线========================================= 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置 输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独 立的屏蔽。挂起寄存器保持着状态线的中断要求。 =========================================分割线========================================= 19个中断如下:
[单片机]
<font color='red'>STM32</font>学习笔记之EXTI(外部中断)
9.STM32中对SysTick_Init()函数和Delay_us()的理解
STM32中对SysTick_Init()函数(sysTick_Config()、TimingDelay_Decrement()自定义)和Delay_us()的理解: 实验:3个LED灯以500ms的频率闪烁。
[单片机]
9.STM32中对SysTick_Init()函数和Delay_us()的理解
STM32的库如何实现对同一组IO口的一部分引脚进行读写
以写数据为例,提供的函数有 GPIO_SetBits GPIO_ResetBits GPIO_WriteBit GPIO_Write 比如我在PD口的高八位接了个并行的数据线,低八位为控制,有输入有输出。怎么实现对高八位写任意数而第八位不受影响呢。 前两个函数肯定都不可以。 第三个也不行,是对一个或多个IO口置位或复位。 第四个是写整个口,势必影响到第八位的控制信号啊。 能想到的是写一个for循环,判断每一位然后调用八次 GPIO_SetBits GPIO_ResetBits 是不是太麻烦了。。。。 知道一个方法,读输出再写输入就可以了。 GPIO的寄存器BSRR和BRR 端口位设置/复位寄存器BSRR: 注:如果
[单片机]
苹果发布Mac平台佳能打印机驱动更新
  苹果于这周发布了Mac OS X系统下的佳能打印机驱动的更新Canon Printer Drivers 2.6版本。更新包括对佳能打印机和扫描仪的支持,适用于Mac OS X 10.6或雪豹系统。   这一更新版本的文件大小为307.39MB,系统要求Mac OS X 10.6.1或以上,均支持简体和繁体中文。用户可从“软件更新”下载最新的佳能打印机驱动更新,或者直接到苹果网站查找Canon Printer Drivers v2.6 for Mac OS X v10.6。
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved