密码学基础(上):对称加密与非对称加密的区别,哈希函数的特性
各位同学,咱们今天聊聊密码学基础。说实话,很多搞固件开发的朋友一听到「密码学」三个字就头大,觉得那是数学家的活儿。其实不然。你只要搞懂三个核心概念——对称加密、非对称加密、哈希函数——就能应付 90% 的固件签名场景。
我刚开始做嵌入式安全那会儿,也踩过不少坑。有一次把 AES 密钥硬编码在固件里,结果被客户的安全审计抓个正着……嗯,从那以后我再也不敢小看密码学基础了。
1. 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一个密钥。就像你家的门锁,用同一把钥匙锁门和开门。
常见的对称加密算法有:
- AES(Advanced Encryption Standard)—— 目前最主流,密钥长度 128/192/256 位
- DES(Data Encryption Standard)—— 太老了,密钥只有 56 位,别用了
- SM4 —— 国标算法,国内项目常见
核心特点:
- 加密速度快,适合大数据量
- 密钥管理是短板 —— 密钥怎么安全地传给对方?
- 密钥分发问题:如果密钥在传输中被截获,整个加密就废了
我在一个 IoT 项目里遇到过这种情况:设备和服务端用 AES 通信,密钥是出厂时预置的。结果有一批设备的密钥被逆向工程读出来了……你想想看,所有设备都得召回升级。这就是对称加密的痛点。
2. 非对称加密:公钥私钥,各司其职
非对称加密就聪明多了。它有一对密钥:公钥可以公开,私钥自己藏好。公钥加密的数据只能用私钥解密,反过来私钥签名的数据可以用公钥验证。
常见算法:
- RSA —— 经典,但密钥越长越慢(2048 位起步)
- ECC(椭圆曲线)—— 更短的密钥达到同等安全强度,适合嵌入式
- SM2 —— 国标椭圆曲线算法
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥 + 私钥) |
| 加密速度 | 快(硬件加速常见) | 慢(比对称慢 100-1000 倍) |
| 密钥分发 | 困难 | 公钥随便发 |
| 典型用途 | 数据加密 | 密钥交换、数字签名 |
| 嵌入式适用性 | 非常适合 | 需要权衡性能 |
我的建议:实际项目中,通常用非对称加密来传递对称密钥,然后用对称加密来加密实际数据。这叫「混合加密」,既安全又高效。
3. 哈希函数:数据的「指纹」
哈希函数不是加密,它没有密钥。它的作用是把任意长度的数据,压缩成固定长度的摘要(digest)。
特性就三条:
- 单向性:从哈希值推不出原始数据。你想想看,如果能反推,那密码存储就全完蛋了。
- 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值。
- 雪崩效应:输入改一个比特,输出完全变样。
常见算法:
- SHA-256 —— 目前最安全,输出 256 位,固件签名标配
- SHA-1 —— 有碰撞攻击风险,别用了
- MD5 —— 已经不安全,128 位太短
- SM3 —— 国标哈希算法,输出 256 位
避坑指南:我曾经在一个项目中看到有人用 MD5 做固件完整性校验。结果被攻击者伪造了固件,因为 MD5 的碰撞攻击已经非常成熟。记住:固件签名场景,至少用 SHA-256。
4. 三者关系:一张图看懂
下面这张图展示了对称加密、非对称加密和哈希函数在固件签名流程中的位置。你看,它们各司其职,缺一不可。
5. 实际项目中的选择建议
我个人习惯这样选型:
- 固件签名:用 ECC(比如 NIST P-256)或 SM2,配合 SHA-256 或 SM3
- 固件加密传输:用 AES-128-GCM,密钥通过 ECC 密钥交换协商
- 固件完整性校验:只用哈希,比如启动时校验 bootloader 的 SHA-256 值
小技巧:在资源受限的 MCU 上,ECC 比 RSA 快得多。我做过对比:同样的安全强度,ECC 签名速度是 RSA 的 3-5 倍,而且密钥小一半。所以嵌入式场景,优先考虑 ECC。
6. 本章小结
记住三句话:
- 对称加密快,但密钥分发麻烦
- 非对称加密解决了密钥分发问题,但慢
- 哈希函数不是加密,它是数据的「指纹」,用来防篡改