3、密码学基础(上):对称加密(AES)、非对称加密(RSA/ECC)、哈希函数(SHA-256)原理
做边缘网关身份认证,绕不开密码学。说白了,密码学就是整个安全体系的「地基」。地基不稳,上面盖再多东西都是白搭。
我个人习惯把密码学工具分成三类:对称加密、非对称加密和哈希函数。这三兄弟各司其职,在网关认证流程里缺一不可。今天咱们先把原理讲透,下节课再聊怎么在边缘设备上落地。
核心观点:边缘网关资源受限,选对密码算法比单纯堆砌安全措施更重要。选错了,要么跑不动,要么有漏洞。
3.1 对称加密:AES 是怎么工作的?
对称加密,就是加密和解密用同一把钥匙。你想想看,就像你用一把锁锁门,也用同一把钥匙开门。优点是快,缺点是钥匙怎么安全地交给对方是个大问题。
在边缘网关场景里,AES(Advanced Encryption Standard)是绝对的主流。我做过一个项目,网关和云端之间传输固件升级包,用的就是 AES-256-GCM 模式。为什么选它?因为 GCM 模式自带认证标签,能同时保证机密性和完整性,省掉一个额外的 HMAC 计算。
AES 的核心操作
AES 不是简单地把明文和密钥异或一下完事。它内部有一套复杂的「置换-代换」网络。我尽量用大白话说:
- 字节代换(SubBytes): 把每个字节通过一个固定的 S 盒替换成另一个字节。这个 S 盒是精心设计的,能抵抗各种数学攻击。
- 行移位(ShiftRows): 把状态矩阵的每一行向左循环移位。目的是让列之间产生扩散。
- 列混合(MixColumns): 对每一列进行数学变换。这一步是 AES 安全性的关键,把单个字节的变化扩散到整列。
- 轮密钥加(AddRoundKey): 把当前状态和本轮的子密钥异或。子密钥是从主密钥通过密钥扩展算法生成的。
嗯,这里要注意:AES-128 做 10 轮,AES-192 做 12 轮,AES-256 做 14 轮。轮数越多,安全余量越大,但计算开销也越大。在边缘网关上,我一般推荐 AES-128,除非有合规要求必须用 256。
实战建议: 在嵌入式设备上,尽量使用硬件 AES 加速器。如果 CPU 没有 AES 指令集(比如一些老旧的 Cortex-M3),纯软件实现 AES 会非常慢,这时候可以考虑用 ChaCha20 替代。
AES 工作模式对比
光有 AES 核心算法还不够,还得选工作模式。不同的模式适用于不同的场景。我整理了一个表格,方便你对比:
| 模式 | 是否需要 IV | 并行性 | 错误传播 | 典型场景 |
|---|---|---|---|---|
| ECB | 否 | 高 | 无 | 绝对不要用(相同明文块产生相同密文块) |
| CBC | 是 | 低(加密不可并行) | 一个错误影响两个块 | 文件加密、旧系统兼容 |
| CTR | 是 | 高 | 无 | 流式数据、高速传输 |
| GCM | 是 | 高 | 无(带认证标签) | 边缘网关首选(加密+认证一体) |
避坑指南: 我曾经在一个项目中看到有人用 ECB 模式加密网关的配置数据。结果因为配置项大多是固定的,密文里出现了明显的重复模式,攻击者一眼就能看出哪些配置项是相同的。从那以后,我见到 ECB 就直接打回。
3.2 非对称加密:RSA 和 ECC 的取舍
非对称加密解决了对称加密的密钥分发难题。它有一对密钥:公钥公开,私钥自己藏好。公钥加密的数据只能用私钥解密,反过来私钥签名可以用公钥验证。
在边缘网关里,非对称加密主要用于两个地方:身份认证(数字签名)和密钥协商(交换对称密钥)。
RSA:老牌劲旅
RSA 的安全性基于大整数分解的困难性。给你两个大素数 p 和 q,乘起来得到 n 很容易;但给你 n,要分解出 p 和 q 就难了。
RSA 的优点是成熟、稳定,几乎所有密码库都支持。缺点是密钥越长,加解密越慢。1024 位的 RSA 现在已经不安全了,至少要用 2048 位。2048 位的 RSA 签名在边缘设备上大概需要几十毫秒,对于实时性要求高的场景可能扛不住。
ECC:后起之秀
ECC(椭圆曲线密码学)的安全性基于椭圆曲线离散对数问题。同样的安全强度下,ECC 的密钥长度比 RSA 短得多。举个例子:
- RSA 2048 位 ≈ ECC 224 位
- RSA 3072 位 ≈ ECC 256 位
- RSA 7680 位 ≈ ECC 384 位
密钥短意味着计算快、存储小、带宽省。这对边缘网关来说太重要了。我个人习惯在新项目里优先用 ECC,特别是 ECDSA 签名和 ECDH 密钥交换。
关键对比: 在 Cortex-M4 上,ECC 256 位的签名速度比 RSA 2048 位快 5-10 倍,而密钥只占 1/8 的空间。你说选哪个?
RSA vs ECC 选型指南
| 维度 | RSA | ECC |
|---|---|---|
| 安全基础 | 大整数分解 | 椭圆曲线离散对数 |
| 密钥长度(等效安全) | 2048 位 | 256 位 |
| 签名速度 | 慢 | 快 |
| 验证速度 | 快 | 慢(但仍在可接受范围) |
| 密钥生成 | 慢 | 快 |
| 兼容性 | 极好(所有平台都支持) | 好(现代平台都支持) |
| 推荐场景 | 兼容旧系统、CA 证书 | 边缘设备、IoT、移动端 |
我的经验: 如果网关需要和云端做双向认证,我建议用 ECC 做设备端密钥,云端保留 RSA 证书。这样设备端计算量小,云端验证也快。这叫「混合架构」,很多商业方案都这么干。
3.3 哈希函数:SHA-256 的不可逆性
哈希函数不是加密。它没有密钥,也不可逆。你给它任意长度的输入,它给你一个固定长度的输出(摘要)。而且,哪怕输入只改一个比特,输出也会面目全非。
在边缘网关里,哈希函数主要用来:
- 完整性校验: 检查固件有没有被篡改
- 密码存储: 不存明文密码,只存哈希值
- 数字签名: 先对消息哈希,再对哈希值签名
- 消息认证码(HMAC): 结合密钥做消息认证
SHA-256 的内部结构
SHA-256 属于 SHA-2 家族,输出 256 位(32 字节)的摘要。它的内部结构是 Merkle-Damgård 架构:
- 填充: 把消息填充到 512 位的整数倍,填充规则包括末尾加 1 和长度信息。
- 分块: 把填充后的消息分成 512 位(64 字节)的块。
- 迭代压缩: 每个块通过一个压缩函数处理,压缩函数内部有 64 轮循环,每轮用不同的常数和逻辑函数。
- 输出: 最后一个块处理完,8 个 32 位的状态寄存器拼接成 256 位的摘要。
你可能会问:「为什么 SHA-256 这么安全?」原因在于它的压缩函数设计——逻辑函数(Ch、Maj、Σ 等)是非线性的,而且每轮都引入了不同的常数,使得从摘要反推输入在计算上不可行。
避坑指南: 我曾经见过有人用 MD5 做固件完整性校验。MD5 已经被破解了,可以人为构造碰撞。攻击者可以替换固件,同时伪造一个相同的 MD5 值。现在至少要用 SHA-256,如果合规要求高,可以考虑 SHA-3。
3.4 知识体系总览
为了让你对这三类密码学工具有个整体认识,我画了一张图。你可以看到它们在边缘网关身份认证中的位置和关系:
3.5 实战中的组合拳
单独看每个算法都很简单,但真正做项目时,你得把它们组合起来。我举个例子:
假设网关要和云端建立安全连接。典型的流程是:
- 身份认证: 网关用 ECDSA 签名一个挑战值,云端用网关的公钥验证签名。这证明了网关确实是它声称的那个设备。
- 密钥协商: 双方用 ECDH 交换临时密钥,生成一个共享的对称密钥。
- 会话加密: 用 AES-128-GCM 加密后续的所有通信数据,同时用 GCM 的认证标签保证完整性。
- 完整性校验: 在传输固件或配置时,先用 SHA-256 计算哈希值,再对哈希值签名。接收方验证签名后,再计算本地哈希值对比。
你看,对称加密、非对称加密、哈希函数,一个都没少。它们各司其职,谁也替代不了谁。
总结一句话: 对称加密管速度,非对称加密管身份,哈希函数管完整性。三剑合璧,才能撑起边缘网关的安全防线。