公钥基础设施(PKI)基础:对称加密与非对称加密、数字签名与哈希函数、CA与证书链
聊物联网安全,绕不开 PKI。说白了,PKI 就是一套让设备之间能互相信任的规则和工具集。我做了这么多年物联网安全,见过太多因为 PKI 没搭好导致设备被批量仿冒的案例。嗯,这一节我们就把 PKI 的几块基石掰开揉碎了讲清楚。
对称加密与非对称加密
加密这事儿,本质上就是给数据上锁。锁有两种:一种是一把钥匙开一把锁,另一种是两把钥匙配合开锁。
对称加密:快,但钥匙怎么给?
对称加密,加密和解密用同一把密钥。就像你家大门,用同一把钥匙锁门和开门。优点是快,非常快。我在项目中用 AES-128 给传感器数据做加密,一个几百 KB 的报文,毫秒级就处理完了。
| 算法 | 密钥长度 | 典型场景 |
|---|---|---|
| AES | 128 / 192 / 256 bit | 设备数据加密、TLS 传输 |
| SM4 | 128 bit | 国密合规场景 |
| ChaCha20 | 256 bit | 低功耗设备、嵌入式环境 |
非对称加密:慢,但安全多了
非对称加密,有一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开。反过来,用私钥签名的数据,公钥可以验证。
常见的算法有 RSA 和 ECC。我个人更倾向 ECC,尤其是在物联网设备上。为什么?因为 ECC 在同等安全强度下,密钥更短,计算更快。
| 算法 | 密钥长度(等效 RSA 2048) | 签名速度 | 推荐场景 |
|---|---|---|---|
| RSA | 2048 bit | 较慢 | 服务端、网关 |
| ECC (P-256) | 256 bit | 快 | 嵌入式设备、IoT 终端 |
| SM2 | 256 bit | 快 | 国密合规场景 |
哈希函数与数字签名
哈希函数,就是把任意长度的数据,压缩成一个固定长度的「指纹」。这个指纹是唯一的,哪怕原文改了一个 bit,指纹都会完全变样。
数字签名,就是先用哈希函数算出数据的指纹,然后用私钥对这个指纹加密。别人拿到数据后,用你的公钥解密指纹,再自己算一遍哈希,比对一下就知道数据有没有被篡改。
常用的哈希算法有 SHA-256、SM3。SHA-1 已经不安全了,别再用。我在一个项目中见过设备还在用 MD5 做固件校验,结果被中间人轻松替换了固件包。
// 伪代码:数字签名流程
// 发送方
hash = SHA256(message)
signature = RSA_Encrypt(hash, privateKey)
send(message + signature)
// 接收方
hash1 = SHA256(message)
hash2 = RSA_Decrypt(signature, publicKey)
if hash1 == hash2:
print("数据完整,身份可信")
else:
print("数据被篡改或来源不可信")
CA 与证书链
公钥是公开的,但你怎么确定这个公钥真的是某个设备的?这就是 CA(证书颁发机构)的活。
CA 给设备签发一个数字证书,证书里包含设备的公钥、身份信息、有效期,还有 CA 自己的签名。你拿到证书,用 CA 的公钥验证一下签名,就知道这个证书是真的。
证书链:信任的传递
CA 也有层级。根 CA 自签自己,它是信任的起点。根 CA 给二级 CA 签发证书,二级 CA 再给设备签发证书。这就形成了证书链。
验证的时候,从设备证书开始,逐级往上验证,直到根证书。根证书是预埋在设备或系统里的,我们叫它「信任锚」。
下面这张图展示了证书链的信任传递关系:
PKI 在物联网中的落地要点
理论说完了,聊聊实际落地。物联网 PKI 和传统 IT 的 PKI 有几点不同:
- 设备数量大:动辄几十万、上百万的设备,证书签发和管理必须自动化。手动操作不现实。
- 设备生命周期长:有些设备部署后要跑 5-10 年,证书过期前必须能远程更新。
- 资源受限:很多设备只有几百 KB 的 RAM,跑不了完整的 TLS 握手。这时候可以用 ECC 曲线、精简的证书格式(如 CBOR 编码的证书)。
- 离线场景:有些设备部署在偏远地区,没有网络。这时候需要预置证书链,或者用离线签名机制。