密码学基础回顾:Matter 安全体系的四块基石
做 Matter 安全,说白了就是跟四样东西打交道:对称加密、非对称加密、哈希函数、密钥派生。这四样东西,就像盖房子的四根柱子,缺一根都不行。
我刚开始接触 Matter 协议栈时,觉得密码学嘛,调库就完事了。后来踩了几个坑才明白——不懂原理,你连日志都看不懂。今天咱们把这四块基石掰开揉碎了讲清楚。
1. 对称加密:AES-CCM,Matter 的通信保镖
对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。好处是快,坏处是——密钥怎么安全地交给对方?
Matter 选的是 AES-CCM,不是裸 AES。为什么?因为 AES 本身只负责加密,不保证数据有没有被篡改。CCM 模式(Counter with CBC-MAC)把加密和认证打包在一起,一次搞定。
AES-CCM 的核心特点:
- 加密:用 AES 的 CTR 模式(计数器模式),速度快,支持并行计算
- 认证:用 CBC-MAC 生成消息认证码(MAC),确保数据没被改过
- Nonce:每次加密必须用不同的 Nonce(一次性数字),否则密钥就废了
我记得有一次调试 Matter 设备间的通信失败,抓包看了半天,发现是 Nonce 重复了。设备重启后计数器没重置,直接用了同一个 Nonce——嗯,从那以后我写代码都会加一句 Nonce 唯一性检查。
实战建议:Matter 中 AES-CCM 的 Nonce 由 13 字节组成:8 字节帧计数器 + 4 字节源节点 ID + 1 字节安全标志位。千万别自己拼,用 SDK 提供的接口。
2. 非对称加密:ECDSA,数字世界的身份证
对称加密有个死穴——密钥分发。你想想看,两个设备第一次见面,怎么安全地交换密钥?
非对称加密就是来解决这个问题的。每个设备有一对密钥:私钥自己藏着,公钥满世界发。Matter 用的是 ECDSA(椭圆曲线数字签名算法),曲线是 NIST P-256(也叫 secp256r1)。
| 特性 | 对称加密(AES-CCM) | 非对称加密(ECDSA) |
|---|---|---|
| 密钥数量 | 1 个共享密钥 | 1 对密钥(私钥 + 公钥) |
| 主要用途 | 批量数据加密 | 身份认证、密钥交换 |
| 速度 | 快(硬件加速常见) | 慢(比 AES 慢 100-1000 倍) |
| Matter 场景 | 日常通信加密 | 设备配对、证书签名 |
ECDSA 在 Matter 里主要干两件事:
- 签名:用私钥给数据打个包,证明这数据是你发的
- 验签:用公钥验证签名,确认数据没被调包
我曾经遇到过一个坑:设备证书过期了,但 ECDSA 验签还是通过了。查了半天才发现,代码里没检查证书有效期。所以记住——ECDSA 只保证签名是真的,不保证证书是活的。
注意:Matter 要求所有 ECDSA 操作必须使用硬件安全模块(如 Secure Element)来存储私钥。私钥一旦泄露,设备身份就可以被伪造。别把私钥写在 Flash 里,那是给自己挖坑。
3. 哈希函数:SHA-256,数据的指纹
哈希函数,说白了就是给数据按个指纹。不管输入多大,输出固定 256 位(32 字节)。而且——你没法从指纹反推出原始数据。
SHA-256 在 Matter 里无处不在:
- 证书哈希:设备证书的指纹,用于快速查找和验证
- 消息摘要:配合 ECDSA 做签名,先哈希再签名,效率更高
- 密钥派生:作为 HKDF 的底层哈希函数
SHA-256 的核心性质:
- 单向性:给哈希值找原始数据,理论上不可能(暴力破解除外)
- 抗碰撞性:找不到两个不同输入有相同哈希值(目前安全)
- 雪崩效应:输入改一个 bit,输出一半以上的 bit 都会变
我习惯在调试时用 SHA-256 做数据完整性检查。比如 OTA 升级包下载完,先算个哈希跟服务器给的对比——不一样?那肯定传输出问题了,别刷。
4. 密钥派生:HKDF,从主密钥到会话密钥
设备配对时协商出一个主密钥,但不能直接用。为什么?你想想看,如果所有通信都用同一个密钥,一旦泄露,历史数据全完蛋。
HKDF(HMAC-based Key Derivation Function) 就是干这个的——从一个输入密钥材料(IKM)派生出多个安全密钥。Matter 用的是 HKDF-SHA-256。
HKDF 分两步:
- 提取(Extract):把输入的密钥材料(可能不够随机)变成固定长度的伪随机密钥(PRK)
- 扩展(Expand):从 PRK 派生出任意长度的子密钥
// HKDF 提取阶段
PRK = HMAC-SHA256(salt, IKM)
// HKDF 扩展阶段
T(0) = ""
T(1) = HMAC-SHA256(PRK, T(0) || info || 0x01)
T(2) = HMAC-SHA256(PRK, T(1) || info || 0x02)
...
OKM = T(1) || T(2) || ... // 输出密钥材料
实战经验:Matter 的会话密钥派生流程:主密钥(来自 PAKE 或证书交换)→ HKDF Extract → 中间密钥 → HKDF Expand(带不同的 info 标签)→ 加密密钥、完整性密钥、IV 等。info 参数一定要区分用途,比如 "MatterEncKey" 和 "MatterMacKey" 不能混用。
我曾经见过一个实现,HKDF 的 salt 参数用了固定值。结果就是——只要主密钥相同,派生出来的密钥就一样。这跟直接用主密钥有啥区别?salt 必须随机,每次会话都不同。
四块基石怎么配合?
咱们用 Matter 设备配对的场景串一遍:
- 设备发现:广播自己的公钥(ECDSA 公钥)
- 身份验证:用 ECDSA 签名验证对方是不是合法设备
- 密钥协商:通过 PAKE(基于密码的密钥交换)生成主密钥
- 密钥派生:HKDF 从主密钥派生出会话密钥
- 安全通信:AES-CCM 加密所有后续消息,SHA-256 保证完整性
一句话总结:ECDSA 解决「你是谁」,HKDF 解决「用什么密钥」,AES-CCM 解决「怎么加密」,SHA-256 解决「数据对不对」。四者缺一不可。
好了,这四块基石咱们就聊到这儿。下一块要搭的是 Matter 的证书体系——说白了就是怎么给每个设备发一张「身份证」。不过那是后面的事了,先把今天的内容消化掉。