嵌入式系统SD卡存储如何实现连续流式非对称加密
原方案的核心安全缺陷与设计误区
首先先纠正一个最基础的认知错误:不存在对称加密安全性弱于非对称加密的结论。同等安全强度下,对称加密的运算效率是非对称加密的上百倍,资源占用低一个数量级,非对称加密的设计定位从来不是加密大批量流数据,硬要排斥对称加密属于完全搞错了两类算法的适用场景。
你现在设想的方案具体有以下几个致命问题:
- 公私钥使用逻辑完全颠倒:你把私钥存在设备端,公钥公开,一旦攻击者物理拆解设备读出私钥,就能解密所有历史加密文件的密钥,所有数据直接透明。而且公钥是公开的,任何人都能用公钥加密伪造的对称密钥发给设备,设备根本没法判断交互的主机是不是授权的,攻击者甚至可以直接发一个自己掌控的对称密钥骗设备加密,之后拔走SD卡就能直接读所有数据。
- CBC模式完全不匹配流式追加写入需求:CBC模式的每个密文块加密依赖前一个块的计算结果,追加写入时必须严格保存最后一个块的IV状态,一旦中途掉电、或者SD卡某一个块被篡改,后续所有数据解密都会直接乱码。更关键的是CBC本身不带完整性校验,攻击者可以对密文做比特翻转篡改内容,设备端完全识别不出来。
- 密钥存储逻辑存在泄漏风险:你设计的是主机生成对称密钥发给设备,这个密钥如果存在设备RAM里还好,要是为了掉电免交互存在内部Flash,攻击者拆片读Flash就能直接拿到密钥。而且整个方案没有密钥轮换机制,一个密钥泄漏所有历史数据全部失守。
- 完全缺失认证与完整性校验环节:整个方案只有加密逻辑,没有对主机身份的认证,也没有对SD卡密文的完整性校验,不管是未授权主机通过串口发恶意指令,还是SD卡被拔走篡改内容,设备端都没有识别能力。
- 性能完全不匹配嵌入式资源:如果硬要用非对称加密逐块加密采集数据,STM32G4这种Cortex-M4内核的MCU做一次2048位RSA加密需要几十毫秒,每秒一次的采集写入场景下会直接占满CPU资源,根本跑不动业务逻辑。
适配STM32G431场景的可落地方案
STM32G431自带硬件AES加速器、硬件真随机数发生器(RNG),128KB Flash、32KB RAM的资源完全可以跑符合工业级安全标准的加密方案,总RAM占用不超过4KB,单次加密写入延迟小于1ms,完全满足1秒1次的采集写入要求,具体实现路径如下:
- 选型上直接放弃“全非对称加密”的不切实际想法,采用标准的混合加密架构:用ECC(椭圆曲线非对称加密)做密钥分发,用AES-GCM(对称认证加密算法)做流式数据加密,这是嵌入式加密存储的通用成熟方案,没有安全短板。
- 修正公私钥的部署逻辑:
- 公私钥对统一在可信授权主机端生成,私钥永久存在主机侧,绝对不下发到设备;设备端只在出厂时烧录ECC公钥,公钥本身是公开信息,就算被攻击者从设备里读走也不会泄漏任何敏感数据。公钥烧录时写到STM32内部Flash的选项字节区域,开启等级2读保护,防止攻击者拆解设备后替换公钥。
- 每次设备上电启动时,用内置硬件RNG生成一个128位的随机AES会话密钥,这个密钥只存在设备RAM中,掉电自动丢失,永远不写入Flash或者SD卡。
- 设备用预置的ECC公钥加密这个随机会话密钥,通过串口输出,只有持有对应私钥的授权主机才能解密拿到会话密钥,后续读取SD卡数据时用这个密钥解密即可。
- 实现流式追加加密逻辑,适配大文件连续写入需求:
- 加密算法选AES-128-GCM,这是标准的AEAD(认证加密)算法,支持增量流式加密,自带完整性和来源校验,STM32的硬件AES外设原生支持GCM模式,不需要额外写复杂的软件逻辑。
- 每次新建加密数据文件时,先在文件头明文写入12字节的随机IV(初始向量,由硬件RNG生成,每个文件的IV必须唯一,禁止重复),不需要加密。
- 每次采集到新数据时,直接送入AES-GCM硬件模块做增量加密,生成的密文直接追加到SD卡文件末尾,不需要修改任何之前写入的内容,完全满足连续写入要求,运行时只需要预留16字节的GCM上下文缓存,几乎不占RAM。
- 为了避免掉电导致大文件校验失效,采用分段校验策略:每写入100条记录(对应100秒采集数据)就生成一个16字节的分段认证标签,存在对应分段的末尾,就算中途掉电,也只需要校验最后一个分段的完整性,之前的数据不受影响;如果某段密文被篡改,也只会影响对应分段的校验结果,不会波及其余数据。
- 补充必要的安全加固:
- 所有随机数必须走硬件RNG生成,绝对不要用软件
rand()类的伪随机函数,避免随机数可预测导致密钥泄漏。 - 串口交互增加验签环节:主机连接设备请求会话密钥时,需要发送用私钥签名的校验帧,设备用预置公钥验签通过后才会输出加密后的会话密钥,防止未授权设备通过串口骗取密钥。
- 不要自己手写任何加密算法原语:AES和RNG直接用STM32 HAL库自带的硬件驱动,ECC算法可以用裁剪后的mbedTLS,只保留secp256r1曲线的公钥验签、加密功能,裁剪后代码量不到20KB,完全放得下128KB的Flash。
- 所有随机数必须走硬件RNG生成,绝对不要用软件
避坑提醒:不要为了追求所谓的“更高安全强度”盲目加长密钥长度,AES-128的安全强度已经高于2048位RSA,足够应对绝大多数敏感数据存储场景,更长的密钥只会徒增资源开销,没有实际收益。
内容的提问来源于stack exchange,提问作者Cypher
相关产品推荐
相关产品推荐

