2、安全芯片与硬件信任根:安全元件(SE)选型、安全密钥存储、硬件唯一密钥(DUK)管理

Matter 设备的安全,说白了就是密钥的安全。你想想看,设备入网靠的是 DAC 证书,通信靠的是 CASE 会话密钥,固件升级靠的是 CD 签名——这些环节只要有一个密钥泄露,整个信任链就断了。

我做了这么多年物联网安全,见过太多「软件加密」翻车的案例。有人把私钥藏在 Flash 的某个角落,结果被 JTAG 读出来;有人用 MCU 内置的 OTP 存密钥,结果被侧信道攻击破解。嗯,所以 Matter 强制要求:密钥必须由硬件安全元件保护。

2.1 安全元件选型:不是越贵越好

选 SE 芯片,我个人的习惯是先看三样东西:安全等级认证、存储容量、接口兼容性。

评估维度 关键指标 我的建议
安全认证 CC EAL4+ / FIPS 140-2 Level 2+ 至少 EAL4+,Matter 认证要求
密钥存储 非易失性存储 ≥ 32KB 够放 DAC + 多组 DUK + 固件密钥
接口 I²C / SPI / SWI I²C 最常用,注意电平匹配
功耗 待机 ≤ 1μA 电池设备必须考虑
成本 批量价 0.3~1.5 USD 别为了省钱选无认证的
⚠️ 避坑指南: 我曾经遇到一个客户,选了某款便宜 SE,结果发现它不支持 Matter 要求的 P256 曲线加速。每次签名要 800ms,设备入网时直接超时。所以选型前一定要确认:硬件是否支持 ECDSA 和 ECDH 硬件加速。

2.2 安全密钥存储:密钥不能「裸奔」

密钥存储的核心原则就一句话:密钥永远不应该以明文形式出现在 MCU 的 RAM 或 Flash 中。

Matter 设备涉及以下几类密钥:

  • DAC 私钥:设备认证证书的私钥,出厂预置,终身不变
  • DUK(Device Unique Key):硬件唯一密钥,用于派生会话密钥
  • 固件签名公钥:验证 OTA 固件签名,通常存储在 SE 的只读区
  • ICAC / PAA 证书:用于验证证书链,可存于外部 Flash(只读)

我建议的存储方案是这样的:

┌─────────────────────────────────────────┐
│           安全元件 (SE)                    │
│  ┌─────────────┐  ┌──────────────────┐  │
│  │ DAC 私钥     │  │ DUK (唯一密钥)    │  │
│  │ (不可导出)   │  │ (不可导出)        │  │
│  └─────────────┘  └──────────────────┘  │
│  ┌─────────────┐  ┌──────────────────┐  │
│  │ 固件公钥     │  │ 会话密钥缓存      │  │
│  │ (只读)       │  │ (临时)           │  │
│  └─────────────┘  └──────────────────┘  │
└─────────────────────────────────────────┘
         ▲                    ▲
         │ I²C/SPI           │
         ▼                    ▼
┌─────────────────────────────────────────┐
│           主控 MCU                        │
│  ┌──────────────────────────────────┐   │
│  │ 证书链 (DAC/ICAC/PAA)            │   │
│  │ 存储于外部 Flash (可读不可写)     │   │
│  └──────────────────────────────────┘   │
└─────────────────────────────────────────┘
💡 个人经验: 我习惯在 SE 内部划一个「密钥槽位表」,每个槽位有 ID、类型、访问权限。这样固件升级时,新固件只能读取「固件公钥」槽位,永远碰不到 DAC 私钥槽位。

2.3 硬件唯一密钥(DUK)管理

DUK 是 Matter 设备安全的核心。每个设备出厂时,SE 内部会生成一个唯一的 256 位密钥。这个密钥有两个特点:

  • 唯一性:全球没有两个设备拥有相同的 DUK
  • 不可导出:SE 只提供「用 DUK 做运算」的接口,不提供「读出 DUK」的接口

DUK 的主要用途是派生各种会话密钥。举个例子:

// 伪代码:使用 DUK 派生 CASE 会话密钥
// 输入:DUK (存储在 SE 内部)
// 输入:随机数 random1, random2 (来自对端设备)
// 输出:会话密钥 session_key

function derive_session_key(random1, random2):
    // 1. 拼接随机数
    input = random1 || random2
    
    // 2. 调用 SE 的 HKDF 扩展指令
    //    注意:DUK 永远不会离开 SE
    session_key = SE.HKDF_expand(
        key_slot = DUK_SLOT_ID,  // 引用 DUK 槽位
        input    = input,
        length   = 16            // AES-128 密钥长度
    )
    
    return session_key
🔑 关键点: DUK 的派生过程全部在 SE 内部完成。MCU 只能拿到派生后的会话密钥,永远接触不到 DUK 本身。这就是硬件信任根的威力——即使 MCU 被攻破,攻击者也拿不到设备的长期密钥。

2.4 DUK 生命周期管理

DUK 从生成到销毁,每个阶段都有讲究。我整理了一个生命周期表:

阶段 操作 安全要求
生成 SE 内部 TRNG 生成 256 位随机数 必须在安全制造环境进行
存储 写入 SE 的 OTP 或 eFuse 区域 一次性写入,不可修改
使用 通过 SE 指令进行派生/签名 每次操作需鉴权(如 PIN 或 MAC)
备份 仅在安全 HSM 中备份 备份密钥与设备分离存储
销毁 SE 自毁指令或物理销毁 确保无法恢复
⚠️ 我曾经踩过的坑: 有次量产时,工厂把 DUK 生成脚本写错了,导致一批设备的 DUK 全部相同。结果这些设备入网时互相冲突,Matter 控制器认为它们在重放攻击。最后只能全部返工。所以 DUK 生成后,一定要在产线做唯一性校验。

2.5 安全芯片与 MCU 的通信保护

SE 和 MCU 之间的通信通道,其实是最容易被忽略的攻击面。你想想看,如果 I²C 总线上的数据是明文的,攻击者用逻辑分析仪就能抓到会话密钥。

我建议的做法是:

  • 启用 SE 的安全通道协议:大部分 SE 支持 SCP(Secure Channel Protocol),通信前先做双向认证
  • 每条指令加 MAC:防止重放攻击
  • 物理隔离:SE 的 I²C 走独立总线,不要和传感器共用
// 安全通道建立流程(简化版)
1. MCU 发送随机数 challenge 给 SE
2. SE 用 DUK 对 challenge 签名,返回签名值
3. MCU 验证签名(使用 SE 的公钥证书)
4. 双方派生会话加密密钥
5. 后续所有通信使用 AES-CCM 加密
💡 我的习惯: 即使 SE 支持安全通道,我仍然会在 PCB 布局上把 SE 的通信引脚用 GND 包围起来,减少侧信道泄露的风险。安全设计要「层层设防」。

2.6 知识体系总览

下面这张图总结了本章的核心逻辑:

安全芯片与硬件信任根知识体系 安全元件(SE)选型 安全密钥存储 硬件唯一密钥(DUK)管理 SE-MCU通信保护 DAC私钥 / 固件公钥 密钥槽位表 / 访问控制 DUK生成 / 派生 / 销毁 安全通道(SCP) 核心原则:密钥永不离开SE,所有密码运算在SE内部完成 硬件信任根 = 不可伪造 + 不可导出 + 不可篡改

这张图把本章的知识点串起来了。从 SE 选型开始,到密钥存储、DUK 管理、通信保护,最终落到「硬件信任根」这个核心概念上。你设计 Matter 设备时,可以拿这张图当 checklist,看看每个环节是否都覆盖到了。