信息安全專(zhuān)題 | 安全存儲(chǔ)(1)STM32H7的密鑰存儲(chǔ)
在《信息安全專(zhuān)題 |?代碼保護(hù)(1)使用STM32H7新特性保護(hù)片上代碼的機(jī)密性》一文中,與大家探討了如何利用STM32H7的安全用戶(hù)存儲(chǔ)區(qū)(又稱(chēng)“安全訪問(wèn)模式”)實(shí)現(xiàn)安全調(diào)試。

本文繼續(xù)為大家介紹STM32H7系列如何實(shí)現(xiàn)密鑰的安全存儲(chǔ)與使用。
使用STM32H7 安全新特性實(shí)現(xiàn)敏感數(shù)據(jù)(密鑰)的安全存儲(chǔ)與使用
密鑰的安全存儲(chǔ)與使用
安全通信、用戶(hù)數(shù)據(jù)加密存儲(chǔ)等都離不開(kāi)密鑰,密鑰安全存儲(chǔ)與使用是嵌入式系統(tǒng)中常見(jiàn)的安全功能需求之一。MCU上對(duì)于密鑰的保護(hù)通常會(huì)從幾個(gè)方面著眼 :
調(diào)試端口訪問(wèn):避免通過(guò)調(diào)試端口獲取密鑰,通常通過(guò)調(diào)試端口保護(hù)機(jī)制來(lái)實(shí)現(xiàn)
軟件代碼訪問(wèn):禁止任意軟件直接讀取密鑰,避免由于軟件漏洞可能帶來(lái)的密鑰被惡意代碼獲取的風(fēng)險(xiǎn),可以通過(guò)隔離機(jī)制來(lái)實(shí)現(xiàn)
運(yùn)行期間對(duì)密鑰使用的保護(hù):如果加解密操作通過(guò)軟件實(shí)現(xiàn),那么軟件隔離機(jī)制是方法之一;如果加解密操作可以通過(guò)硬件單元完成,那么讓密鑰只能由硬件直接操作而不允許CPU/DMA訪問(wèn)也是一 種有效的方法
?STM32H7新特性提供基于片上Flash的安全存儲(chǔ)
調(diào)試端口連接可控:在RDP0條件下也可實(shí)現(xiàn)對(duì)調(diào)試端口的保護(hù):上電調(diào)試接口即不可連接(類(lèi)似RDP2的效果);比RDP2更靈活:可以由用戶(hù)代碼控制調(diào)試端口訪問(wèn)權(quán)限,實(shí)現(xiàn)安全調(diào)試,并保留修改選項(xiàng)字節(jié)的可能性
PCROP區(qū)域阻斷D-Bus訪問(wèn),防止程序竊取敏感數(shù)據(jù)
用戶(hù)片上Flash進(jìn)一步隔離:保護(hù)根密鑰不被木馬程序盜取
CRYP的KEY寄存器具有只寫(xiě)屬性:普通代碼可以使用它對(duì)存儲(chǔ)在普通區(qū)域的敏感數(shù)據(jù)密文做解密操作,但是無(wú)法拿到密鑰本身
PCROP保護(hù)的設(shè)置和撤銷(xiāo)
PCROP區(qū)域的設(shè)置:每個(gè)bank可設(shè)置一個(gè)PCROP區(qū):大小從512字節(jié)到整個(gè)bank;粒度,256字節(jié);由以下選項(xiàng)字節(jié)指定有效范圍PROT_AREA_START1/2、*** _END1/2
;起始地址 > 結(jié)尾地址,保護(hù)無(wú)效
PCROP區(qū)域范圍只能增大,不能減小,除非撤銷(xiāo)區(qū)域保護(hù)后重新設(shè)置范圍
PCROP區(qū)域的撤銷(xiāo):RDP降級(jí) + PCROP范圍無(wú)效,同時(shí)進(jìn)行;若此時(shí)RDP=0,要先升級(jí)到RDP1再做降級(jí)
PCROP區(qū)域的保留-由于其他原因需要做RDP降級(jí),但同時(shí)想保留PCROP區(qū)域里的內(nèi)容,以及保護(hù)效果:區(qū)域范圍保持不變(起始地址 < 結(jié)束地址);DMEP1/2 = 0

STM32H7上的安全存儲(chǔ)




安全存儲(chǔ)例程使用說(shuō)明
解壓縮軟件包,使用熟悉的IDE分別打開(kāi)Boot和App兩個(gè)工程,分別編譯
App工程可以使用IDE或者熟悉的燒錄工具下載
Boot工程:Boot工程image,占據(jù)片上Flash第一個(gè)Sector;密鑰恢復(fù)函數(shù)所在的PCROP區(qū)域,也在第一個(gè)Sector里面;使用IDE對(duì)Boot工程編譯即可,得到Boot.hex。不要繼續(xù)使用IDE來(lái)下載
密鑰恢復(fù)函數(shù)的生成和下載:到命令行窗口,分別使用兩個(gè)腳本生成 “密鑰恢復(fù)函數(shù)”,以及下載密鑰 和Boot image到片上Flash的第一個(gè)Sector(如下圖)



打開(kāi)串口調(diào)試助手:115200波特率,8bit數(shù)據(jù)位,1bit停止位;無(wú)校驗(yàn)位,無(wú)流控
啟動(dòng)STM32H753-Nucleo板(復(fù)位按鍵+用戶(hù)按鍵)

密鑰的預(yù)裝載和后續(xù)使用
密鑰,由運(yùn)行于安全用戶(hù)存儲(chǔ)區(qū)的Boot在上電的時(shí)候從PCROP保護(hù)區(qū)域執(zhí)行代碼,預(yù)裝到CRYP硬件模塊的密鑰寄存器,該寄存器具有“WO”屬性
在后續(xù)的CRYP操作中,HAL驅(qū)動(dòng)不能再去修改密鑰寄存器,因而示例程序中的HAL Driver已經(jīng)做了如下一些修改:僅僅在初始化結(jié)構(gòu)體中,使用空指針賦值pKey是不夠的;還需要對(duì)初始化結(jié)構(gòu)體中的KeyIVConfigSkip成員進(jìn)行特別規(guī)定,添加新的選項(xiàng)(***_Never)




注意事項(xiàng)
SEC_AREA沒(méi)有安全區(qū)時(shí),只能由RSS來(lái)初始化;有了安全區(qū)后,運(yùn)行在其中的代碼可以修改SEC_AREA;STM32CubeProgrammer是無(wú)法操作SEC_AREA成功的
SECURITY=1,IDE下載可能會(huì)失敗;要么從STM32CubeProgramer連接后,清零SECURITY;要么修改工程的復(fù)位連接方式

調(diào)試Boot工程 (對(duì)PCROP區(qū)域代碼的調(diào)用)
Flash保護(hù)沒(méi)有打開(kāi)時(shí),可以在Boot工程調(diào)試PCROP區(qū)域里的 “密鑰恢復(fù)函數(shù)”
Boot image和 “密鑰恢復(fù)函數(shù)”,在同一個(gè)可擦除Sector,由腳本一起燒錄
調(diào)試Boot image時(shí),需要去掉對(duì)應(yīng)的flash loader設(shè)置:三種IDE配置如下

密鑰恢復(fù)函數(shù)
使用腳本把密鑰數(shù)據(jù)轉(zhuǎn)換成 “密鑰函數(shù)”

把密鑰恢復(fù)到該函數(shù)的調(diào)用參數(shù)中:fp ((uint8_t *)&(CRYP->K2LR)) // 給CRYP使用;fp(&key[0]) // 用于打印到串口屏幕,供第三方 加解密工具做同樣操作,來(lái)比對(duì)加解密結(jié)果

為進(jìn)一步提高安全性:密鑰恢復(fù)函數(shù)不接受任何參數(shù),固定是把密鑰恢復(fù)到CRYP密鑰寄存器中;參見(jiàn) “密鑰函數(shù)” 生成腳本做相應(yīng)修改
小結(jié)
安全STM32H7能夠提供片上存儲(chǔ)的安全性安全硬件,助力安全存儲(chǔ):
安全用戶(hù)存儲(chǔ)區(qū)-選項(xiàng)字節(jié)設(shè)置,上電即生效
PCROP保護(hù)-選項(xiàng)字節(jié)設(shè)置,上電即生效
CRYP密鑰寄存器WO
調(diào)試端口連接可控 — 上電缺省不可連接
