
在《信息安全专题 | 代码保护(1)使用STM32H7新特性保护片上代码的机密性》一文中,与大家探讨了如何利用STM32H7的安全用户存储区(又称“安全访问模式”)实现安全调试。 本文继续为大家介绍STM32H7系列如何实现密钥的安全存储与使用。 ▲ H753密钥安全存储和使用-理论和例程介绍 ▲ H753密钥安全存储和使用-Demo演示 使用STM32H7 安全新特性实现敏感数据(密钥)的安全存储与使用 密钥的安全存储与使用 安全通信、用户数据加密存储等都离不开密钥,密钥安全存储与使用是嵌入式系统中常见的安全功能需求之一。MCU上对于密钥的保护通常会从几个方面着眼 : 调试端口访问:避免通过调试端口获取密钥,通常通过调试端口保护机制来实现 软件代码访问:禁止任意软件直接读取密钥,避免由于软件漏洞可能带来的密钥被恶意代码获取的风险,可以通过隔离机制来实现 运行期间对密钥使用的保护 如果加解密操作通过软件实现,那么软件隔离机制是方法之一 如果加解密操作可以通过硬件单元完成,那么让密钥只能由硬件直接操作而不允许CPU/DMA访问也是一 种有效的方法 STM32H7新特性提供基于片上Flash的安全存储 调试端口连接可控 在RDP0条件下也可实现对调试端口的保护:上电调试接口即不可连接(类似RDP2的效果) 比RDP2更灵活:可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的可能性 PCROP区域阻断D-Bus访问,防止程序窃取敏感数据 用户片上Flash进一步隔离:保护根密钥不被木马程序盗取 CRYP的KEY寄存器具有只写属性:普通代码可以使用它对存储在普通区域的敏感数据密文做解密操作,但是无法拿到密钥本身 PCROP保护的设置和撤销 PCROP区域的设置 每个bank可设置一个PCROP区:大小从512字节到整个bank;粒度,256字节 由以下选项字节指定有效范围PROT_AREA_START1/2、*** _END1/2 起始地址 > 结尾地址,保护无效 PCROP区域范围只能增大,不能减小,除非撤销区域保护后重新设置范围 PCROP区域的撤销 RDP降级 + PCROP范围无效,同时进行 若此时RDP=0,要先升级到RDP1再做降级 PCROP区域的保留-由于其他原因需要做RDP降级,但同时想保留PCROP区域里的内容,以及保护效果 区域范围保持不变(起始地址 < 结束地址) DMEP1/2 = 0 ![]() STM32H7上的安全存储 ![]() ![]() ▲ STM32H7上的安全存储. 启动代码 ![]() ▲ STM32H7上的安全存储. 应用代码 ![]() ▲ 安全STM32H7 安全存储示例 安全存储例程使用说明 解压缩软件包,使用熟悉的IDE分别打开Boot和App两个工程,分别编译 App工程可以使用IDE或者熟悉的烧录工具下载 Boot工程: Boot工程image,占据片上Flash第一个Sector;密钥恢复函数所在的PCROP区域,也在第一个Sector里面 使用IDE对Boot工程编译即可,得到Boot.hex。不要继续使用IDE来下载 密钥恢复函数的生成和下载 到命令行窗口,分别使用两个脚本生成 “密钥恢复函数”,以及下载密钥 和Boot image到片上Flash的第一个Sector(如下图) ![]() 启动STM32H753-Nucleo板(复位按键+用户按键) ![]() ▲ Boot 工程菜单 密钥的预装载和后续使用 密钥,由运行于安全用户存储区的Boot在上电的时候从PCROP保护区域执行代码,预装到CRYP硬件模块的密钥寄存器,该寄存器具有“WO”属性 在后续的CRYP操作中,HAL驱动不能再去修改密钥寄存器,因而示例程序中的HAL Driver已经做了如下一些修改: 仅仅在初始化结构体中,使用空指针赋值pKey是不够的 还需要对初始化结构体中的KeyIVConfigSkip成员进行特别规定,添加新的选项(***_Never) ![]() ![]() ▲ App工程 ![]() ▲ 加解密操作的验证 ![]() ▲ AES-GCM 注意事项 注意事项 SEC_AREA没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改SEC_AREA;STM32CubeProgrammer是无法操作SEC_AREA成功的 SECURITY=1,IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式 ![]() Flash保护没有打开时,可以在Boot工程调试PCROP区域里的 “密钥恢复函数” Boot image和 “密钥恢复函数”,在同一个可擦除Sector,由脚本一起烧录 调试Boot image时,需要去掉对应的flash loader设置:三种IDE配置如下 ![]() 使用脚本把密钥数据转换成 “密钥函数” ![]() fp ((uint8_t *)&(CRYP->K2LR)) // 给CRYP使用 fp(&key[0]) // 用于打印到串口屏幕,供第三方 加解密工具做同样操作,来比对加解密结果 ![]() 密钥恢复函数不接受任何参数,固定是把密钥恢复到CRYP密钥寄存器中 参见 “密钥函数” 生成脚本做相应修改 小结 安全STM32H7能够提供片上存储的安全性安全硬件,助力安全存储: 安全用户存储区-选项字节设置,上电即生效 PCROP保护-选项字节设置,上电即生效 CRYP密钥寄存器WO 调试端口连接可控 — 上电缺省不可连接 |
加密级别能到多少? |
NUCLEO-H723ZG开发板试用 ——串口点灯测试
经验分享 | STM32H7 EXTI + SPI +DMA 双缓冲应用演示
【经验分享】STM32H7时钟
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI