在 MCU(微控制器单元)或 MPU(微处理器单元)上安全地存储机密数据(如加密密钥、用户凭证、敏感配置信息等)是嵌入式系统安全的核心挑战。由于资源受限、物理可访问性以及潜在的攻击面广泛,需要采用分层防御策略并结合硬件和软件的保护措施。
以下是关键策略和方法:
? 核心原则
- 最小化机密数据: 能不存储就不存储,能动态计算或推导最好。
- 深度分层防御: 结合硬件、软件、密码学和物理防护。
- 密钥管理是关键: 机密数据的核心通常是密钥,密钥的安全决定了数据的安全。
- 攻击面最小化: 减少暴露敏感操作的接口和调试功能。
? 硬件安全机制(首选和最强力)
安全元件/硬件安全模块:
- 专用安全芯片: 使用独立的、通过安全认证的芯片(如 Trusted Platform Module, Smart Card IC, Secure Element - SE)。
- 片上集成安全区域: 许多现代 MCU/MPU 集成硬件安全功能模块(如 Arm TrustZone, NXP PFR, STM32 Trusted Execution Environment, Microchip CryptoAuthentication),称为 HSM, PUF, 安全 enclave 等。
- 功能:
- 安全的密钥存储: 密钥在隔离的安全区域生成、存储和使用,永不暴露于主 CPU 或外部总线。这是存储根密钥的理想场所。
- 硬件加速的加密算法: 高效执行 AES, RSA, ECC, SHA, TRNG 等操作。
- 防篡改检测: 检测物理入侵尝试(如开盖、探针)并擦除密钥。
- 安全的启动和执行: 验证固件完整性和来源真实性。
- 唯一的设备标识: 提供不可克隆的根信任点(通常基于 PUF)。
- 访问控制: 严格控制对内部资源的访问权限。
- 强烈推荐: 这是目前保护最高机密数据(尤其是根密钥)的最可靠方法。
物理不可克隆函数:
- 原理: 利用半导体制造过程的微小、不可控的物理差异,生成每个芯片唯一的“数字指纹”。PUF 本身不存储密钥!
- 应用:
- 密钥生成: 在需要时动态生成唯一的设备密钥,无需存储原始熵源。
- 密钥封装/绑定: 用 PUF 响应作为密钥加密密钥来保护存储在非易失性存储器中的密钥(需要纠错机制)。
- 优点: 抵抗物理探测(密钥不静态存储),抵抗反向工程(响应依赖于物理特性)。
存储器保护单元:
- 功能: 控制 CPU 对不同内存区域的访问权限(读/写/执行)。
- 应用: 隔离存放敏感数据的内存区域(如栈、堆、全局变量区),防止越界访问或未授权代码读取。
闪存/EEPROM 保护:
- 读保护: 设置后,阻止通过调试接口读取芯片内部存储内容(如 SWD/JTAG)。
- 写保护: 保护特定扇区或区域的闪存/EEPROM 不被意外或恶意修改。
- 芯片唯一 ID: 一些 MCU 提供不可更改的、唯一的芯片 ID,可用于设备绑定或派生密钥。
- 局限性: 只能防护较弱的攻击,无法防止物理读出(如芯片解封装+探针)或侧信道攻击。
? 软件安全策略(结合硬件)
安全的密钥派生:
- 使用标准 KDF: 如 PBKDF2, HKDF, Argon2。避免直接使用用户密码或弱熵源作为密钥。
- 结合硬件特性: 使用芯片唯一 ID 或 PUF 响应作为 KDF 的盐或输入的一部分,将派生密钥绑定到特定设备?️。
安全的密钥使用:
- 最小化密钥暴露: 密钥只在需要使用它们的短暂时间内解密到 RAM 中,用后尽快清零覆盖。
- 限制密钥用途: 不同的密钥用于不同的目的(加密、签名、认证、派生)。
- 使用硬件加速: 优先使用硬件引擎执行加密操作,避免潜在的时序攻击或软件实现漏洞。
机密数据的加密存储:
- 场景: 当必须在外部闪存或共享内存中存储机密数据时。
- 方法: 必须先用一个安全的密钥加密数据!
- 使用硬件 SE/HSM/TEE 加密: 最佳实践。加密操作(和密钥)在安全区域内完成。
- 在主 CPU 加密: 次选方案。密钥需临时解密到 RAM(风险更高)。
- 加密模式:
- 认证加密: 首选 AES-GCM 或 ChaCha20-Poly1305,提供机密性和完整性校验。
- 存储效率: 如果空间紧张且已有完整性机制(如安全启动),可考虑 AES-CTR 或 CBC(搭配 HMAC)。
- 密钥来源: 用于加密存储数据的密钥(KEK)应该来自硬件安全机制(SE/HSM/PUF),或者是用硬件保护的根密钥派生出来的。
安全的擦除:
- 立即覆盖: 当敏感数据(尤其是临时解密到 RAM 中的密钥)不再需要时,立即用随机值或固定模式多次覆盖其所在的 RAM 区域(避免编译器优化清除)。尽量使用
memset_s 或类似的安全函数。
- 非易失性存储器擦除: 确保被删除或更新的敏感数据在存储介质上也被安全擦除(实际覆盖)。
安全启动和固件更新:
- 验证签名: 确保加载执行的固件是可信的来源且未被篡改。根公钥或哈希通常需要硬件保护。
- 回滚保护: 防止攻击者利用旧版本固件的漏洞。
运行时保护:
- 栈保护: 启用栈溢出保护机制(如 Stack Canaries)。
- 地址空间布局随机化: 增加攻击者利用内存破坏漏洞的难度。
- 特权分离: 利用 MPU 限制用户模式和特权模式对内存和资源的访问。
- 看门狗: 检测和响应软件故障(可能是攻击导致)。
- 减少调试接口暴露: 生产环境中禁用或严格保护调试接口。
? 存储位置选择权衡
- 专用硬件安全模块: 安全性最高,适合根密钥和最敏感数据。容量通常较小。
- 片上安全区域: 安全性高,集成方便。容量可能受限。
- 片上闪存/EEPROM: 配合读保护、写保护和加密存储。安全性中等。
- 外部闪存/EEPROM: 安全性最低,必须配合强加密(密钥来自安全硬件)和完整性保护。
? 关键建议总结
- 优先利用硬件安全特性: 绝对不要试图在普通 Flash/RAM 中明文存储根密钥或高度敏感数据。 投资集成安全硬件(SE/HSM/PUF)的芯片是值得的。
- 分层加密: 使用安全硬件保护的根密钥或设备唯一密钥,来加密保护存储在相对不安全区域的次级密钥或数据。
- 最小化暴露: 仅在必要时、在最短时间内、在受控环境下(如安全隔离的内存区域)让密钥以明文形式存在。
- 安全生命周期管理: 考虑密钥和设备生命周期的各个方面(生成、存储、使用、轮换、撤销、销毁)。
- 遵循标准和最佳实践: 使用公认安全的加密算法、协议和库(如 Mbed TLS, WolfSSL, 硬件加速库)。
- 物理安全: 评估设备部署环境。如果物理访问难以控制,更强的硬件保护(如防篡改 SE)更加关键。
- 威胁建模: 明确你的资产(哪些数据是机密?)、可能的攻击者及其能力(远程 vs 物理访问?预算?)、攻击路径。据此选择合适的安全措施。
- 渗透测试和安全审计: 由专业安全人员对实现进行评估和测试。
安全没有银弹。 在 MCU/MPU 上保护机密数据需要仔细权衡安全需求、成本、功耗、资源和开发复杂性。利用芯片内置的硬件安全特性是最可靠的基础,再辅以严谨的软件安全实践,才能构建起有效的防御体系。 永远假设攻击者比你想象的更聪明更有耐心。
在 MCU(微控制器单元)或 MPU(微处理器单元)上安全地存储机密数据(如加密密钥、用户凭证、敏感配置信息等)是嵌入式系统安全的核心挑战。由于资源受限、物理可访问性以及潜在的攻击面广泛,需要采用分层防御策略并结合硬件和软件的保护措施。
以下是关键策略和方法:
? 核心原则
- 最小化机密数据: 能不存储就不存储,能动态计算或推导最好。
- 深度分层防御: 结合硬件、软件、密码学和物理防护。
- 密钥管理是关键: 机密数据的核心通常是密钥,密钥的安全决定了数据的安全。
- 攻击面最小化: 减少暴露敏感操作的接口和调试功能。
? 硬件安全机制(首选和最强力)
安全元件/硬件安全模块:
- 专用安全芯片: 使用独立的、通过安全认证的芯片(如 Trusted Platform Module, Smart Card IC, Secure Element - SE)。
- 片上集成安全区域: 许多现代 MCU/MPU 集成硬件安全功能模块(如 Arm TrustZone, NXP PFR, STM32 Trusted Execution Environment, Microchip CryptoAuthentication),称为 HSM, PUF, 安全 enclave 等。
- 功能:
- 安全的密钥存储: 密钥在隔离的安全区域生成、存储和使用,永不暴露于主 CPU 或外部总线。这是存储根密钥的理想场所。
- 硬件加速的加密算法: 高效执行 AES, RSA, ECC, SHA, TRNG 等操作。
- 防篡改检测: 检测物理入侵尝试(如开盖、探针)并擦除密钥。
- 安全的启动和执行: 验证固件完整性和来源真实性。
- 唯一的设备标识: 提供不可克隆的根信任点(通常基于 PUF)。
- 访问控制: 严格控制对内部资源的访问权限。
- 强烈推荐: 这是目前保护最高机密数据(尤其是根密钥)的最可靠方法。
物理不可克隆函数:
- 原理: 利用半导体制造过程的微小、不可控的物理差异,生成每个芯片唯一的“数字指纹”。PUF 本身不存储密钥!
- 应用:
- 密钥生成: 在需要时动态生成唯一的设备密钥,无需存储原始熵源。
- 密钥封装/绑定: 用 PUF 响应作为密钥加密密钥来保护存储在非易失性存储器中的密钥(需要纠错机制)。
- 优点: 抵抗物理探测(密钥不静态存储),抵抗反向工程(响应依赖于物理特性)。
存储器保护单元:
- 功能: 控制 CPU 对不同内存区域的访问权限(读/写/执行)。
- 应用: 隔离存放敏感数据的内存区域(如栈、堆、全局变量区),防止越界访问或未授权代码读取。
闪存/EEPROM 保护:
- 读保护: 设置后,阻止通过调试接口读取芯片内部存储内容(如 SWD/JTAG)。
- 写保护: 保护特定扇区或区域的闪存/EEPROM 不被意外或恶意修改。
- 芯片唯一 ID: 一些 MCU 提供不可更改的、唯一的芯片 ID,可用于设备绑定或派生密钥。
- 局限性: 只能防护较弱的攻击,无法防止物理读出(如芯片解封装+探针)或侧信道攻击。
? 软件安全策略(结合硬件)
安全的密钥派生:
- 使用标准 KDF: 如 PBKDF2, HKDF, Argon2。避免直接使用用户密码或弱熵源作为密钥。
- 结合硬件特性: 使用芯片唯一 ID 或 PUF 响应作为 KDF 的盐或输入的一部分,将派生密钥绑定到特定设备?️。
安全的密钥使用:
- 最小化密钥暴露: 密钥只在需要使用它们的短暂时间内解密到 RAM 中,用后尽快清零覆盖。
- 限制密钥用途: 不同的密钥用于不同的目的(加密、签名、认证、派生)。
- 使用硬件加速: 优先使用硬件引擎执行加密操作,避免潜在的时序攻击或软件实现漏洞。
机密数据的加密存储:
- 场景: 当必须在外部闪存或共享内存中存储机密数据时。
- 方法: 必须先用一个安全的密钥加密数据!
- 使用硬件 SE/HSM/TEE 加密: 最佳实践。加密操作(和密钥)在安全区域内完成。
- 在主 CPU 加密: 次选方案。密钥需临时解密到 RAM(风险更高)。
- 加密模式:
- 认证加密: 首选 AES-GCM 或 ChaCha20-Poly1305,提供机密性和完整性校验。
- 存储效率: 如果空间紧张且已有完整性机制(如安全启动),可考虑 AES-CTR 或 CBC(搭配 HMAC)。
- 密钥来源: 用于加密存储数据的密钥(KEK)应该来自硬件安全机制(SE/HSM/PUF),或者是用硬件保护的根密钥派生出来的。
安全的擦除:
- 立即覆盖: 当敏感数据(尤其是临时解密到 RAM 中的密钥)不再需要时,立即用随机值或固定模式多次覆盖其所在的 RAM 区域(避免编译器优化清除)。尽量使用
memset_s 或类似的安全函数。
- 非易失性存储器擦除: 确保被删除或更新的敏感数据在存储介质上也被安全擦除(实际覆盖)。
安全启动和固件更新:
- 验证签名: 确保加载执行的固件是可信的来源且未被篡改。根公钥或哈希通常需要硬件保护。
- 回滚保护: 防止攻击者利用旧版本固件的漏洞。
运行时保护:
- 栈保护: 启用栈溢出保护机制(如 Stack Canaries)。
- 地址空间布局随机化: 增加攻击者利用内存破坏漏洞的难度。
- 特权分离: 利用 MPU 限制用户模式和特权模式对内存和资源的访问。
- 看门狗: 检测和响应软件故障(可能是攻击导致)。
- 减少调试接口暴露: 生产环境中禁用或严格保护调试接口。
? 存储位置选择权衡
- 专用硬件安全模块: 安全性最高,适合根密钥和最敏感数据。容量通常较小。
- 片上安全区域: 安全性高,集成方便。容量可能受限。
- 片上闪存/EEPROM: 配合读保护、写保护和加密存储。安全性中等。
- 外部闪存/EEPROM: 安全性最低,必须配合强加密(密钥来自安全硬件)和完整性保护。
? 关键建议总结
- 优先利用硬件安全特性: 绝对不要试图在普通 Flash/RAM 中明文存储根密钥或高度敏感数据。 投资集成安全硬件(SE/HSM/PUF)的芯片是值得的。
- 分层加密: 使用安全硬件保护的根密钥或设备唯一密钥,来加密保护存储在相对不安全区域的次级密钥或数据。
- 最小化暴露: 仅在必要时、在最短时间内、在受控环境下(如安全隔离的内存区域)让密钥以明文形式存在。
- 安全生命周期管理: 考虑密钥和设备生命周期的各个方面(生成、存储、使用、轮换、撤销、销毁)。
- 遵循标准和最佳实践: 使用公认安全的加密算法、协议和库(如 Mbed TLS, WolfSSL, 硬件加速库)。
- 物理安全: 评估设备部署环境。如果物理访问难以控制,更强的硬件保护(如防篡改 SE)更加关键。
- 威胁建模: 明确你的资产(哪些数据是机密?)、可能的攻击者及其能力(远程 vs 物理访问?预算?)、攻击路径。据此选择合适的安全措施。
- 渗透测试和安全审计: 由专业安全人员对实现进行评估和测试。
安全没有银弹。 在 MCU/MPU 上保护机密数据需要仔细权衡安全需求、成本、功耗、资源和开发复杂性。利用芯片内置的硬件安全特性是最可靠的基础,再辅以严谨的软件安全实践,才能构建起有效的防御体系。 永远假设攻击者比你想象的更聪明更有耐心。
举报