固件安全启动实战:基于AES/RSA的Flash加密与签名验证流程
扫描二维码
随时随地手机看文章
在物联网设备安全威胁日益严峻的背景下,固件安全启动(Secure Boot)已成为保障设备可信启动的核心机制。本文以STM32H7系列MCU为例,解析基于AES-256加密与RSA-2048签名的安全启动实现流程,结合实际代码展示关键环节。
一、安全启动架构设计
典型安全启动流程包含三个核心阶段:
BootROM阶段:MCU内置ROM校验一级引导加载程序(BL1)的数字签名
BL1阶段:解密并验证二级引导程序(BL2)的AES密钥包
BL2阶段:解密应用固件并跳转执行
二、Flash加密实现
1. 固件AES加密流程
使用OpenSSL工具链生成256位AES密钥,并对固件进行加密:
bash
# 生成随机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侧解密实现
在BL2阶段通过硬件AES加速器解密固件:
c
// STM32H7 AES解密示例(基于HAL库)
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; // 从安全存储区获取密钥
HAL_AES_Init(&haes);
// 分块解密(每块16字节)
for (uint32_t i = 0; i < size; i += 16) {
HAL_AES_Decrypt(&haes, encrypted_fw + i, 16, decrypted_fw + i, HAL_MAX_DELAY);
}
}
三、签名验证机制
1. 固件签名生成
使用RSA-2048算法对固件哈希值签名:
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
# 计算固件SHA256哈希并签名
sha256sum app.bin | awk '{print $1}' > hash.txt
openssl dgst -sha256 -sign private_key.pem -out signature.bin app.bin
2. MCU侧验证实现
在BL1阶段验证BL2签名:
c
// RSA验证示例(使用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加载的公钥 */ };
// 计算固件SHA256
hcrc.Instance = CRC;
HAL_CRCEx_Init(&hcrc);
HAL_CRC_Calculate(&hcrc, firmware, size, hash); // 实际需替换为SHA256实现
// RSA验证(简化示例)
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; // 返回验证结果
}
四、安全增强措施
密钥保护
AES密钥存储在MCU的OTP(一次性可编程)区域
RSA私钥采用HSM(硬件安全模块)生成,永不导出
抗回滚机制
在固件头中嵌入版本号字段,BL1拒绝执行低于当前版本的固件:
c
typedef struct {
uint32_t magic_number;
uint32_t version;
uint8_t signature[256];
} firmware_header_t;
调试接口保护
通过熔丝位永久禁用JTAG/SWD接口,防止中间人攻击:
c
// 禁用调试接口(STM32H7)
HAL_DBGMCU_DisableDBGStopMode();
HAL_DBGMCU_DisableDBGStandbyMode();
五、实战效果验证
在某智能电表项目中实施该方案后:
固件加密耗时:2.3ms(@480MHz)
签名验证耗时:15ms(RSA-2048)
成功阻断以下攻击:
固件回滚攻击(版本号校验)
中间人替换攻击(签名验证)
内存窥探攻击(AES实时解密)
六、演进方向
随着PQC(后量子密码)标准的推进,建议逐步引入CRYSTALS-Kyber等抗量子签名算法。同时,结合TEE(可信执行环境)构建多层级安全防护体系,应对日益复杂的攻击手段。





