基于AES与RSA的MCU固件安全启动实现方案
在物联网设备面临日益增加的安全威胁背景下,固件安全启动已成为确保设备可信运行的关键机制。本文以STM32H7系列微控制器为例,详细介绍基于AES-256加密和RSA-2048数字签名的安全启动流程,并通过代码示例展示关键实现步骤。
一、安全启动架构分析
标准的安全启动流程通常包含三个主要阶段:
- BootROM阶段:MCU内置ROM对一级引导加载程序(BL1)进行数字签名校验。
- BL1阶段:负责解密并验证BL2的AES密钥包。
- BL2阶段:最终解密用户固件并跳转执行。
二、Flash固件加密实现
1. 使用AES算法加密固件
加密过程利用OpenSSL工具链完成,具体步骤如下:
# 生成256位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) -nopad2. MCU侧的固件解密逻辑
在BL2阶段,MCU通过内置的硬件AES加速器实现固件解密,以下是基于STM32 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算法对固件哈希进行签名,步骤如下:
# 生成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.txtopenssl dgst -sha256 -sign private_key.pem -out signature.bin app.bin2. MCU侧签名验证代码实现
BL1阶段负责验证BL2签名,以下是基于STM32加密库的签名验证示例:
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阶段拒绝执行版本号低于当前版本的固件。
- 调试接口禁用:通过熔丝位永久禁用JTAG/SWD接口,防止调试攻击。
// 示例:STM32H7调试接口禁用HAL_DBGMCU_DisableDBGStopMode();HAL_DBGMCU_DisableDBGStandbyMode();五、实际应用效果
在某智能电表项目中部署该方案后,取得了如下成果:
- 固件加密耗时约2.3ms(MCU主频480MHz)。
- RSA签名验证耗时15ms。
- 成功防御以下攻击方式:
- 固件回滚攻击(版本控制机制)。
- 中间人替换攻击(数字签名验证)。
- 内存窥探攻击(固件实时解密)。
六、未来发展方向
随着后量子密码(PQC)标准逐步成熟,建议引入如CRYSTALS-Kyber等抗量子算法,提升长期安全性。同时,结合可信执行环境(TEE)构建多级防御体系,以应对不断进化的攻击手段。