公钥基础设施(PKI)基础:对称加密与非对称加密、数字签名与哈希函数、CA与证书链

聊物联网安全,绕不开 PKI。说白了,PKI 就是一套让设备之间能互相信任的规则和工具集。我做了这么多年物联网安全,见过太多因为 PKI 没搭好导致设备被批量仿冒的案例。嗯,这一节我们就把 PKI 的几块基石掰开揉碎了讲清楚。

对称加密与非对称加密

加密这事儿,本质上就是给数据上锁。锁有两种:一种是一把钥匙开一把锁,另一种是两把钥匙配合开锁。

对称加密:快,但钥匙怎么给?

对称加密,加密和解密用同一把密钥。就像你家大门,用同一把钥匙锁门和开门。优点是快,非常快。我在项目中用 AES-128 给传感器数据做加密,一个几百 KB 的报文,毫秒级就处理完了。

算法 密钥长度 典型场景
AES 128 / 192 / 256 bit 设备数据加密、TLS 传输
SM4 128 bit 国密合规场景
ChaCha20 256 bit 低功耗设备、嵌入式环境
注意:对称加密最大的坑是密钥分发。你想想看,如果每个设备出厂时都烧录同一个密钥,那一个设备被破解,整个网络就裸奔了。我曾经遇到一个客户,所有智能灯泡都用同一个 AES 密钥,结果被第三方直接控制了整个楼宇的照明系统。

非对称加密:慢,但安全多了

非对称加密,有一对密钥:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有对应的私钥能解开。反过来,用私钥签名的数据,公钥可以验证。

常见的算法有 RSA 和 ECC。我个人更倾向 ECC,尤其是在物联网设备上。为什么?因为 ECC 在同等安全强度下,密钥更短,计算更快。

算法 密钥长度(等效 RSA 2048) 签名速度 推荐场景
RSA 2048 bit 较慢 服务端、网关
ECC (P-256) 256 bit 快 嵌入式设备、IoT 终端
SM2 256 bit 快 国密合规场景
我的经验:在资源受限的 MCU 上,ECC 签名比 RSA 快 5-10 倍。但要注意,ECC 的曲线参数必须选对,别用那些不标准的曲线,否则容易出安全漏洞。

哈希函数与数字签名

哈希函数,就是把任意长度的数据,压缩成一个固定长度的「指纹」。这个指纹是唯一的,哪怕原文改了一个 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 再给设备签发证书。这就形成了证书链。

验证的时候,从设备证书开始,逐级往上验证,直到根证书。根证书是预埋在设备或系统里的,我们叫它「信任锚」。

避坑指南:我曾经遇到一个项目,设备只验证了服务器证书,没验证证书链。结果攻击者用自签证书就骗过了设备。记住,一定要验证整条链,直到信任锚。

下面这张图展示了证书链的信任传递关系:

证书链信任传递模型 根 CA 自签名证书 二级 CA 由根 CA 签发 设备证书 由二级 CA 签发 信任传递方向: 根 CA → 二级 CA → 设备证书。验证时反向:从设备证书逐级验证到根 CA。

PKI 在物联网中的落地要点

理论说完了,聊聊实际落地。物联网 PKI 和传统 IT 的 PKI 有几点不同:

  • 设备数量大:动辄几十万、上百万的设备,证书签发和管理必须自动化。手动操作不现实。
  • 设备生命周期长:有些设备部署后要跑 5-10 年,证书过期前必须能远程更新。
  • 资源受限:很多设备只有几百 KB 的 RAM,跑不了完整的 TLS 握手。这时候可以用 ECC 曲线、精简的证书格式(如 CBOR 编码的证书)。
  • 离线场景:有些设备部署在偏远地区,没有网络。这时候需要预置证书链,或者用离线签名机制。
我的建议:设计 PKI 体系时,一定要把证书更新流程考虑进去。我见过太多项目,设备出厂时烧录了证书,结果三年后证书过期,设备直接变砖。远程更新证书的能力,从一开始就要设计好。