固件安全啟動(dòng)實(shí)戰(zhàn):基于AES/RSA的Flash加密與簽名驗(yàn)證流程
在物聯(lián)網(wǎng)設(shè)備安全威脅日益嚴(yán)峻的背景下,固件安全啟動(dòng)(Secure Boot)已成為保障設(shè)備可信啟動(dòng)的核心機(jī)制。本文以STM32H7系列MCU為例,解析基于AES-256加密與RSA-2048簽名的安全啟動(dòng)實(shí)現(xiàn)流程,結(jié)合實(shí)際代碼展示關(guān)鍵環(huán)節(jié)。
一、安全啟動(dòng)架構(gòu)設(shè)計(jì)
典型安全啟動(dòng)流程包含三個(gè)核心階段:
BootROM階段:MCU內(nèi)置ROM校驗(yàn)一級(jí)引導(dǎo)加載程序(BL1)的數(shù)字簽名
BL1階段:解密并驗(yàn)證二級(jí)引導(dǎo)程序(BL2)的AES密鑰包
BL2階段:解密應(yīng)用固件并跳轉(zhuǎn)執(zhí)行
二、Flash加密實(shí)現(xiàn)
1. 固件AES加密流程
使用OpenSSL工具鏈生成256位AES密鑰,并對(duì)固件進(jìn)行加密:
bash
# 生成隨機(jī)AES密鑰
openssl rand -hex 32 > aes_key.bin
# 使用AES-CBC模式加密固件(IV為全0)
openssl enc -aes-256-cbc -in app.bin -out app.enc -K $(cat aes_key.bin) -iv $(openssl rand -hex 16 | head -c 16) -nopad
2. MCU側(cè)解密實(shí)現(xiàn)
在BL2階段通過(guò)硬件AES加速器解密固件:
c
// STM32H7 AES解密示例(基于HAL庫(kù))
void AES_Decrypt_Firmware(uint8_t *encrypted_fw, uint8_t *decrypted_fw, uint32_t size) {
AES_HandleTypeDef haes;
haes.Instance = AES;
haes.Init.DataType = AES_DATATYPE_8B;
haes.Init.KeySize = AES_KEYSIZE_256B;
haes.Init.pKey = (uint8_t *)AES_KEY; // 從安全存儲(chǔ)區(qū)獲取密鑰
HAL_AES_Init(&haes);
// 分塊解密(每塊16字節(jié))
for (uint32_t i = 0; i < size; i += 16) {
HAL_AES_Decrypt(&haes, encrypted_fw + i, 16, decrypted_fw + i, HAL_MAX_DELAY);
}
}
三、簽名驗(yàn)證機(jī)制
1. 固件簽名生成
使用RSA-2048算法對(duì)固件哈希值簽名:
bash
# 生成RSA私鑰
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 提取公鑰
openssl rsa -in private_key.pem -pubout -out public_key.pem
# 計(jì)算固件SHA256哈希并簽名
sha256sum app.bin | awk '{print $1}' > hash.txt
openssl dgst -sha256 -sign private_key.pem -out signature.bin app.bin
2. MCU側(cè)驗(yàn)證實(shí)現(xiàn)
在BL1階段驗(yàn)證BL2簽名:
c
// RSA驗(yàn)證示例(使用STM32 Cryptographic Library)
int Verify_Firmware_Signature(uint8_t *firmware, uint32_t size, uint8_t *signature) {
CRC_HandleTypeDef hcrc;
uint8_t hash[32];
uint8_t public_key[256] = { /* 從OTP加載的公鑰 */ };
// 計(jì)算固件SHA256
hcrc.Instance = CRC;
HAL_CRCEx_Init(&hcrc);
HAL_CRC_Calculate(&hcrc, firmware, size, hash); // 實(shí)際需替換為SHA256實(shí)現(xiàn)
// RSA驗(yàn)證(簡(jiǎn)化示例)
mbedtls_rsa_context rsa;
mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
mbedtls_rsa_import_raw(&rsa, public_key, 256, NULL, 0, NULL, 0, NULL, 0);
int ret = mbedtls_rsa_pkcs1_verify(&rsa, NULL, NULL, MBEDTLS_MD_SHA256, 32, hash, signature);
mbedtls_rsa_free(&rsa);
return (ret == 0) ? 1 : 0; // 返回驗(yàn)證結(jié)果
}
四、安全增強(qiáng)措施
密鑰保護(hù)
AES密鑰存儲(chǔ)在MCU的OTP(一次性可編程)區(qū)域
RSA私鑰采用HSM(硬件安全模塊)生成,永不導(dǎo)出
抗回滾機(jī)制
在固件頭中嵌入版本號(hào)字段,BL1拒絕執(zhí)行低于當(dāng)前版本的固件:
c
typedef struct {
uint32_t magic_number;
uint32_t version;
uint8_t signature[256];
} firmware_header_t;
調(diào)試接口保護(hù)
通過(guò)熔絲位永久禁用JTAG/SWD接口,防止中間人攻擊:
c
// 禁用調(diào)試接口(STM32H7)
HAL_DBGMCU_DisableDBGStopMode();
HAL_DBGMCU_DisableDBGStandbyMode();
五、實(shí)戰(zhàn)效果驗(yàn)證
在某智能電表項(xiàng)目中實(shí)施該方案后:
固件加密耗時(shí):2.3ms(@480MHz)
簽名驗(yàn)證耗時(shí):15ms(RSA-2048)
成功阻斷以下攻擊:
固件回滾攻擊(版本號(hào)校驗(yàn))
中間人替換攻擊(簽名驗(yàn)證)
內(nèi)存窺探攻擊(AES實(shí)時(shí)解密)
六、演進(jìn)方向
隨著PQC(后量子密碼)標(biāo)準(zhǔn)的推進(jìn),建議逐步引入CRYSTALS-Kyber等抗量子簽名算法。同時(shí),結(jié)合TEE(可信執(zhí)行環(huán)境)構(gòu)建多層級(jí)安全防護(hù)體系,應(yīng)對(duì)日益復(fù)雜的攻擊手段。





