2、存储器基础:存储器层次结构、类型(RAM、ROM、Flash、EEPROM、NVM)及其安全特性
存储器是硬件系统的核心资产载体,无论是代码、密钥、用户数据还是运行状态,最终都以电荷、磁畴或电子陷阱的形式驻留在某种存储介质中。理解存储器的层次结构、工艺类型及其安全边界,是设计安全存储与加密存储方案的前提。本章从计算机体系结构中的存储层次出发,逐一剖析各类存储器的物理原理、访问特性与安全弱点,并给出选型与防护建议。
上图从宏观视角展示了存储层次与安全维度的对应关系。寄存器与Cache位于CPU核心,速度最快但容量极小且易失;SRAM/DRAM构成主存,承担运行时数据承载;Flash与EEPROM是非易失存储的主力,用于固件与配置;新型NVM则试图在速度、功耗与持久性之间取得平衡。每一层都有其独特的安全弱点,需要针对性地设计防护措施。
2.1 核心原理:存储层次与安全边界
存储层次的设计初衷是解决“速度-容量-成本”三角矛盾。CPU寄存器以皮秒级访问时间运行,但整个芯片上的寄存器总量通常不超过几KB;Cache(SRAM)将常用数据缓存到CPU附近,容量在几十KB到几十MB之间;主存(DRAM)提供GB级容量,但访问延迟在数十纳秒量级;而Flash/磁盘则提供TB级持久存储,但延迟达到微秒甚至毫秒级。安全设计必须尊重这一物理现实:越靠近CPU的存储越容易被直接访问,但数据生命周期越短;越远离CPU的存储越持久,但暴露在总线攻击和物理攻击下的风险也越高。
从安全角度看,存储层次可以划分为三个信任域:可信域(CPU内部寄存器、安全协处理器的专用SRAM)、半可信域(主存DRAM,受操作系统和MMU保护但易受冷启动攻击)、非可信域(外部Flash/EEPROM/磁盘,物理可接触且接口可嗅探)。密钥材料应尽量驻留在可信域中,即使必须持久化存储,也应使用硬件加密引擎封装后再写入非可信域。
| 存储层级 | 典型容量 | 访问延迟 | 易失性 | 主要安全风险 |
|---|---|---|---|---|
| 寄存器 | 几十B ~ KB | <1ns | 易失 | 上下文切换泄漏、调试接口 |
| Cache (SRAM) | 32KB ~ 64MB | 1~10ns | 易失 | Cache侧信道攻击(Spectre/Meltdown) |
| 主存 (DRAM) | 1GB ~ 512GB | 50~100ns | 易失 | 冷启动攻击、DMA攻击、Rowhammer |
| NOR Flash | 1MB ~ 512MB | 读80ns / 写ms | 非易失 | 物理提取、固件逆向、越权擦写 |
| NAND Flash | 512MB ~ 2TB | 读50us / 写ms | 非易失 | 坏块管理漏洞、数据残留、磨损攻击 |
| EEPROM | 1KB ~ 1MB | 读ns / 写ms | 非易失 | 字节级篡改、寿命耗尽 |
| 新型NVM | 1MB ~ 1GB | 读10ns / 写us | 非易失 | 工艺不成熟、侧信道特性未知 |
安全边界的设计原则是:最小化密钥暴露时间——密钥只在需要运算的瞬间出现在CPU寄存器或安全SRAM中,其余时间以加密形态存储;隔离敏感数据——通过MPU(内存保护单元)或TrustZone技术划分安全区域,阻止非安全代码访问;物理防护——对存储芯片或封装走线增加屏蔽层,防止探针攻击。
2.2 判断方法:根据安全需求选择存储类型
在实际项目中,选择哪种存储器并非单纯看容量和速度,而必须结合安全需求进行权衡。以下是判断流程:
- 明确数据安全等级:将数据分为公开数据(固件非敏感部分)、敏感数据(用户密钥、证书)、关键安全数据(安全启动根密钥、OTP配置)。
- 确定持久性要求:运行时数据用SRAM/DRAM;断电需保留的用Flash/EEPROM/NVM;需要永久不可变的安全锚点用OTP(一次性可编程)或eFuse。
- 评估擦写频率:频繁更新的日志或计数器应选NAND(擦写次数10万~100万次)或FeRAM(高达10^12次);低频配置用EEPROM(100万次);固件镜像用NOR Flash(10万次)。
- 分析攻击面:如果设备物理可接触(如USB设备、IoT传感器),必须假设攻击者可以拆解芯片进行总线监听或探针攻击,此时应选择内置加密引擎的存储或使用外部加密桥接芯片。
- 考虑温度与辐射环境:汽车电子、航天设备需选择宽温级存储,MRAM和FeRAM在抗辐射方面优于Flash。
2.3 案例拆解:智能门锁的密钥存储设计
某智能门锁产品需要存储:① 蓝牙配对密钥(每次配对更新);② 管理员口令哈希(极少更新);③ 固件签名公钥(出厂固定);④ 开锁日志(频繁追加)。设计约束:主控MCU为Cortex-M33(支持TrustZone),板载4MB NOR Flash和64KB EEPROM,无外部安全芯片。
初始方案与问题:工程师最初将所有数据直接存入NOR Flash,使用软件加密库对密钥进行AES加密。测试中发现两个问题:第一,NOR Flash擦写次数仅10万次,开锁日志每天写入约50次,两年即耗尽寿命;第二,通过调试接口(SWD)可以读取Flash内容,虽然密钥已加密,但攻击者通过差分功耗分析(DPA)在MCU执行AES时提取了密钥。
改进方案:
- 将固件签名公钥写入OTP区域(MCU内置eFuse),出厂后不可修改,确保固件完整性验证的根信任。
- 管理员口令哈希存入EEPROM(支持100万次擦写),并使用MCU的TrustZone保护该地址区域,禁止非安全代码访问。
- 蓝牙配对密钥使用MCU内置的硬件加密引擎(AES-128)加密后存入NOR Flash,密钥本身由设备唯一密钥(Device Unique Key, DUK)加密,DUK存储在OTP中且永不出芯片。
- 开锁日志改用环形缓冲区写入NOR Flash,并启用磨损均衡算法,将擦写寿命延长至5年以上。
- 关闭SWD调试接口(烧写后熔断),防止调试探针直接读取存储内容。
结果对比:改进后,攻击者即使物理拆下NOR Flash芯片,也只能获得密文日志和加密后的配对密钥,无法直接获取明文数据。通过DPA攻击硬件加密引擎的难度远高于攻击软件AES实现,因为硬件引擎的功耗曲线更均匀且内置了掩码防护。该方案在成本几乎不变的情况下,将安全等级从“可被中等技能攻击者攻破”提升至“需要专业实验室设备才能尝试攻击”。
2.4 常见误区与总结复盘
误区一:认为Flash存储天然安全。实际上,Flash芯片的读接口(如SPI)是明文暴露的,任何能接触电路板的人都可以用逻辑分析仪嗅探通信内容。即使数据加密存储,攻击者也可以实施“重放攻击”——记录一段合法的加密数据,在特定时机重新发送,绕过认证逻辑。
误区二:忽视数据残留。SRAM和DRAM在掉电后数据不会立即消失,尤其在低温环境下可保留数分钟甚至数小时。攻击者通过“冷启动攻击”可以读取内存中的密钥。对策包括:在系统关机时主动清零敏感内存区域,或使用支持“安全擦除”的存储控制器。
误区三:混淆NOR和NAND的安全特性。NOR Flash支持随机字节读取,适合代码执行,但写入前必须擦除整个块;NAND Flash以页为单位读写,块擦除,且存在坏块。如果安全日志存储在NAND中,必须实现坏块管理和ECC校验,否则数据可能静默损坏。而NOR Flash虽然可靠性更高,但容量小、成本高,不适合大容量日志存储。
误区四:忽略存储控制器的安全功能。现代存储芯片(特别是eMMC、UFS)内置控制器,支持硬件加密、安全擦除、回放保护(Replay Protected Memory Block, RPMB)。但很多开发者只使用其基本读写功能,未启用这些安全特性。例如,eMMC的RPMB分区可以提供防重放的安全存储,非常适合保存计数器或密钥版本号。
总结复盘:存储器安全设计应遵循“分层防护、最小暴露、物理假设”三大原则。分层防护意味着密钥、数据、日志分别存储在不同介质和不同保护域中;最小暴露意味着敏感数据在总线上的明文时间越短越好;物理假设意味着必须假设攻击者可以物理接触设备,因此加密和完整性校验是底线要求。在实际项目中,建议绘制一张“存储-数据-安全机制”映射表,明确每类数据的存储介质、加密方式、访问控制策略和擦除策略,作为设计评审的检查清单。
- □ 根密钥是否存储在OTP/eFuse中?
- □ 敏感数据在总线上是否以密文传输?
- □ 是否启用了存储控制器的安全功能(如RPMB、硬件加密)?
- □ 是否实现了磨损均衡和坏块管理?
- □ 调试接口(JTAG/SWD)是否在生产后禁用?
- □ 是否定义了安全擦除流程(包括密钥清零和日志清除)?
- □ 是否评估过冷启动攻击和DPA攻击的风险?