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

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

[复制链接]
STMCU-管管 发布时间:2021-7-5 11:25
在《信息安全专题 | 代码保护(1)使用STM32H7新特性保护片上代码的机密性》一文中,与大家探讨了如何利用STM32H7的安全用户存储区(又称“安全访问模式”)实现安全调试。
5 [. k- }) b; s6 Q/ U- \" S- \6 g- r+ r

- t) {/ f4 {0 D本文继续为大家介绍STM32H7系列如何实现密钥的安全存储与使用。
, R# a9 I, D- F2 o1 h" A
▲ H753密钥安全存储和使用-理论和例程介绍
▲ H753密钥安全存储和使用-Demo演示
( R& e" M0 O0 F- l- g4 N
使用STM32H7 安全新特性实现敏感数据(密钥)的安全存储与使用

( d/ m# H/ v$ d, Q+ j密钥的安全存储与使用; A" }  t6 x2 Y- g0 `! _! ^( n
/ n6 [; S% v! A" w' W( N  o& h
安全通信、用户数据加密存储等都离不开密钥,密钥安全存储与使用是嵌入式系统中常见的安全功能需求之一。MCU上对于密钥的保护通常会从几个方面着眼 :9 S: I6 l5 s  H* r6 x! G9 G1 T3 d

: u% {8 p9 |+ P4 E% o. [+ }
: o9 t- L/ n& l4 F  F- c
调试端口访问:避免通过调试端口获取密钥,通常通过调试端口保护机制来实现
( c/ `4 x; I/ y1 Z  w% n软件代码访问:禁止任意软件直接读取密钥,避免由于软件漏洞可能带来的密钥被恶意代码获取的风险,可以通过隔离机制来实现
( m; N0 l2 H) Y9 U3 C运行期间对密钥使用的保护
0 F! ], n+ x+ [  I如果加解密操作通过软件实现,那么软件隔离机制是方法之一. [2 W4 J( h# z6 y/ k' b( y
如果加解密操作可以通过硬件单元完成,那么让密钥只能由硬件直接操作而不允许CPU/DMA访问也是一 种有效的方法
9 P( ~, X2 E" \2 ]* sSTM32H7新特性提供基于片上Flash的安全存储* i: ~9 C4 l7 G& h" w7 c! a" T) ~

& |9 W7 {1 s0 {- O% b7 I# d$ l调试端口连接可控3 |( H/ \' g& Y1 O  Z
在RDP0条件下也可实现对调试端口的保护:上电调试接口即不可连接(类似RDP2的效果)
0 _7 ?' Y  d$ _" U. w' ]% M比RDP2更灵活:可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的可能性
7 j+ M! N& {/ o/ A8 K3 T* JPCROP区域阻断D-Bus访问,防止程序窃取敏感数据* V. _) r  Y, `' o$ ~
用户片上Flash进一步隔离:保护根密钥不被木马程序盗取6 b5 n- q6 g' t. k% E
CRYP的KEY寄存器具有只写属性:普通代码可以使用它对存储在普通区域的敏感数据密文做解密操作,但是无法拿到密钥本身* M8 X8 f9 O$ C  `# l* p
4 ~- x" V9 {6 r& I7 F+ `% c
PCROP保护的设置和撤销) b  x  L& V% b  u/ g
PCROP区域的设置5 U6 R2 ?& x( z4 b5 A9 k* O+ G, ]6 X1 g
- R# p8 x8 C" S' J. e
2 I6 i1 Z; ]' E+ p
每个bank可设置一个PCROP区:大小从512字节到整个bank;粒度,256字节
8 r5 F! r- s- A9 o) n由以下选项字节指定有效范围PROT_AREA_START1/2、*** _END1/2: g! `. J7 O- E' E8 L- J6 c, b' z
起始地址 > 结尾地址,保护无效  B. o1 x0 f/ r4 _9 J1 `( A. d' W
PCROP区域范围只能增大,不能减小,除非撤销区域保护后重新设置范围
$ M1 E# i9 v. D; WPCROP区域的撤销" v: k  [+ X; \5 Y
RDP降级 + PCROP范围无效,同时进行+ @+ @. {- d# s) \8 ?: q
若此时RDP=0,要先升级到RDP1再做降级! N1 p8 A* j9 c4 D1 p. S
PCROP区域的保留-由于其他原因需要做RDP降级,但同时想保留PCROP区域里的内容,以及保护效果
) Q% J$ L# R1 F) O9 b% q9 X2 w区域范围保持不变(起始地址 < 结束地址)4 `( u4 u/ H8 {! W
DMEP1/2 = 01 V6 U4 O% K0 B8 b) h1 |$ }
11.png
" ^2 X8 E- ?' d' L5 I$ F
STM32H7上的安全存储+ H  _. ^. X9 {9 v% F
12.png
13.png

6 ~. z6 |( m" i- R' o$ s. a

, T) i4 m$ ]: `1 i6 C& W& d! {
▲ STM32H7上的安全存储. 启动代码

+ @0 R- ~2 F, r5 l0 U$ U
14.png
▲ STM32H7上的安全存储. 应用代码
" t( W5 W3 r! N( Z6 T
15.png
▲ 安全STM32H7 安全存储示例

2 A, h. O  j9 B# a# O% S安全存储例程使用说明
% Z7 z" I3 z/ r# a/ v$ X3 R! {, Z  B6 f

' F" f+ L3 {1 Z% L解压缩软件包,使用熟悉的IDE分别打开Boot和App两个工程,分别编译
6 W+ ^& `" O& h/ Y6 E( l2 bApp工程可以使用IDE或者熟悉的烧录工具下载
4 E, S' w' P9 [Boot工程:8 g2 ]3 M9 u9 \' [* r$ s
Boot工程image,占据片上Flash第一个Sector;密钥恢复函数所在的PCROP区域,也在第一个Sector里面
* [9 f0 n. \7 r/ g; r# y! J使用IDE对Boot工程编译即可,得到Boot.hex。不要继续使用IDE来下载1 ?. ]) y, L! U
密钥恢复函数的生成和下载
. M6 N' b# ]/ ]到命令行窗口,分别使用两个脚本生成 “密钥恢复函数”,以及下载密钥 和Boot image到片上Flash的第一个Sector(如下图)4 C; G: Z! J* B/ T
16.png
打开串口调试助手:115200波特率,8bit数据位,1bit停止位;无校验位,无流控3 B, x5 J, {! g3 P* x
启动STM32H753-Nucleo板(复位按键+用户按键)2 w! ^! f6 t7 Y
17.png
▲ Boot 工程菜单

( A( u) D2 `1 b/ L7 T密钥的预装载和后续使用- @( R$ `% P' S& n& {& M/ I1 g
密钥,由运行于安全用户存储区的Boot在上电的时候从PCROP保护区域执行代码,预装到CRYP硬件模块的密钥寄存器,该寄存器具有“WO”属性
: p2 }; e* X9 R7 }在后续的CRYP操作中,HAL驱动不能再去修改密钥寄存器,因而示例程序中的HAL Driver已经做了如下一些修改:
8 H3 u8 h; A! r  Q1 t  B: g# z仅仅在初始化结构体中,使用空指针赋值pKey是不够的
1 R. X+ q9 {- l/ p3 a还需要对初始化结构体中的KeyIVConfigSkip成员进行特别规定,添加新的选项(***_Never)  O; @9 O% e' }: T
18.png
19.png
▲ App工程
20.png
▲ 加解密操作的验证

5 ~' d" M2 B/ K2 x: S
21.png
▲ AES-GCM 注意事项
( ~  q4 G7 N5 ~# W9 R/ {  u
注意事项- K: i9 F( U; P4 k( F7 ]
SEC_AREA没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改SEC_AREA;STM32CubeProgrammer是无法操作SEC_AREA成功的$ ~! N/ G. F" U5 R/ R

0 l* l, m& ]& ~* ^! K' h9 t

! y+ F" r& D1 J: O$ L7 k1 L! kSECURITY=1,IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式
$ G1 n, {7 p8 z- @2 i6 _) P
22.png
调试Boot工程 (对PCROP区域代码的调用)
) X+ t' c  q' F' l* m8 dFlash保护没有打开时,可以在Boot工程调试PCROP区域里的 “密钥恢复函数”
; Z( u* j  {+ k# Y- I1 KBoot image和 “密钥恢复函数”,在同一个可擦除Sector,由脚本一起烧录7 w. X2 r; j5 S7 Z8 e" H. q
调试Boot image时,需要去掉对应的flash loader设置:三种IDE配置如下' G0 Q9 R! F* r" R, z9 g
23.png
密钥恢复函数+ j$ K1 R% t# f7 B6 J1 |

, c. B# H3 X5 A+ a
8 m6 O- n1 [2 l
使用脚本把密钥数据转换成 “密钥函数”
+ a9 K. e5 k" Z2 G$ ~2 `
24.png
把密钥恢复到该函数的调用参数中
/ m! s0 K9 R4 n% w! t
6 Q1 E$ `3 t1 G: f

% A) S  j- m& S. v1 _$ a4 a1 |" ifp ((uint8_t *)&(CRYP->K2LR)) // 给CRYP使用) C5 b: u+ d, f3 l- y+ Q
% J; i, }4 m" W4 h, I8 S: n
, T: @& N0 J& {& S5 J( W
fp(&key[0]) // 用于打印到串口屏幕,供第三方 加解密工具做同样操作,来比对加解密结果- E7 W! B& ?# w: a5 t: [
25.png
为进一步提高安全性
/ w4 `" }$ T# q$ F6 W$ H密钥恢复函数不接受任何参数,固定是把密钥恢复到CRYP密钥寄存器中
( S$ r2 x8 `- X. Y参见 “密钥函数” 生成脚本做相应修改: x. E4 d+ Z, t
4 V, D" e$ Z2 R1 w) g
小结0 a& _1 l/ O( X/ v' x
安全STM32H7能够提供片上存储的安全性安全硬件,助力安全存储:
( C9 ~+ e# D  @# R$ v  C# ]% J安全用户存储区-选项字节设置,上电即生效/ D% W' n7 R5 Y) O
PCROP保护-选项字节设置,上电即生效& b9 V  z4 o2 ]4 g; `
CRYP密钥寄存器WO
! }) x: [! o2 ~) R调试端口连接可控 — 上电缺省不可连接
) ~. l6 F+ L3 H$ U1 K8 Q7 G$ z. m2 X* f- `- i
- c/ ]( h0 x, A9 f/ v8 J, |
赞 收藏 评论1 发布时间:2021-7-5 11:25

举报

1个回答
ghost110 回答时间:2021-7-7 09:46:25
加密级别能到多少?
, Z' V' y: e+ n" v) r8 N' d# {

所属标签

相似技术帖

官网相关资源

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