电子电气架构的安全设计这几年被讨论得越来越多,但真正落到工程实现层面,很多团队依然停留在"加个看门狗""做份FMEA报告"的阶段。我前后参与过几个域控制器和整车网络架构的安全方案评审,发现一个共性痛点:大家对"冗余"这个词有天然的好感,觉得双备份就是安全,但真到了量产阶段,冗余带来的成本、功耗、故障定位复杂度往往把收益吃掉大半。而"信任根"这个概念,又常被当成一个安全芯片的选型问题,买颗带HSM的MCU就觉得万事大吉。实际上,从冗余到信任根,中间隔着一整套设计逻辑的转变——冗余解决的是"坏了还能用",信任根解决的是"用的东西没被换过"。这两件事在电子电气架构里是两条不同的安全主线,混为一谈就会做出又贵又不好维护的方案。
这篇内容我想把这条落地逻辑拆开讲清楚:冗余该怎么设计才不浪费,信任根该怎么建立才真正可信,两者在架构层面如何配合,以及在实操中会遇到哪些坑。适合正在做域控制器安全设计、整车网络架构规划、或者准备把功能安全与信息安全方案合并落地的工程师参考。不管你是刚接触这块的新人,还是已经做过几个项目想复盘的老手,应该都能从下面的拆解里找到可以直接抄作业的部分。
1. 先想清楚:冗余和信任根到底在解决什么问题
1.1 冗余的本质是"故障容忍",不是"安全"
很多人一提到安全设计,第一反应就是冗余。双电源、双CAN通道、双MCU、双传感器,能备份的都备份上。这个思路本身没错,但需要先明确冗余解决的是哪一类问题。冗余的核心价值是故障容忍——当某个部件发生随机硬件失效时,系统还能维持功能或者安全降级。它对应的是功能安全里的失效运行或安全状态概念,关注的是"东西坏了怎么办"。
但冗余有个天然局限:它假设所有副本都是"好的"。如果两个通道同时被同一个错误信号污染,或者某个副本在出厂前就被篡改过,冗余不但不解决问题,反而会让错误以"双份确认"的形式被放大。我见过一个案例,某控制器做了双路传感器冗余,结果两路传感器共用同一个供电和同一个参考地,一次共因失效直接把两路一起带走了,冗余形同虚设。这就是典型的"为了冗余而冗余",没有做共因失效分析。
所以冗余设计的第一步不是堆副本,而是识别共因失效路径。供电、时钟、通信总线、物理布局、软件栈,任何共享资源都可能成为共因失效的入口。设计时要问自己:这两个副本之间,有哪些东西是共享的?共享的部分失效了,冗余还有意义吗?把这个问题回答清楚,冗余才有价值。
1.2 信任根的本质是"起点可信",解决的是"被替换"问题
信任根是信息安全里的概念,它回答的问题不是"坏了怎么办",而是"我怎么确定现在运行的这堆东西是我当初认可的那堆东西"。信任根是整个信任链的锚点,它必须满足一个苛刻的条件:它自身的可信不依赖于其他任何东西。通常这个锚点由硬件提供,比如带安全启动能力的芯片、独立的硬件安全模块、或者固化在芯片里的不可篡改密钥。
信任根的价值在于建立一条从硬件到软件的完整信任链。上电时,信任根先验证第一段启动代码,验证通过后再由这段代码验证下一段,逐级往上,直到应用层。任何一级验证失败,系统就拒绝启动或者进入受限模式。这条链的意义在于:即使攻击者拿到了固件更新权限,只要他没有信任根里的密钥,就没法让系统运行被篡改的代码。
这里有个常见的误解:以为买了带安全启动的芯片就有了信任根。实际上芯片只是提供了信任根的载体,真正的信任根是那对密钥和它背后的密钥管理流程。密钥怎么生成、怎么注入、怎么存储、怎么轮换、怎么吊销,这一整套流程才是信任根的实质。芯片选型只是第一步,密钥生命周期管理才是真正花功夫的地方。
1.3 两条主线为什么要合并设计
冗余和信任根看起来是两件事,但在电子电气架构里它们必须合并考虑,原因有三个。第一,冗余的副本本身需要被验证可信,否则你冗余的是一个被篡改的副本,等于把错误备份了两份。第二,信任根的验证过程需要一定的冗余来保证可用性,比如安全启动的度量日志需要可靠存储,验证失败的处理策略需要有多条路径。第三,从成本角度看,分开设计会导致硬件资源重复投入,合并设计可以共享安全芯片、共享存储、共享通信通道的安全机制。
我个人的经验是,在架构规划阶段就把两条主线画在同一张图上:横轴是功能安全主线(冗余、监控、降级),纵轴是信息安全主线(信任根、安全启动、安全通信、访问控制),交叉点就是需要重点设计的地方。这张图能帮你快速发现哪些冗余副本缺乏可信验证,哪些信任链环节缺乏故障容忍。
2. 冗余设计的落地要点:从"堆副本"到"算清楚"
2.1 冗余粒度怎么选:部件级、通道级还是系统级
冗余不是越细越好,也不是越粗越省。粒度选择直接决定了成本、复杂度和实际收益。常见的三个层级是部件级冗余(单个传感器或执行器双备份)、通道级冗余(整条通信或供电通道备份)、系统级冗余(整个控制器或子系统备份)。粒度越细,隔离性越好但集成复杂度越高;粒度越粗,实现简单但资源浪费大。
选择粒度的核心依据是失效影响分析。先做FMEA或者失效树分析,找出单点失效会导致安全目标违背的环节,这些环节才值得上冗余。对于那些失效后只是功能降级、不危及安全的环节,用监控加降级策略就够了,没必要上冗余。我见过一个项目把雨刮电机的控制信号也做了双通道冗余,理由是"安全相关",但实际上雨刮失效并不违背任何安全目标,这就是典型的过度设计。
下面这张表是我在实际项目中常用的粒度选择参考,列出来方便对照:
| 冗余层级 | 适用场景 | 典型成本增量 | 主要风险 |
|---|---|---|---|
| 部件级 | 单点失效直接违背安全目标的传感器/执行器 | 中 | 共因失效难隔离 |
| 通道级 | 通信总线、供电网络等共享资源 | 较高 | 切换逻辑复杂 |
| 系统级 | 高可用要求的关键子系统 | 高 | 资源浪费大、同步难 |
选粒度时还要考虑一个现实约束:诊断覆盖率。冗余的价值很大程度上取决于你能不能检测出副本失效。如果诊断覆盖率上不去,冗余副本坏了你都不知道,那冗余就是摆设。所以粒度选择要和诊断能力匹配,诊断能力弱的环节,宁可粒度粗一点、诊断做扎实。
2.2 共因失效分析:冗余设计里最容易被跳过的一步
共因失效是冗余设计的头号杀手。两个副本因为同一个原因同时失效,冗余瞬间归零。共因失效的来源很广:共享供电、共享时钟、共享散热、共享物理空间(比如同一块板子上相邻布局导致的热耦合或电磁耦合)、共享软件栈(同一个驱动bug同时影响两个通道)、共享开发流程(同一个需求理解错误导致两个副本都错)。
做共因失效分析,我习惯用一个简单的检查清单逐项过:
- 供电是否独立?两个副本是否共用同一路电源或同一个稳压器?
- 时钟是否独立?是否共用晶振或时钟树?
- 通信是否独立?是否共用同一路总线或同一个收发器?
- 物理布局是否隔离?是否在同一芯片、同一板卡、同一壳体内?
- 软件是否独立?是否共用同一份驱动、同一个调度器、同一套配置?
- 开发是否独立?两个副本是否由同一团队用同一套需求文档开发?
任何一项回答"是共享",就要评估这个共享路径失效的概率和影响。对于高影响项,要么做物理隔离,要么增加针对该共享路径的监控。比如供电共享无法避免时,可以加独立的电压监控,一旦供电异常就同时让两个副本进入安全状态,而不是指望冗余继续工作。
注意:共因失效分析不是做一次就完事的,架构变更、器件替换、布局调整后都要重新过一遍。我踩过的坑是早期分析做完了,后期为了降成本把两路供电合并成一路,没人回头更新分析,结果量产前的安全评审才发现冗余已经失效。
2.3 冗余切换逻辑:切换本身可能成为新的失效点
冗余设计里最容易被低估的是切换逻辑。主备切换、故障检测、状态同步,这套逻辑本身就是一个复杂的软件系统,它自己也会失效。我见过切换逻辑里的状态机死锁,导致主通道故障后备用通道迟迟不接管;也见过切换时的数据不一致,备用通道接管后输出了一段错误控制量。
切换逻辑设计有几个原则。第一,故障检测要独立于切换逻辑,不能让切换逻辑自己判断自己该不该切,否则检测和决策耦合在一起,一个bug全盘皆输。第二,切换要有明确的超时和兜底,切换过程卡住时必须有超时机制强制进入安全状态。第三,切换后的状态要可观测,每次切换都要记录原因、时间、切换前后的状态,方便事后分析。第四,切换要避免抖动,故障检测的阈值和去抖时间要经过实测标定,不能拍脑袋定。
状态同步是另一个难点。主备之间要同步哪些状态、同步频率多高、同步通道本身失效了怎么办,这些都要在设计阶段定清楚。同步太频繁会占用带宽和CPU,同步太少会导致切换后状态偏差大。我的经验是只同步安全关键状态,非关键状态切换后重新初始化即可,没必要全量同步。
2.4 冗余的验证:怎么证明它真的有用
冗余设计做完,怎么证明它有效?光靠评审和纸面分析不够,必须做故障注入测试。故障注入的方式包括硬件注入(拔线、短接、注入错误电压)、软件注入(强制置位故障标志、模拟通信超时)、以及仿真注入(在HIL台架上模拟传感器失效)。
验证时要覆盖三类场景:单点失效(一个副本坏了,冗余是否接管)、共因失效(共享资源坏了,系统是否进入安全状态)、切换过程失效(切换逻辑本身出问题时是否有兜底)。每类场景都要记录检测时间、切换时间、切换后状态是否符合预期。检测时间和切换时间要跟安全目标里的故障容忍时间间隔做对比,超了就是不合格。
我一般会要求故障注入测试的覆盖率跟诊断覆盖率对齐,诊断能检测到的故障类型,测试里都要有对应的注入用例。这样才能证明"设计说能检测的,实际真的能检测到"。
3. 信任根的落地要点:从"买芯片"到"管密钥"
3.1 信任根的硬件载体怎么选
信任根的硬件载体常见有三类:芯片内置的安全模块(比如带安全启动和密钥存储的MCU)、独立的安全芯片(通过SPI或I2C挂载)、以及基于物理不可克隆功能(PUF)的方案。三类方案各有取舍。
内置安全模块的优点是集成度高、成本低、与主控耦合紧密,缺点是安全边界跟主控绑在一起,主控被攻破时安全模块也可能受牵连。独立安全芯片的优点是安全边界清晰、认证等级容易做高,缺点是增加BOM成本和通信开销,且通信链路本身需要保护。PUF方案的优点是密钥不存储、天然防物理提取,缺点是稳定性受工艺和温度影响,需要做纠错和老化补偿。
选型时不要只看认证等级,要看实际威胁模型。如果威胁主要是远程攻击,内置安全模块加安全启动通常够用;如果威胁包含物理接触和侧信道攻击,独立安全芯片更合适;如果产品生命周期很长、担心密钥被物理提取,PUF值得考虑。我见过一些团队盲目追求高认证等级,选了独立安全芯片,结果通信链路没做保护,攻击者直接从主控和安全芯片之间的总线上抓密钥,高等级芯片白买了。
3.2 安全启动链的设计:每一级都要验,但别验过头
安全启动链的设计核心是"逐级验证、失败即停"。信任根验证bootloader,bootloader验证操作系统,操作系统验证应用,每一级都要用上一级的公钥验证下一级的签名。设计时有几个关键决策点。
第一,验证范围。是验证全部固件还是只验证关键部分?全量验证安全性高但启动慢,部分验证启动快但有盲区。我的建议是关键安全功能相关的固件必须全量验证,非关键部分可以只验证完整性哈希,平衡安全与启动时间。
第二,失败策略。验证失败后是拒绝启动、进入恢复模式、还是降级运行?这取决于产品形态。安全关键产品应该拒绝启动或进入受限的安全状态,非关键产品可以进入恢复模式让用户重新刷写。失败策略要跟功能安全的安全状态定义对齐,不能安全启动失败了系统还带着可疑固件继续跑。
第三,度量与日志。每次启动的验证结果要记录,形成度量日志。日志本身要防篡改,通常存在受保护的区域或者用信任根的密钥签名。度量日志的价值在于事后审计和远程证明,没有日志的安全启动是"黑盒",出了问题没法追溯。
第四,启动时间的权衡。安全启动会增加启动时间,尤其是全量签名验证。实测下来,软件签名验证的开销跟固件大小和算法有关,RSA验证比ECC慢,SHA-256比SHA-1安全但稍慢。启动时间敏感的场景可以用硬件加速或者并行验证来优化,但不要为了启动时间砍掉必要的验证环节。
3.3 密钥生命周期管理:信任根真正的功夫所在
前面说过,信任根的实质是密钥管理。密钥的生命周期包括生成、注入、存储、使用、轮换、吊销、销毁七个阶段,每个阶段都有讲究。
生成阶段,密钥必须在受控环境中生成,用合格的随机源。我见过用软件伪随机数生成密钥的,熵不够,密钥可预测,整个信任根从源头就垮了。生成环境要物理隔离,生成过程要有双人复核。
注入阶段,密钥怎么从生成环境进入产品,是产线安全的核心。常见方式有产线注入(在受控产线上通过安全接口写入)、芯片预置(芯片厂在制造时写入)、以及现场派生(用设备唯一标识加主密钥派生)。产线注入灵活但产线本身要安全,芯片预置安全但灵活性差,现场派生省事但主密钥泄露就全盘皆输。
存储阶段,密钥要么存在受保护的OTP区域,要么存在安全芯片的密钥槽,要么用PUF派生。存储介质的选择要跟威胁模型匹配,明文存储在任何可读区域都是大忌。
轮换和吊销是最容易被忽略的。密钥用久了要换,密钥泄露了要能吊销。轮换机制要在设计阶段就留好接口,不能等出事再想办法。吊销需要一张可信的吊销列表,列表的分发和验证本身又需要信任根保护,这是个递归问题,通常用分层密钥体系来解决——主密钥签子密钥,子密钥签设备密钥,吊销时只吊销对应的子密钥。
提示:密钥管理的复杂度往往被低估。一个中等规模的车载项目,密钥种类可能就有十几类(安全启动、安全通信、诊断认证、OTA签名、日志签名等),每类的生命周期策略都不同。建议在架构阶段就建立密钥清单,明确每类密钥的用途、算法、长度、存储位置、轮换周期、吊销方式,这张清单是后续所有安全设计的基础。
3.4 信任根与冗余的配合:可信的副本才值得冗余
回到两条主线的合并。冗余副本必须经过信任根验证,否则冗余的是不可信的东西。具体做法是:每个副本在启动时都要走安全启动链,验证通过才允许参与冗余。主备切换时,备用副本接管前要重新确认其可信状态,不能因为它是"备用"就跳过验证。
另一个配合点是信任根自身的可用性。信任根如果单点失效,整个系统都起不来。所以信任根的存储和验证路径要有一定的容错设计,比如密钥存储做冗余、验证逻辑做双份、验证失败的处理有多条路径。但要注意,信任根的冗余不能破坏其安全性,冗余的副本之间要保证一致性,否则攻击者可以挑一个弱的副本下手。
4. 实操过程:一个域控制器的安全设计落地记录
4.1 需求梳理与安全目标定义
假设我们要给一个车身域控制器做安全设计,先梳理需求。功能安全侧,识别出几个安全目标:防止非预期车门解锁、防止非预期车窗上升夹伤、防止非预期灯光状态。信息安全侧,识别出几个资产:固件、诊断接口、通信密钥、用户配置数据。威胁包括固件篡改、诊断接口未授权访问、通信窃听与注入、配置数据篡改。
把安全目标和资产对应起来,形成一张矩阵:每个安全目标受哪些资产影响,每个资产被破坏会影响哪些安全目标。这张矩阵决定了后续冗余和信任根的投入重点。比如车门解锁这个安全目标,既需要功能安全的冗余(防止单点失效导致误解锁),也需要信息安全的信任根(防止固件被篡改后恶意解锁),两个方向都要投入。
4.2 冗余方案的具体配置
针对车门解锁,我们做了执行器驱动级的冗余:两路独立的驱动通道,各自有独立的电流监控,任一路检测到异常就由独立的监控逻辑切断两路输出并进入锁止状态。两路驱动共用供电,所以增加了供电电压的独立监控,供电异常时两路同时进入安全状态。共因失效分析里,供电共享被标记为高影响项,通过独立监控来缓解。
针对车窗上升,做了位置传感器的双路冗余,两路传感器用不同的物理原理(霍尔加电流纹波),避免同类型传感器共因失效。切换逻辑独立于应用逻辑,检测到一路异常时切换到另一路,同时记录切换事件。切换超时设为50毫秒,超时未完成则强制停止上升。
通信侧,关键控制报文走双通道CAN,两路CAN物理独立,收发器独立。报文层面加了计数器 and 校验,防止重放和篡改。双通道的切换由独立的通信管理模块负责,切换时保证报文序列号连续。
4.3 信任根的具体配置
主控选带内置安全模块的MCU,安全模块提供安全启动、密钥存储和加解密加速。信任根是一对固化在安全模块OTP区域的ECC密钥对,公钥用于验证bootloader签名,私钥在产线注入后不可读出。
安全启动链分三级:信任根验证bootloader,bootloader验证OS,OS验证应用。每级用ECDSA P-256签名,验证失败进入受限模式,只开放诊断恢复通道。度量日志存在安全模块的受保护区域,每条记录用信任根派生的日志密钥签名。
密钥清单梳理出五类:安全启动签名密钥、安全通信会话密钥、诊断认证密钥、OTA签名密钥、日志签名密钥。安全启动密钥和OTA密钥用离线根密钥签发,通信和诊断密钥用在线子密钥派生,日志密钥由安全模块内部派生。轮换周期上,会话密钥每次上电轮换,诊断密钥每季度轮换,签名密钥按车型生命周期轮换。
4.4 联调与故障注入验证
联调阶段做了几轮故障注入。硬件侧拔掉一路驱动供电,验证监控逻辑是否在预期时间内切断输出;软件侧强制置位传感器故障标志,验证切换逻辑是否接管且记录事件;安全侧篡改一段应用固件,验证安全启动是否拒绝加载并进入受限模式。
实测下来发现两个问题。一是双通道CAN切换时,备用通道的报文序列号没有跟主通道对齐,导致接收端出现序列号跳变被误判为攻击。解决方法是切换时由通信管理模块做序列号桥接,保证切换前后序列号连续。二是安全启动的度量日志在频繁重启的测试场景下写满了存储区,没有做滚动覆盖,导致后续启动无法记录。解决方法是日志区做环形缓冲,并增加日志满时的告警和清理策略。
这两个问题都不在设计文档的预期内,是联调阶段才暴露的。这也说明故障注入测试不能省,纸面分析再细也替代不了实际注入。
5. 常见问题与排查技巧实录
5.1 冗余相关的高频问题
问题一:冗余副本同时失效,但诊断没报。排查思路是先确认共因失效路径,重点查共享供电、共享时钟、共享总线。用示波器同时抓两路副本的关键信号,看失效是否同步发生。如果同步,基本可以确定是共因。解决方法是隔离共享路径或者增加针对共享路径的独立监控。
问题二:切换后输出异常。排查切换时的状态同步逻辑,重点看同步的数据范围是否覆盖了所有安全关键状态,同步时序是否有竞争。用日志回放切换前后的状态快照,对比主备状态差异。常见原因是同步只做了单向或者同步频率太低。
问题三:切换抖动。故障检测阈值太敏感或者去抖时间太短。实测标定阈值,把去抖时间加到能覆盖最坏情况下的瞬态干扰。同时检查故障恢复逻辑,避免故障刚恢复就切回导致来回抖。
问题四:诊断覆盖率上不去。检查诊断手段是否覆盖了所有失效模式。很多团队只做了开路短路检测,没做漂移检测和间歇故障检测。增加周期性自检和交叉校验能显著提升覆盖率。
5.2 信任根相关的高频问题
问题一:安全启动验证失败但不知道失败在哪一级。度量日志没做或者日志不详细。解决方法是每级验证都记录详细的度量值 and 验证结果,日志要能定位到具体哪一级、哪个固件段失败。
问题二:密钥注入后读不出来但功能异常。检查密钥注入的格式和字节序,很多问题是注入工具和芯片的字节序不一致导致的。另外检查密钥的权限配置,有些芯片的密钥槽有读写权限和使用权限的区分,配错了密钥在但用不了。
问题三:安全启动导致启动时间超标。先测量各级验证的耗时,找出瓶颈。优化手段包括用硬件加速、并行验证非依赖的固件段、对非关键固件用哈希代替签名验证。但不要砍掉关键验证环节,启动时间超标应该从架构上优化而不是降低安全强度。
问题四:密钥轮换后旧设备连不上。轮换机制没考虑向后兼容。解决方法是密钥体系做分层,轮换只换子密钥,根密钥不变,同时保留旧子密钥的过渡期验证能力。
5.3 独家避坑清单
下面这几条是我踩过坑之后总结的,常规文档里不太会写:
- 共因失效分析一定要在架构冻结前做完,后期改架构再补分析,成本翻倍且容易漏。
- 冗余切换逻辑的代码要走跟安全功能同等严格的评审和测试流程,不能因为它是"辅助逻辑"就放松。
- 信任根的密钥清单要在项目启动时就建立,不要等到安全启动做完了才发现还有一堆密钥没地方放。
- 安全启动的失败策略要跟功能安全的安全状态定义对齐,两个团队要坐在一起定,不能各定各的。
- 故障注入测试的用例要从FMEA和威胁模型里反向生成,保证覆盖所有已识别的失效模式和攻击路径。
- 度量日志的存储规划要提前做,日志写满是很常见的现场问题,环形缓冲加告警是标配。
- 密钥注入产线的安全审计要纳入项目计划,产线不安全,前面所有密钥管理都白做。
5.4 问题速查表
| 现象 | 可能原因 | 排查方向 | 解决手段 |
|---|---|---|---|
| 冗余副本同时失效 | 共因失效 | 查共享供电/时钟/总线 | 隔离共享路径或加独立监控 |
| 切换后输出异常 | 状态同步不完整 | 回放切换前后状态快照 | 扩大同步范围、提高同步频率 |
| 切换抖动 | 检测阈值过敏感 | 实测标定阈值和去抖时间 | 调整阈值、增加去抖 |
| 安全启动失败定位难 | 度量日志不详细 | 检查日志粒度 | 每级记录度量值和结果 |
| 密钥注入后功能异常 | 字节序或权限配置错 | 核对注入格式和权限 | 修正注入工具配置 |
| 启动时间超标 | 验证开销大 | 测量各级耗时 | 硬件加速、并行验证 |
| 密钥轮换后兼容性差 | 未做分层密钥体系 | 检查轮换策略 | 分层密钥、保留过渡期 |
6. 架构层面的取舍:什么时候该上冗余,什么时候该上信任根
6.1 按威胁模型分配投入
冗余和信任根的投入不是平均分配的,要按威胁模型来。如果主要威胁是随机硬件失效,冗余的投入产出比高;如果主要威胁是恶意篡改和未授权访问,信任根的投入更关键。实际项目里两类威胁往往并存,但权重不同。车载场景里,功能安全相关的失效概率有量化指标要求,冗余的投入相对刚性;信息安全威胁的概率难量化,投入更多靠风险评估和合规要求驱动。
我的做法是先做威胁建模,把威胁按"可能性×影响"排序,排在前面的威胁对应的防护手段优先投入。冗余和信任根各自覆盖的威胁类型不同,排序之后自然就知道该往哪边倾斜。不要为了"看起来安全"而两边都堆满,成本和复杂度会失控。
6.2 成本与复杂度的现实约束
冗余的成本不只是硬件BOM,还包括诊断开发、切换逻辑开发、故障注入测试、产线测试增加的时间。信任根的成本不只是安全芯片,还包括密钥管理基础设施、产线安全改造、安全启动的启动时间代价、以及后续密钥轮换的运维成本。这些隐性成本在方案选型时经常被低估。
现实的做法是分阶段落地。第一阶段先把信任根的基础打牢(安全启动加密钥管理),这是信息安全的底线,投入相对可控。第二阶段针对高影响的安全目标做冗余,优先覆盖单点失效会直接违背安全目标的环节。第三阶段再考虑系统级冗余和更高级的信任根能力(比如远程证明、动态度量)。分阶段的好处是每阶段都有可验证的产出,风险可控。
6.3 可维护性:安全设计不能变成黑盒
安全设计最怕变成只有原作者能维护的黑盒。冗余的切换逻辑、信任根的密钥流程,如果文档不全、日志不清,后续维护和问题定位会非常痛苦。我要求所有安全相关模块必须满足三个条件:有完整的设计文档说明"为什么这么设计"、有详细的日志记录"实际发生了什么"、有可复现的测试用例证明"设计确实有效"。
可维护性还体现在变更管理上。任何涉及冗余或信任根的变更,都要走安全评审,评估对共因失效分析和信任链的影响。我见过为了降成本把安全启动的验证范围缩小,结果缩小后的范围恰好漏掉了被攻击的固件段,这种变更如果没有评审把关,后果很严重。
7. 我个人在实际操作中的几点体会
做这类安全设计,技术方案本身固然重要,但真正决定成败的往往是流程和协作。功能安全团队和信息安全团队如果各做各的,最后合并时一定会有冲突,比如安全启动的失败策略跟功能安全的安全状态定义打架,或者冗余的诊断覆盖率跟信息安全的日志要求对不上。我的经验是这两个团队从需求阶段就要坐在一起,共用一张安全目标与资产矩阵,共用一套故障注入和渗透测试的用例库。
另一个体会是,安全设计要尽早做,越往后成本越高。架构冻结后再加信任根,可能要换芯片、改产线、重做启动流程;量产后再补共因失效分析,可能要改板子布局。早期投入的每一分精力,后期都能省下好几倍。我见过太多项目把安全设计拖到后期,最后要么砍需求,要么加成本,两头不讨好。
最后一点,安全设计要有可验证的产出。不要停留在文档和评审,要有故障注入的测试报告、有密钥管理的审计记录、有度量日志的实际数据。这些东西不仅是合规的需要,更是你自己确认"设计真的有效"的唯一途径。纸面上的安全,永远只是纸面上的。
这个内容后续还可以往两个方向扩展:一是把信任根延伸到整车的密钥管理体系,讨论跨域控制器的密钥分发和轮换;二是把冗余设计跟OTA升级结合,讨论升级过程中的冗余状态保持和信任链连续性。这两个方向都是实际项目里会遇到的,有机会再展开聊。