4、密钥生命周期管理:密钥生成、密钥分发、密钥使用、密钥销毁。
密钥这东西,说白了就是产线的命根子。你设计再好的安全芯片,密钥管理一塌糊涂,那全是白搭。我见过不少团队,算法选得挺牛,硬件防护也到位,结果密钥在生命周期里某个环节漏了,整个项目直接废掉。
密钥生命周期,我习惯把它拆成四个阶段:生成、分发、使用、销毁。每个阶段都有坑,咱们一个一个说。
核心原则:密钥在任何阶段,都不能以明文形式出现在非安全环境中。这是底线。
4.1 密钥生成:源头必须真随机
密钥生成是第一步,也是最容易被忽视的一步。很多人觉得,随便找个随机数库生成一串比特就行了。嗯,这里要注意——伪随机数生成器(PRNG)在产线环境下是极度危险的。
我曾经在一个客户现场排查问题,发现他们用C标准库的 rand() 来生成AES密钥。结果呢?种子是时间戳,攻击者只要知道设备的大概生产时间,密钥空间直接缩到几万种。这跟没加密有什么区别?
正确的做法,必须使用硬件真随机数发生器(TRNG)。如果芯片内部没有TRNG,那就得外挂一个符合AIS-31或NIST SP 800-90B标准的真随机数模块。
| 随机数类型 | 熵源 | 产线适用性 | 风险等级 |
|---|---|---|---|
| 真随机数(TRNG) | 物理噪声、量子效应 | 高 | 低 |
| 伪随机数(PRNG) | 软件算法+种子 | 低(需额外熵源) | 高 |
| 混合模式 | TRNG种子+PRNG扩展 | 中 | 中 |
我的习惯:在产线工控机上,我会单独部署一个硬件安全模块(HSM),专门负责密钥生成。HSM内部自带TRNG,生成的密钥直接加密存储,连工控机的操作系统都碰不到明文。
4.2 密钥分发:传输过程必须加密
密钥生成好了,怎么送到产线设备里去?这是整个流程里最容易出事的环节。你想想看,密钥在网络上裸奔,跟把保险柜钥匙贴在门上有什么区别?
我建议采用两级密钥体系:
- 传输密钥(KEK):预置在产线设备和服务器中,用于加密工作密钥。
- 工作密钥(WK):实际用于加解密业务的密钥,由KEK加密后传输。
具体流程是这样的:
- 服务器用设备的公钥(或预共享的KEK)加密工作密钥。
- 密文通过网络下发到产线设备。
- 设备在安全环境中用私钥(或KEK)解密,得到工作密钥。
- 工作密钥直接写入安全存储区,不落盘、不打印日志。
我曾经踩过的坑:有次产线升级,工程师为了方便调试,把密钥分发的日志级别调成了DEBUG。结果所有下发的密钥密文和部分明文都写进了日志文件。等我们发现时,已经有三天的日志被上传到了公司的公共FTP服务器上……那次事故直接导致整批次5000台设备需要返厂更换密钥。
4.3 密钥使用:最小权限原则
密钥到了设备里,怎么用?很多人觉得,存进Flash就完事了。不对,这只是开始。
密钥在使用阶段,必须遵守最小权限原则:
- 每个密钥只用于一种用途。签名密钥不能用来解密,加密密钥不能用来认证。
- 密钥在CPU内部使用时,必须通过硬件隔离区(如TrustZone、TEE)访问。
- 应用层代码不能直接拿到密钥明文,只能调用硬件接口完成加解密操作。
我举个例子。假设你的设备需要做OTA固件签名验证:
// 错误做法:应用层直接读取密钥
uint8_t key[32];
read_key_from_flash(key); // 密钥明文暴露在内存中
verify_signature(data, sig, key);
// 正确做法:调用硬件安全单元
hsm_context_t ctx;
hsm_open(&ctx, KEY_ID_OTA_SIGN);
hsm_verify(&ctx, data, sig); // 密钥不出安全区
hsm_close(&ctx);
你看,第二种做法,应用层从头到尾都没碰过密钥明文。即使应用被攻破,攻击者也拿不到密钥。
关键指标:密钥使用阶段,要确保密钥明文在CPU通用寄存器或DDR内存中的暴露时间为零。所有操作必须在安全硬件内部完成。
4.4 密钥销毁:不留痕迹
密钥到期了、设备报废了、或者密钥被疑似泄露了——怎么办?销毁。
但销毁不是简单地删个文件。Flash存储器的特性决定了,你删除文件后,数据可能还在物理介质上。专业的攻击者可以用探针直接读Flash晶圆上的电荷状态。
正确的销毁方式分几个等级:
| 销毁等级 | 方法 | 适用场景 | 残余风险 |
|---|---|---|---|
| 逻辑销毁 | 覆写全0/全1/随机数多次 | 软件更新、密钥轮换 | 中(对Flash可能有残留) |
| 物理销毁 | 熔断保险丝、高压击穿存储单元 | 设备报废、RMA退回 | 低 |
| 化学/机械销毁 | 研磨芯片、酸蚀晶圆 | 最高安全等级场景 | 极低 |
特别提醒:产线中经常出现一种情况——设备测试失败,需要退回重做。这时候如果密钥已经写入了安全存储区,必须执行物理销毁级别的操作。我见过有工厂图省事,只做了逻辑销毁就退回给供应商,结果被逆向出密钥,影响了整个产品线的安全。
我个人习惯,在产线流程中增加一个密钥销毁确认点:每次销毁操作后,必须回读存储区,确认数据已不可恢复。这个步骤不能省略。
这四个阶段环环相扣,缺一不可。你想想看,哪怕你生成再强的密钥,分发时被人截获了,或者销毁时没清干净,那前面所有工作都白费。我这些年做产线安全审计,发现90%的问题都出在生命周期管理上,而不是算法本身。
一个小建议:在产线SOP里,把密钥生命周期管理单独列为一个检查项。每次产线变更、设备换型、软件升级,都要重新过一遍这四个阶段。别嫌麻烦,安全这东西,省一步就是给自己埋雷。