《固件安全基线自查清单课程》
第3章 固件存储安全基线

3. 固件存储安全基线:加密存储、密钥管理、安全启动(Secure Boot)原理

固件存储安全是设备安全的第一道防线。本基线从加密存储、密钥管理和安全启动三个核心维度出发,确保固件在静态存储、动态加载及运行时的完整性与机密性。以下内容将结合原理讲解、检查清单与可视化图表,帮助您系统化地建立固件存储安全基线。

3.1 加密存储:保护固件静态数据

📌 核心要求

  • 算法标准:必须使用经过认证的对称加密算法(如 AES-256-GCM)对固件镜像进行加密。
  • 存储分区:固件存储区(如 SPI Flash)应启用硬件加密引擎或软件加密层,防止物理读取。
  • 密钥分离:加密密钥不得与固件存储在同一个物理介质中,必须使用独立的安全元件或 eFuse。
  • 完整性校验:加密后的固件需附带 HMAC 或 GCM 认证标签,防止篡改。
📋 加密存储检查清单
检查项 要求 验证方法
加密算法强度 AES-256 或更高级别 查看固件构建配置
加密模式 GCM / CCM(带认证) 代码审计
密钥存储位置 HSM / TPM / eFuse 硬件安全模块检测
固件分区加密 100% 加密(除引导区外) 固件镜像分析
🔐 固件加密存储流程 原始固件 AES-256-GCM 加密引擎 加密固件 🔑 密钥输入 SPI Flash 密钥必须独立存储于 HSM/TPM,与固件物理隔离

3.2 密钥管理:安全生命周期

📌 核心要求

  • 密钥生成:必须在硬件安全模块(HSM)或安全芯片内部生成,禁止软件生成。
  • 密钥存储:私钥/对称密钥必须存储在防篡改硬件中(如 TPM、eFuse、OTP)。
  • 密钥使用:密钥仅在安全边界内使用,固件运行时无法直接读取明文密钥。
  • 密钥销毁:设备退役时,必须支持安全擦除或物理销毁密钥存储区。
📋 密钥管理检查清单
检查项 要求 验证方法
密钥生成环境 HSM 或安全芯片内部 生产流程审计
密钥存储介质 TPM / eFuse / OTP 硬件设计审查
密钥访问控制 仅授权安全组件可调用 权限配置检查
密钥备份与恢复 加密备份,严格管控 备份策略文档
🔑 密钥生命周期管理 1. 生成 HSM 内部生成 2. 存储 TPM / eFuse 3. 使用 安全边界内调用 4. 销毁 安全擦除 密钥生命周期闭环管理,任何环节不可绕过硬件安全边界 🔒 硬件安全模块(HSM)全程保护

3.3 安全启动(Secure Boot)原理

📌 核心要求

  • 信任链:从 BootROM 开始,逐级验证每一阶段固件的数字签名,形成不可中断的信任链。
  • 公钥固化:根公钥必须烧录在一次性可编程(OTP)存储器中,不可更改。
  • 防回滚:必须实现版本号检查机制,防止攻击者加载旧版本固件(降级攻击)。
  • 失败策略:签名验证失败时,必须进入安全恢复模式或停止启动,不得执行未经验证的代码。
📋 安全启动检查清单
检查项 要求 验证方法
信任链完整性 BootROM → Bootloader → OS 启动日志分析
根公钥存储 OTP / eFuse 硬件设计审查
签名算法 RSA-4096 或 ECDSA P-384 固件签名工具配置
防回滚机制 版本号计数器 固件更新测试
验证失败处理 停止启动 / 进入恢复模式 故障注入测试
🔐 安全启动信任链(Chain of Trust) BootROM 硬件固化,不可更改 ✅ 验证 Bootloader 签名 Bootloader 加载并验证 OS ✅ 验证 OS 内核签名 OS Kernel 加载系统服务 ✅ 验证应用签名 信任链:每一级在启动下一级之前,必须验证其数字签名 根信任锚点:OTP 中固化的根公钥 🔒 任何环节签名验证失败 → 立即停止启动 ⚠️ 防回滚:版本号计数器确保固件只能升级,不能降级

3.4 综合实践建议

📌 实施要点

  1. 加密存储 + 安全启动联动:加密存储保护静态数据,安全启动保护动态加载过程,两者缺一不可。
  2. 密钥分级:使用设备唯一密钥(Device Unique Key)加密固件,使用根密钥签名固件,实现职责分离。
  3. 硬件加速:优先使用芯片内置的硬件加密引擎和安全启动模块,避免软件实现带来的侧信道风险。
  4. 持续监控:在固件运行时定期校验关键分区的完整性,防止运行时篡改。

💻 安全启动验证伪代码示例

// 安全启动验证流程(伪代码)
function secure_boot():
    root_public_key = read_otp(ROOT_KEY_ADDR)  // 从 OTP 读取根公钥
    
    // 阶段1:验证 Bootloader
    bootloader_sig = read_flash(BOOTLOADER_SIG_ADDR)
    bootloader_hash = hash(read_flash(BOOTLOADER_ADDR))
    if !verify_signature(root_public_key, bootloader_hash, bootloader_sig):
        halt("Bootloader 签名验证失败!")
    
    // 阶段2:验证 OS Kernel
    os_sig = read_flash(OS_SIG_ADDR)
    os_hash = hash(read_flash(OS_ADDR))
    bootloader_public_key = extract_public_key(bootloader)
    if !verify_signature(bootloader_public_key, os_hash, os_sig):
        halt("OS 内核签名验证失败!")
    
    // 阶段3:检查版本号(防回滚)
    current_version = read_flash(VERSION_ADDR)
    if current_version < stored_version:
        halt("固件版本回滚检测!")
    
    start_os()  // 启动操作系统