多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

智能家居安全基石:硬件信任锚设计与实战

智能家居安全基石:硬件信任锚设计与实战 1. 从一个真实翻车案例说起为什么智能家居安全绕不开硬件信任锚去年帮一个做全屋智能的朋友排查过一次挺典型的故障。他家那套系统大概有四十多个节点灯控、窗帘、温控、门锁、摄像头全都挂在同一个网关下面。有天早上他发现门锁在凌晨三点被远程开过一次日志里显示是一条来自外网的控制指令但家里没人操作过。后来查了两天才定位到问题网关的固件签名校验被绕过了攻击者往里面塞了一个伪造的固件包拿到了设备控制权。这件事让我重新审视了一个老生常谈但经常被忽略的话题——智能家居的安全到底该建立在什么之上。软件层面的加密、认证、访问控制当然要做但软件跑在硬件上如果硬件本身没有一个可信的起点那上面盖的楼再漂亮也是沙子上建的。这个可信的起点就是硬件信任锚。硬件信任锚说白了就是一颗专门用来存密钥、做加解密、验证固件签名的独立芯片或者芯片内的一个安全子系统。它跟主处理器是物理隔离的主系统被攻破了它还能守住最后一道门。智能家居场景里它解决的核心问题是设备身份不可伪造、固件不可篡改、密钥不可窃取。适合所有做智能硬件产品的人看不管你是做门锁、摄像头、网关还是传感器只要设备联网这套东西迟早要面对。我下面会从设计思路、核心细节、实操落地、问题排查几个角度把硬件信任锚在智能家居里的用法讲透尽量说人话也尽量给能直接抄的方案。2. 整体设计思路为什么是硬件信任锚而不是纯软件方案2.1 智能家居的安全边界到底在哪里先想清楚一件事智能家居设备和传统IT设备的安全模型完全不一样。服务器放在机房里有物理防护、有专人运维、有网络隔离。智能家居设备呢它可能被装在门口、挂在墙上、塞在抽屉里任何人都能物理接触到它。你没法假设攻击者拿不到设备只能假设攻击者一定能拿到设备。这就决定了安全设计的第一原则密钥必须存在攻击者即使拆开设备也拿不到的地方。纯软件方案把密钥存在Flash里拆机读Flash就完事了。硬件信任锚把密钥存在安全芯片内部芯片设计上就不允许外部直接读取密钥内容只能通过加密引擎间接使用。这是本质区别。第二个原则是启动链必须可验证。设备上电后第一段代码从哪来、有没有被改过这个判断必须由一个不可篡改的根来做出。这个根就是信任锚里的只读固件或者固化密钥。第三个原则是身份必须唯一且不可克隆。每台设备出厂时应该有一个由信任锚生成的唯一身份密钥对私钥永远不出芯片公钥拿去云端注册。这样即使别人复制了你的固件、复制了你的电路板他也复制不了这颗芯片里的私钥。2.2 纯软件方案为什么不够用我见过不少团队一开始想省成本用主控MCU的OTP区域存密钥或者用外部SPI Flash加个加密分区。这些方案在实验室里跑得通一到真实场景就出问题。OTP区域的问题在于很多MCU的OTP读取并没有硬件级访问控制通过调试接口或者侧信道攻击是有可能读出来的。而且OTP只能写一次密钥轮换基本做不了。外部Flash加密分区的问题更明显密钥本身还是要存在某个地方绕来绕去又回到了“密钥存哪”这个死循环。还有一个容易被忽略的点固件签名验证如果由主CPU来做那主CPU被攻破后验证逻辑可以被patch掉。攻击者可以先运行一段恶意代码把验证函数替换成永远返回true然后再加载恶意固件。硬件信任锚做验证就不一样验证逻辑跑在安全子系统里主CPU根本碰不到。2.3 硬件信任锚的几种形态和选型考量市面上常见的硬件信任锚大概分三类选哪种取决于你的产品定位和成本预算。第一类是独立安全芯片比如通过I2C或SPI接口挂到主控上的安全元件。优点是主控选型灵活安全等级高芯片内部有完整的加密引擎、真随机数发生器、安全存储。缺点是增加BOM成本而且通信总线本身可能成为攻击面需要做总线加密。第二类是主控内置的安全子系统比如很多新一代MCU和SoC里集成的TrustZone或者类似的安全域。优点是成本低、集成度高、不用额外走线。缺点是安全等级依赖主控厂商的实现质量而且主控和安区域共享硅片理论上存在侧信道串扰的可能。第三类是带安全功能的无线模组比如一些Wi-Fi或蓝牙模组内部集成了安全引擎。优点是省事联网和安全一锅端。缺点是灵活性差安全策略受模组厂商限制。我的建议是门锁、摄像头这类高安全等级产品直接上独立安全芯片别省这个钱。灯控、传感器这类低风险设备可以用主控内置安全子系统。网关作为整个系统的信任中心必须用最高等级的方案。2.4 信任链怎么一步步建立起来硬件信任锚不是孤立工作的它是一条信任链的起点。这条链大概是这样的设备上电信任锚里的固化代码先运行验证Bootloader的签名。Bootloader验证通过后运行再去验证操作系统内核或者RTOS的签名。内核起来后验证应用程序的签名。每一级都验证下一级任何一级失败就停止启动或者进入恢复模式。这条链的关键在于每一级的验证公钥或者哈希值必须存在上一级的可信存储里。最底层的信任锚里存的是Bootloader的公钥哈希这个哈希在芯片出厂时就固化进去了改不了。Bootloader里存的是内核的公钥哈希以此类推。云端侧也要配合。设备第一次联网时用信任锚生成的设备私钥对一段挑战值签名云端用对应的公钥验证。验证通过后颁发一个设备证书后续通信都用这个证书做双向认证。这样即使有人复制了固件他没有信任锚里的私钥也过不了云端认证。3. 核心细节解析硬件信任锚到底怎么用3.1 密钥体系设计别把所有鸡蛋放一个篮子硬件信任锚里通常要存好几类密钥用途不同生命周期也不同必须分开管理。设备身份密钥出厂时在信任锚内部生成私钥永远不出芯片。用于设备向云端证明“我是我”。这个密钥一般终身不变除非设备重置。固件签名验证公钥用于验证固件签名。这个公钥可以存在信任锚的可信存储区也可以直接固化哈希。固件升级时用对应的私钥签名设备端用这个公钥验证。通信会话密钥每次设备与云端或者设备与设备之间建立连接时通过密钥协商临时生成。用完就丢不长期存储。信任锚负责生成随机数和执行密钥协商算法。本地存储加密密钥用于加密设备本地存储的敏感数据比如用户配置、Wi-Fi密码等。这个密钥由信任锚派生主系统只能通过信任锚的加密接口间接使用。这四类密钥的权限要严格隔离。身份密钥只能用于签名不能用于加密。会话密钥只能用于当前会话不能跨会话复用。固件验证公钥只能读不能写。3.2 安全启动的实现细节安全启动是硬件信任锚最核心的功能但实现起来有不少坑。第一步是固化信任根。芯片出厂时厂商会把一段不可修改的ROM代码和Bootloader的公钥哈希写进信任锚。这段ROM代码在芯片上电后第一时间运行它的唯一职责就是验证Bootloader。第二步是Bootloader验证。ROM代码计算Bootloader镜像的哈希跟信任锚里存的哈希比对。如果一致就跳转执行不一致就进入恢复模式或者直接挂起。这里要注意哈希算法要用SHA-256以上别用MD5或者SHA-1。第三步是逐级验证。Bootloader起来后用类似的方式验证内核。内核起来后验证应用。每一级的验证公钥都存上一级的可信区域里。注意安全启动的验证过程必须在信任锚内部完成或者至少由信任锚提供不可篡改的验证结果。如果验证逻辑跑在主CPU上攻击者可以通过故障注入等方式跳过验证。还有一个细节是回滚保护。攻击者可能把设备固件降级到一个有已知漏洞的旧版本然后利用旧漏洞攻击。信任锚里要存一个固件版本计数器只允许升级到更高版本不允许降级。这个计数器一旦增加就不能减少。3.3 设备身份认证的完整流程设备身份认证不是简单地把证书发过去就完事了要防止重放攻击和中间人攻击。典型的流程是这样的设备向云端发起连接请求云端返回一个随机挑战值。设备把挑战值送给信任锚信任锚用设备私钥对挑战值签名返回签名结果。设备把签名和设备证书一起发给云端。云端用证书里的公钥验证签名验证通过则确认设备身份。这个流程的关键在于挑战值必须是真随机的而且每次不同。信任锚里要有真随机数发生器不能用软件伪随机。伪随机的种子如果被猜出来攻击者就能预测挑战值重放攻击就防不住了。设备证书的签发也有讲究。最好在产线上完成每台设备烧录唯一的证书。证书里包含设备公钥、设备型号、生产批次等信息。云端维护一个设备证书库只有库里的证书才被认可。3.4 安全存储和密钥使用策略信任锚里的安全存储区通常很小可能只有几KB到几十KB不能什么都往里塞。要精打细算。必须存在信任锚里的设备身份私钥、固件验证公钥哈希、回滚计数器、真随机数种子。可以存在主系统加密分区里的用户配置、Wi-Fi密码、设备日志。这些数据用信任锚派生的密钥加密密钥本身不落盘。绝对不能存的任何形式的明文密钥、调试接口的永久开启标志、默认密码。密钥使用要有策略。比如设备身份私钥只允许用于签名不允许用于解密。会话密钥只允许用于当前会话的加解密会话结束后立即销毁。这些策略要在信任锚的固件里硬编码不能由主系统动态修改。3.5 物理攻击的防护考量硬件信任锚虽然叫“硬件”但也不是无敌的。物理攻击手段包括侧信道分析、故障注入、微探针等。侧信道分析是通过测量芯片的功耗、电磁辐射、执行时间来推断密钥。防护手段包括加密引擎的功耗均衡设计、随机插入伪操作、时钟抖动等。故障注入是通过电压毛刺、时钟毛刺、激光照射等方式让芯片执行出错从而绕过安全检查。防护手段包括电压和时钟监控、冗余计算比对、关键操作多次验证等。微探针是直接把芯片开封用探针读取内部信号。防护手段包括金属屏蔽层、传感器网格、主动清零电路等。对于智能家居设备来说攻击者一般不会上这么高级的手段但门锁、摄像头这类高价值目标值得考虑。选信任锚芯片时要看它的安全认证等级比如是否通过了Common Criteria EAL4以上认证。4. 实操过程从选型到量产的全流程4.1 信任锚芯片选型对比选芯片不能只看价格要综合安全等级、接口、开发生态、供货稳定性。芯片类型安全等级接口开发难度成本适用场景独立安全芯片高等级EAL5I2C/SPI中高门锁、摄像头、网关独立安全芯片中等级EAL4I2C低中温控、传感器主控内置安全子系统取决于主控内部总线低低灯控、插座安全无线模组取决于模组内部总线低中简单联网设备选型时要重点确认几个参数是否支持安全启动、是否支持密钥生成和存储、是否支持签名和验签、是否有真随机数发生器、是否支持安全固件升级。4.2 产线烧录和密钥注入流程产线环节是安全链条里最容易被忽视但最危险的一环。我见过有团队把同一套密钥烧到所有设备里这等于没有身份认证。正确的流程应该是信任锚芯片在封装前或者封装后由芯片厂商预置一段初始密钥或者空密钥区。产线上设备第一次上电时信任锚内部生成唯一的设备密钥对。设备把公钥导出通过安全通道发送到产线服务器。产线服务器用CA私钥签发设备证书把证书写回设备。设备把证书存在主系统的加密分区里私钥永远留在信任锚内部。注意产线服务器和CA私钥的安全等级要非常高最好用硬件安全模块来保护。CA私钥泄露等于所有设备身份都可以被伪造。烧录过程中要防止密钥被截获。产线网络要隔离烧录数据要加密传输烧录完成后要立即验证。4.3 固件签名和升级的落地方法固件签名用非对称算法私钥在开发服务器上公钥在设备端。开发流程大概是# 生成签名密钥对只在开发环境做一次 openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out fw_signing_key.pem openssl pkey -in fw_signing_key.pem -pubout -out fw_signing_pub.pem # 对固件镜像签名 openssl dgst -sha256 -sign fw_signing_key.pem -out firmware.sig firmware.bin # 把公钥哈希固化到信任锚产线步骤 # 把固件镜像和签名一起打包设备端升级时信任锚先验证签名的合法性验证通过后才允许写入Flash。写入完成后还要再验证一次确保写入过程没有出错。固件升级包要加版本号信任锚里的回滚计数器只增不减。升级失败要能回滚到上一个可用版本但回滚的目标版本不能低于计数器记录的最低版本。4.4 云端配合设备认证和证书管理云端要维护一个设备证书库记录每台设备的证书、状态、固件版本等信息。设备连接时云端先验证证书是否在库里、是否被吊销、是否过期。设备认证通过后云端颁发一个短期会话令牌后续通信可以用令牌做认证不用每次都做签名验证。令牌有效期建议不超过24小时过期后重新认证。证书吊销机制也要有。如果某台设备丢失或者被攻破云端要能吊销它的证书让它无法再连接。吊销列表可以定期推送到网关由网关在本地执行。4.5 一个最小可行方案的搭建记录如果预算有限可以先搭一个最小可行方案验证流程。我试过用一颗中等级安全芯片加一个支持安全启动的MCU大概两周能跑通。硬件连接安全芯片通过I2C挂到MCUMCU通过UART输出调试信息。软件流程MCU上电安全芯片先初始化生成设备密钥对。MCU读取安全芯片里的Bootloader哈希验证Bootloader。Bootloader验证应用固件。应用启动后通过安全芯片对挑战值签名连接云端。云端验证签名建立加密通道。这个方案能覆盖设备身份认证和安全启动两个核心功能成本增加大概几块钱。跑通之后再逐步加安全存储、回滚保护、物理防护等功能。5. 常见问题与排查技巧实录5.1 安全启动失败怎么定位安全启动失败是最常见的问题表现是设备反复重启或者卡在恢复模式。排查思路要按信任链逐级往上查。先确认信任锚本身是否正常。用调试工具读取信任锚的状态寄存器看是否有错误标志。如果信任锚初始化就失败可能是I2C通信问题或者芯片损坏。信任锚正常的话查Bootloader验证。把Bootloader镜像的哈希读出来跟信任锚里存的哈希比对。不一致的话可能是烧录时镜像损坏或者签名密钥用错了。Bootloader验证通过但内核验证失败查内核镜像的签名。常见原因是签名时用的私钥跟设备端公钥不匹配或者签名算法不一致。实操心得安全启动的调试信息要尽量详细每一级验证的结果都要输出到串口或者日志。但量产固件里要关掉详细日志防止泄露内部信息。5.2 设备认证失败的几种典型原因设备认证失败在云端日志里通常表现为签名验证不通过。原因可能出在设备端也可能出在云端。设备端常见问题信任锚里的私钥被意外清除、挑战值处理逻辑有bug、签名算法实现有误、时钟不同步导致挑战值过期。云端常见问题证书库没有及时更新、证书被误吊销、CA公钥配置错误、挑战值生成逻辑有漏洞。排查时先在设备端确认签名结果是否正确可以把签名值和公钥导出来在本地用openssl验证一遍。如果本地验证通过但云端不通过那就是云端的问题。5.3 密钥泄露的应急处理万一发现密钥泄露要立即启动应急流程。第一步是隔离。把受影响设备从云端证书库里标记为可疑限制其访问权限。第二步是评估。确认泄露的是哪类密钥。如果是会话密钥影响有限重新协商即可。如果是设备身份私钥那台设备的身份就不可信了需要吊销证书并重新注入密钥。如果是CA私钥泄露那就是重大事故所有设备证书都要重新签发。第三步是修复。通过安全通道推送新的固件或者密钥。如果设备已经被攻击者控制可能无法远程修复只能召回。第四步是复盘。查清楚泄露途径是产线环节、云端环节还是设备端被攻破堵住漏洞。5.4 常见问题速查表问题现象可能原因排查方法解决措施设备反复重启安全启动验证失败读信任锚状态寄存器检查固件签名和哈希云端认证不通过签名验证失败本地用openssl验证签名检查密钥匹配和算法固件升级失败签名不合法或版本回滚查升级日志和版本号重新签名或提升版本号信任锚通信失败I2C总线问题用示波器看总线波形检查上拉电阻和地址设备被克隆身份私钥泄露查云端是否有重复认证吊销证书并重新注入随机数质量差信任锚RNG故障采集随机数做统计测试更换信任锚或修复RNG5.5 几个容易踩的坑第一个坑是信任锚的调试接口没关。很多安全芯片出厂时调试接口是开启的量产前必须关闭或者锁定。我见过有产品因为JTAG没关攻击者直接读出了密钥。第二个坑是固件签名验证只做了一次。有些方案只在启动时验证运行时不验证。攻击者可以在运行时替换固件。正确做法是启动时验证运行时定期抽检升级时再验证。第三个坑是密钥派生用了弱算法。从主密钥派生会话密钥时如果用了简单的哈希或者固定盐值容易被逆向。要用HKDF这类标准的密钥派生函数。第四个坑是忽略了时间同步。设备认证和证书验证都依赖时间如果设备时间被篡改证书可能被误判为有效或过期。信任锚里最好有一个安全时钟或者至少有一个单调递增的计数器。第五个坑是产线测试固件和量产固件混用。测试固件通常关闭了安全检查如果误烧到量产设备上等于没有安全防护。产线要有严格的固件版本管理。6. 成本、性能与安全的平衡取舍6.1 增加硬件信任锚对BOM的影响加一颗独立安全芯片BOM成本大概增加几块到十几块人民币取决于芯片等级和采购量。对于售价几百块的门锁或者摄像头这个比例可以接受。对于售价几十块的灯控或者插座可能就有点压力。如果成本实在紧张可以考虑用主控内置的安全子系统BOM增加为零但安全等级会打折扣。折中方案是用一颗中等级的安全芯片只做密钥存储和签名安全启动由主控配合完成。6.2 安全启动对启动时间的影响安全启动要计算哈希和验证签名会增加启动时间。SHA-256计算1MB数据大概几十毫秒ECDSA验签大概几毫秒到几十毫秒。如果固件有几十MB启动时间可能增加几百毫秒到一秒。优化方法包括只验证关键分区、用硬件加速引擎、并行验证多个分区。对于启动时间敏感的设备可以把验证过程放到后台先启动核心功能再逐步验证其他部分。6.3 密钥轮换和生命周期管理密钥不是生成一次就永远不换。设备身份密钥可以终身不变但会话密钥要每次会话都换固件签名密钥建议每年轮换一次CA密钥建议每三到五年轮换一次。轮换时要考虑兼容性。旧设备可能只认旧公钥新固件要用新公钥签名。解决方案是设备端同时存新旧两个公钥过渡期用旧公钥签名过渡期结束后切换到新公钥。6.4 不同安全等级的方案推荐高安全等级门锁、摄像头、网关独立安全芯片EAL5以上完整安全启动设备身份认证安全存储物理防护回滚保护。BOM增加10-20元。中安全等级温控、传感器独立安全芯片EAL4安全启动设备身份认证。BOM增加3-8元。低安全等级灯控、插座主控内置安全子系统基本安全启动简单身份认证。BOM增加0-3元。选方案时要看设备被攻破后的影响。门锁被攻破可能导致财产损失甚至人身安全必须用高等级方案。灯控被攻破最多是灯乱闪低等级方案可以接受。7. 一些个人体会和后续扩展方向我在实际项目里最大的体会是硬件信任锚的价值不在于它有多复杂而在于它把安全边界从“软件可触及”推到了“硬件不可触及”。很多安全问题不是算法不够强而是密钥存错了地方、验证逻辑跑错了位置。把这两个问题解决了大部分攻击面就关掉了。另一个体会是安全方案要跟产品生命周期匹配。设备卖出去只是开始后面还有好几年的运维。密钥怎么轮换、固件怎么升级、证书怎么吊销这些都要在方案设计阶段就想清楚不能等出了问题再补。后续如果要把这套方案扩展我觉得有几个方向值得做。一是把信任锚的能力开放给第三方开发者让生态里的其他设备也能接入这套认证体系。二是把信任锚和区块链结合做去中心化的设备身份管理。三是把信任锚和AI结合用异常检测来发现密钥滥用行为。这些方向我还在摸索有进展再分享。最后分享一个小技巧调试安全启动时可以先把验证逻辑改成只记录不拦截让设备正常启动同时把验证结果输出到日志。这样能快速定位是哪一级验证失败而不用反复烧录固件。等验证逻辑调通了再改成拦截模式。这个办法帮我省了不少时间。
返回列表