4、身份认证基础:对称与非对称加密、数字签名、证书体系(X.509)、PKI架构
聊远程证明,绕不开身份认证。而身份认证的根基,就是今天我们要啃的这块硬骨头——密码学基础与PKI体系。
说实话,我早年刚做物联网安全时,觉得这些理论离工程很远。直到有一次,我在一个智能门锁项目里,因为证书链校验少配了一个中间CA,导致几千台设备批量离线。嗯,从那以后,我再也不敢小看这些“基础课”了。
4.1 对称加密 vs 非对称加密:两个世界
先搞清楚一个核心问题:加密到底分几种?
简单说,就两种——对称加密和非对称加密。你想想看,一个像“一把钥匙开一把锁”,另一个像“一把公锁配两把不同的钥匙”。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个(共享密钥) | 2个(公钥+私钥) |
| 典型算法 | AES、SM4、ChaCha20 | RSA、ECC、SM2 |
| 计算速度 | 快(硬件加速常见) | 慢(比对称慢100-1000倍) |
| 密钥分发 | 困难(需要安全通道) | 容易(公钥公开) |
| 典型用途 | 批量数据加密 | 密钥交换、数字签名 |
我在项目中见过不少团队,为了“省事”只用对称加密做设备认证。结果呢?密钥写死在固件里,被逆向出来,整个产品线都得召回。所以我的习惯是:对称加密管数据,非对称加密管身份。
核心原则:远程证明中,设备身份认证必须依赖非对称加密。对称加密只用于后续的会话保护。
4.2 数字签名:不是加密,是“盖章”
很多人把数字签名和加密搞混。我打个比方:加密是把信锁进保险箱,只有收信人能打开;签名是在信上盖个章,证明这信是你写的,而且没被篡改过。
数字签名的流程其实就两步:
- 签名(私钥操作):对消息摘要(Hash值)用私钥加密,生成签名。
- 验签(公钥操作):用公钥解密签名,比对摘要是否一致。
我曾经在一个车联网项目里,发现有的设备签名时没做“先Hash再签名”,而是直接对整条消息签名。结果消息一长,性能直接崩了。记住:签名签的是摘要,不是原文。
// 伪代码:签名与验签流程
// 签名端(设备)
digest = SHA256(message)
signature = RSA_private_encrypt(digest, private_key)
// 发送 message + signature
// 验签端(平台)
digest_received = SHA256(message)
digest_decrypted = RSA_public_decrypt(signature, public_key)
if digest_received == digest_decrypted:
print("签名验证通过,身份可信")
else:
print("签名无效,拒绝连接")
避坑指南:我曾经踩过一个坑——验签时忘了检查摘要算法是否匹配。设备用SHA256,平台默认用SHA1,结果验签永远失败。后来我养成了习惯:在证书或设备信息里显式声明摘要算法。
4.3 证书体系(X.509):身份的“身份证”
公钥本身只是一串字节,你怎么知道这个公钥属于谁?答案就是——证书。
X.509证书,说白了就是把公钥和身份信息绑在一起,再找个权威机构(CA)给你签个字。证书里最重要的几个字段:
- Subject(主体):证书持有者的身份,比如设备ID、组织名。
- Issuer(签发者):签发这张证书的CA。
- Validity(有效期):notBefore和notAfter,过期证书必须拒绝。
- Subject Public Key Info(公钥):核心资产。
- Signature(签名):CA对上述内容的签名,防篡改。
我记得有一次做固件升级验证,设备端只校验了证书的签名,没检查有效期。结果一个测试证书过期了还在线上跑,差点酿成安全事故。从那以后,我要求所有证书校验逻辑里,有效期检查必须排在第一优先级。
注意:物联网设备资源有限,X.509证书的解析和校验开销不小。我建议在设备端只保留必要的证书链(根CA+中间CA),不要加载整个证书库。
4.4 PKI架构:信任的“金字塔”
单张证书解决不了信任问题——你信任CA,但CA怎么来的?这就引出了PKI(公钥基础设施)。
PKI的核心是一个树形信任链:
- 根CA(Root CA):信任的锚点,自签名证书。离线保存,极其安全。
- 中间CA(Intermediate CA):由根CA签发,负责签发终端证书。可以有多级。
- 终端实体证书(End-Entity):设备、服务器、用户的证书。
验证时,从终端证书开始,逐级向上验证签名,直到信任的根CA。这就是证书链校验。
关键点:远程证明中,设备必须能提供完整的证书链(终端证书+中间CA证书),验证方才能完成信任传递。只发终端证书,验证方如果没有中间CA,信任链就断了。
下面这张图,是我在多个项目中反复使用的PKI信任链结构,你可以直观感受一下:
4.5 远程证明中的身份认证实战要点
理论讲完了,说点实际的。在远程证明场景里,身份认证不是简单验个签名就完事。我总结了几个必须注意的点:
- 证书吊销检查:证书可能被泄露或撤销。我建议设备端定期拉取CRL(证书吊销列表)或使用OCSP(在线证书状态协议)实时查询。不过OCSP在物联网里延迟较高,CRL更常见。
- 密钥安全存储:私钥必须防提取。我在智能家居项目里用过SE(安全元件)和TEE(可信执行环境),普通MCU至少要用KeyStore或安全Flash区域。千万别把私钥明文存文件系统里。
- 证书轮换:设备证书有有效期,过期前必须更新。我习惯在证书到期前30天触发轮换流程,避免批量设备同时过期导致服务中断。
- 轻量化考虑:物联网设备内存小,X.509证书解析库(如mbedTLS、WolfSSL)要选对版本。我踩过坑——用OpenSSL在Cortex-M0上跑,光证书解析就占了一半RAM。
我的习惯:在设备出厂时,预置根CA证书和唯一的设备证书(含私钥)。私钥在产线安全环境中注入,产线结束后销毁中间CA的私钥。这样即使产线被攻破,也拿不到签发新证书的能力。