2、密码学基础回顾:对称加密与非对称加密、哈希函数与消息认证码、数字签名与证书体系
聊远程证明,绕不开密码学。这不是在背公式,而是理解IoT设备之间怎么互相信任。我做了这么多年安全,见过太多项目因为密码选型翻车——选错了算法,性能扛不住;用错了模式,安全形同虚设。这一节我们快速过一遍核心概念,重点放在IoT场景下怎么选、怎么用。
2.1 对称加密:快,但密钥怎么分?
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,两个人通信,手里得有相同的密钥才能加解密。优点是快,特别快。在资源受限的IoT设备上,比如传感器、智能锁,对称加密几乎是唯一可行的选择。
常用的对称算法有AES、SM4。AES-128在安全性和性能之间平衡得最好,我个人习惯在项目里优先选它。模式上,IoT场景我建议用GCM(Galois/Counter Mode),它同时提供加密和完整性校验,一步到位。
我在一个智能门锁项目里遇到过这个问题:设备端用AES-ECB模式加密指令,结果攻击者通过重放攻击直接开了门。嗯,ECB模式不能隐藏明文模式,千万别用在IoT里。
| 算法 | 密钥长度 | IoT适用性 | 推荐模式 |
|---|---|---|---|
| AES | 128 / 192 / 256 bit | 高(硬件加速常见) | GCM / CCM |
| SM4 | 128 bit | 中(国密标准) | GCM |
| ChaCha20 | 256 bit | 高(无硬件加速时更快) | Poly1305 |
2.2 非对称加密:慢,但能解决信任问题
非对称加密有一对密钥:公钥公开,私钥自己藏好。公钥加密的数据只有私钥能解,反过来私钥签名的东西公钥能验。这解决了对称加密的密钥分发难题——你不需要提前商量密钥,直接把公钥扔出去就行。
但代价是慢。RSA-2048在低端MCU上做一次签名可能要几百毫秒,这在实时性要求高的场景里根本扛不住。所以我建议IoT设备优先用椭圆曲线密码学(ECC),比如ECDSA或SM2。同样的安全强度,ECC的密钥更短、计算更快。
我曾经在一个固件升级项目里踩过坑:用RSA-2048做签名验证,结果设备启动时间从2秒拖到了15秒。后来换成ECDSA P-256,启动时间降到3秒以内。选对算法,体验天差地别。
2.3 哈希函数与消息认证码
哈希函数把任意长度的数据压缩成固定长度的摘要。它不可逆,而且输入稍微改一点,输出就面目全非。在远程证明里,哈希用来做数据完整性校验——比如验证固件有没有被篡改。
常用的哈希算法有SHA-256、SM3。SHA-256在IoT里够用,SM3是国密标准,国内项目必须用。注意,MD5和SHA-1已经不安全了,别再用。
消息认证码(MAC)是哈希的升级版——它加了一把密钥。只有持有相同密钥的双方才能验证MAC是否正确。这能防止攻击者伪造数据。HMAC是最常见的实现,比如HMAC-SHA256。
2.4 数字签名与证书体系
数字签名是非对称加密的典型应用。私钥签名,公钥验签。它能提供三个保证:数据没被改过(完整性)、确实是某人签的(真实性)、签名者不能抵赖(不可否认性)。
在IoT远程证明里,设备用私钥对“证据”签名,验证方用设备的公钥验签。但问题来了——你怎么确认这把公钥确实是这个设备的?这就需要证书体系(PKI)。
证书说白了就是一张数字身份证。CA(证书颁发机构)用自己的私钥给设备的公钥签名,生成证书。验证方只要信任CA,就能通过证书链信任设备。X.509是最常用的证书标准,IoT场景里常用的是精简版,去掉不必要的字段以节省空间。
- 设备向CA申请证书,CA验证设备身份后签发。
- 设备在远程证明时,发送自己的证书和签名数据。
- 验证方用CA的公钥验证设备证书,再用证书里的公钥验证签名。
- 如果都通过,证明设备是可信的。
我个人习惯在IoT项目里用自建CA,而不是依赖公共CA。公共CA的证书通常很贵,而且IoT设备数量巨大,自建CA更灵活、成本更低。但要注意保护好CA的私钥——一旦泄露,整个信任体系就崩了。
2.5 知识体系总览
下面这张图把本章的核心概念串起来了。你可以看到对称加密、非对称加密、哈希、MAC、数字签名和证书体系之间的关系,以及它们在远程证明中的位置。
2.6 小结:IoT场景下的选型建议
这一节内容不少,但核心就一句话:没有万能密码学方案,只有适合场景的选型。我根据经验整理了几个原则:
- 设备资源极有限(如8位MCU、几KB内存):优先用对称加密+MAC,密钥预置在设备中。非对称操作尽量委托给网关或云端。
- 设备有一定算力(如ARM Cortex-M系列):用ECDSA做签名,AES-GCM做数据加密。证书用精简X.509。
- 需要国密合规:SM2+SM3+SM4组合,注意SM2签名性能比ECDSA略慢,提前做压力测试。
- 密钥管理:永远不要在代码里硬编码密钥。用安全元件(SE)或可信执行环境(TEE)存储私钥。