你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

信息安全专题 | 安全存储(1)STM32H7的密钥存储

[复制链接]
STMCU-管管 发布时间:2021-7-5 11:25
在《信息安全专题 | 代码保护(1)使用STM32H7新特性保护片上代码的机密性》一文中,与大家探讨了如何利用STM32H7的安全用户存储区(又称“安全访问模式”)实现安全调试。) W. ^( w! h$ V9 Q

+ R* {/ q( z7 q
3 f2 Q$ a3 i) f  [  l$ W8 p
本文继续为大家介绍STM32H7系列如何实现密钥的安全存储与使用。7 D0 A4 t$ Q/ Y' U- S% N! R- Z
▲ H753密钥安全存储和使用-理论和例程介绍
▲ H753密钥安全存储和使用-Demo演示

) d3 |* V; g& T0 `
使用STM32H7 安全新特性实现敏感数据(密钥)的安全存储与使用

  R( z% b- O3 o! O  u密钥的安全存储与使用
! o% G; d# J! D; N7 x% W5 p0 ~% e' C* S4 Y9 y+ S
安全通信、用户数据加密存储等都离不开密钥,密钥安全存储与使用是嵌入式系统中常见的安全功能需求之一。MCU上对于密钥的保护通常会从几个方面着眼 :$ w5 h" Q# J% Q

% Z) r: U  ?+ Z, [+ g& W2 b

9 w* Z9 r7 J4 ]9 t8 `* u$ ]. h调试端口访问:避免通过调试端口获取密钥,通常通过调试端口保护机制来实现8 l/ W. r: V0 i5 g+ x. r& b1 ?# n
软件代码访问:禁止任意软件直接读取密钥,避免由于软件漏洞可能带来的密钥被恶意代码获取的风险,可以通过隔离机制来实现
$ Y2 \0 Y2 Z5 s' \* r( a# S2 o, t* r运行期间对密钥使用的保护* G+ ]( R5 L0 y5 X/ `! n" v
如果加解密操作通过软件实现,那么软件隔离机制是方法之一
0 w/ J! L* D, \. N0 K+ s0 b1 I如果加解密操作可以通过硬件单元完成,那么让密钥只能由硬件直接操作而不允许CPU/DMA访问也是一 种有效的方法
, C" B6 W' r. K% sSTM32H7新特性提供基于片上Flash的安全存储
+ |4 V, ?: J! b
- O2 Y  ^, {; c4 v) l调试端口连接可控" [$ w& J% G* c
在RDP0条件下也可实现对调试端口的保护:上电调试接口即不可连接(类似RDP2的效果)$ Z& D+ x9 N) x8 c$ V9 R1 O3 C
比RDP2更灵活:可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的可能性
# }, |; P2 H4 H4 XPCROP区域阻断D-Bus访问,防止程序窃取敏感数据
6 i9 F' C" V# \2 K. O& d3 p用户片上Flash进一步隔离:保护根密钥不被木马程序盗取
3 N  x5 X% A1 i2 Q: T3 OCRYP的KEY寄存器具有只写属性:普通代码可以使用它对存储在普通区域的敏感数据密文做解密操作,但是无法拿到密钥本身/ O$ e5 w" X3 |# y9 }9 Y

$ ]7 O1 S2 t) [4 L6 H# F5 {PCROP保护的设置和撤销5 r5 d3 r* h6 r, W8 p4 _1 M. V3 g
PCROP区域的设置
& O! A# K) P7 ?5 d
( p; M% T  [. r3 J' o. V
+ C& v# |9 R8 q% C) Q
每个bank可设置一个PCROP区:大小从512字节到整个bank;粒度,256字节
& X8 j; F$ I1 T6 q4 g; T由以下选项字节指定有效范围PROT_AREA_START1/2、*** _END1/2& P  @8 l# C1 B+ V% i
起始地址 > 结尾地址,保护无效
5 \) [; ^2 f: t( FPCROP区域范围只能增大,不能减小,除非撤销区域保护后重新设置范围
$ j0 [% F7 V3 b0 v5 R  rPCROP区域的撤销% x, [$ f4 p9 H& E7 v$ |) b0 @5 v: l
RDP降级 + PCROP范围无效,同时进行
( I; v9 J3 H: |! b若此时RDP=0,要先升级到RDP1再做降级( ~* o+ _" s! [/ o, a; ]
PCROP区域的保留-由于其他原因需要做RDP降级,但同时想保留PCROP区域里的内容,以及保护效果
+ K  z5 v  I; O" m9 ]3 t9 W区域范围保持不变(起始地址 < 结束地址)
! Z+ e" @- I7 m1 a; k! YDMEP1/2 = 0, r, f$ ]2 Q4 z
11.png
7 {8 S2 U" q* c' `/ b( }8 y  d
STM32H7上的安全存储
$ m  q9 j2 T; ?
12.png
13.png
- v4 S+ T  F# K& n! |8 u  M) C: n

7 y. H9 C0 i- j0 b
▲ STM32H7上的安全存储. 启动代码

8 i, S+ x' c; W, P) C7 N
14.png
▲ STM32H7上的安全存储. 应用代码
5 x# ^8 K: K) `$ I
15.png
▲ 安全STM32H7 安全存储示例
5 y# p5 T2 \5 f  J3 F
安全存储例程使用说明
6 d; E0 S# O3 d8 W: e
2 M5 r) b8 N& o
3 \& Q7 s: C0 g0 t! {
解压缩软件包,使用熟悉的IDE分别打开Boot和App两个工程,分别编译
0 @6 v/ R8 b2 U0 Z( ?# ]App工程可以使用IDE或者熟悉的烧录工具下载# v. {7 f9 P% j0 X' P6 a2 S
Boot工程:
- p! t1 Y- W% s4 qBoot工程image,占据片上Flash第一个Sector;密钥恢复函数所在的PCROP区域,也在第一个Sector里面4 G- T: G3 p/ n8 p9 b. o0 w( j% _
使用IDE对Boot工程编译即可,得到Boot.hex。不要继续使用IDE来下载+ h/ B9 f4 m& J9 @7 T
密钥恢复函数的生成和下载3 @- e2 h4 p/ a% `) z2 k9 H5 Y$ D% q( R; }
到命令行窗口,分别使用两个脚本生成 “密钥恢复函数”,以及下载密钥 和Boot image到片上Flash的第一个Sector(如下图)
; Y* `, D3 l# u( D4 u% z1 P6 I/ S
16.png
打开串口调试助手:115200波特率,8bit数据位,1bit停止位;无校验位,无流控
) z; b" B, x; J/ K4 V5 \, o启动STM32H753-Nucleo板(复位按键+用户按键)0 H; {. Q# i2 i8 M
17.png
▲ Boot 工程菜单

8 s7 }( T! e0 E3 I$ j: `密钥的预装载和后续使用
8 j& M6 x" k6 j" W: f* s2 b密钥,由运行于安全用户存储区的Boot在上电的时候从PCROP保护区域执行代码,预装到CRYP硬件模块的密钥寄存器,该寄存器具有“WO”属性
1 N' C; L; V: W# K7 w9 l在后续的CRYP操作中,HAL驱动不能再去修改密钥寄存器,因而示例程序中的HAL Driver已经做了如下一些修改:% f+ [$ b: A; _/ `+ @; j
仅仅在初始化结构体中,使用空指针赋值pKey是不够的
' p- v3 R* w( K" y+ `! d0 l还需要对初始化结构体中的KeyIVConfigSkip成员进行特别规定,添加新的选项(***_Never)
2 g' k8 T  ]$ G1 ]* n$ A8 D& |( R2 g( D
18.png
19.png
▲ App工程
20.png
▲ 加解密操作的验证
; j( u( J8 y% Z% Q3 e. i5 p& n
21.png
▲ AES-GCM 注意事项

% E7 J: z+ I2 }8 d& S8 l$ e注意事项
* }$ [8 ?8 k) b) hSEC_AREA没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改SEC_AREA;STM32CubeProgrammer是无法操作SEC_AREA成功的
, P1 u8 ^% r& V5 r$ U
" \- A0 _1 M4 M8 q- g
; Z% e( W7 s$ a2 U
SECURITY=1,IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式2 S5 q; d: M6 F/ o$ Z4 t
22.png
调试Boot工程 (对PCROP区域代码的调用)+ w* y1 s2 x+ L" k! v* k, \" x
Flash保护没有打开时,可以在Boot工程调试PCROP区域里的 “密钥恢复函数”& ]$ ^) n8 Y% v. R: `( e
Boot image和 “密钥恢复函数”,在同一个可擦除Sector,由脚本一起烧录
' r3 y4 L: b* O调试Boot image时,需要去掉对应的flash loader设置:三种IDE配置如下
" E( ~2 m8 {3 B4 p# _4 Q' F
23.png
密钥恢复函数$ V/ E; z- [3 z  v8 r/ |

3 w% g% y" v& N' I" t- ^; n1 ]

5 }- |# s& V& H$ l使用脚本把密钥数据转换成 “密钥函数”
2 O$ d. t$ N( b+ Q
24.png
把密钥恢复到该函数的调用参数中
$ g- ~& h. g: l& S; {' ]- K- E/ e0 T* U" o; p% n6 P: L
  D# T2 t; ?) n# ?9 u
fp ((uint8_t *)&(CRYP->K2LR)) // 给CRYP使用' U/ u6 c1 k$ C# n

: w) R: r' U3 k# v* A! b
2 m( ]' b6 P$ l6 R6 x) W
fp(&key[0]) // 用于打印到串口屏幕,供第三方 加解密工具做同样操作,来比对加解密结果  `; v/ w0 d! f. h  [
25.png
为进一步提高安全性) }+ K3 ?; W& U) b5 t+ \2 S
密钥恢复函数不接受任何参数,固定是把密钥恢复到CRYP密钥寄存器中$ ?: P5 k) r: K5 g
参见 “密钥函数” 生成脚本做相应修改
, f, o! G7 r, s  b
+ t( K" A, V" G" c- e* W4 I  e% E小结
) T% X3 y4 L/ d9 F) i安全STM32H7能够提供片上存储的安全性安全硬件,助力安全存储:
5 u& u2 M( g6 o+ ]安全用户存储区-选项字节设置,上电即生效* y$ g6 Y2 g! a! m- d( b6 c6 t; i
PCROP保护-选项字节设置,上电即生效  M; n* T! i) M  ]
CRYP密钥寄存器WO% t9 c- v- l/ E2 T
调试端口连接可控 — 上电缺省不可连接( K2 F( n/ k* R5 e3 c
. r3 \. V8 X$ h$ i2 y1 h% q3 q1 N1 O

% v0 Y9 V# f" [7 M& x$ C; k
赞 收藏 评论1 发布时间:2021-7-5 11:25

举报

1个回答
ghost110 回答时间:2021-7-7 09:46:25
加密级别能到多少?: ^( B5 M& z# |6 s) Z& i  v( S9 V7 v

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版