2、密码学基础(上):对称加密与非对称加密、哈希函数、数字签名原理
说实话,很多做嵌入式固件的兄弟,一听到「密码学」三个字就头大。我当年也一样,总觉得这是数学博士才该碰的东西。直到有一次,我在一个 IoT 项目里,因为签名校验写得过于敷衍,被客户抓了个正着……嗯,从那以后,我老老实实把这几块基础啃透了。
这一章,咱们不扯虚的。我就带你过一遍安全启动里最核心的四个概念:对称加密、非对称加密、哈希函数、数字签名。你不需要成为密码学家,但得知道它们各自解决什么问题、怎么配合、以及——哪些坑我替你踩过了。
2.1 对称加密:快,但钥匙怎么给?
对称加密,说白了就是加密和解密用同一把钥匙。就像你家里的大门,用一把钥匙锁上,也用同一把钥匙打开。
它的优点是快。硬件加速下,AES-128 加解密一个 16 字节块,也就几个时钟周期。所以在 UEFI 里,像 BIOS 镜像的某些敏感区域(比如变量存储),会用对称加密来保护机密性。
- AES(Advanced Encryption Standard)—— 目前最主流,128/192/256 位密钥
- DES/3DES —— 太老了,别用了
- SM4 —— 国密标准,国内项目常见
但问题来了:钥匙怎么安全地分发给对方? 你想想看,如果我把 AES 密钥通过明文网络发给设备,那中间人截获了,加密还有什么意义?
2.2 非对称加密:公钥随便给,私钥藏好
非对称加密解决了钥匙分发的问题。它用一对钥匙:公钥(Public Key)和私钥(Private Key)。公钥可以公开,私钥只有你自己知道。
它的核心逻辑是:
公钥加密,私钥解密 —— 用于加密通信。
私钥签名,公钥验签 —— 用于身份认证和完整性校验。
在安全启动里,我们主要用后者。设备出厂时烧入公钥,固件发布时用私钥签名。启动时,设备用公钥验签,确认固件是官方发布的、没被篡改过。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个(共享密钥) | 2 个(公钥 + 私钥) |
| 速度 | 快(硬件加速) | 慢(数学运算复杂) |
| 典型算法 | AES, SM4 | RSA, ECC, SM2 |
| 主要用途 | 数据加密 | 密钥交换、数字签名 |
| 密钥分发难度 | 高 | 低(公钥可公开) |
2.3 哈希函数:指纹,不可逆
哈希函数,你可以把它理解成给数据算一个「指纹」。不管输入多大,输出固定长度(比如 SHA-256 输出 32 字节)。而且,哪怕只改一个比特,指纹就完全变了。
哈希函数有三个关键特性:
- 单向性:从哈希值无法反推出原始数据。
- 抗碰撞性:几乎不可能找到两个不同数据,哈希值相同。
- 固定输出长度:无论输入是 1 字节还是 1 GB,输出长度不变。
在安全启动里,哈希函数用来校验固件完整性。比如,我先算好固件的哈希值,然后签名时签的是这个哈希值,而不是整个固件。验签时,先算当前固件的哈希,再验签名。这样既快又安全。
- SHA-256 —— 目前最推荐,256 位输出
- SHA-1 —— 已不安全,别用了
- MD5 —— 早就被攻破了,千万别用
- SM3 —— 国密哈希标准,256 位输出
2.4 数字签名:谁签的?改过没?
数字签名,就是把哈希函数和非对称加密结合起来,解决两个问题:
- 身份认证:这个固件到底是不是官方发布的?
- 完整性校验:固件有没有被篡改过?
流程很简单:
- 签名方:对固件算哈希 → 用私钥加密哈希 → 得到签名 → 把固件和签名一起发布。
- 验签方:收到固件和签名 → 对固件算哈希 → 用公钥解密签名得到原始哈希 → 对比两个哈希是否一致。
如果一致,说明固件确实是私钥持有者签发的,且内容没被改过。
下面这张图,把整个流程串起来了:
2.5 小结:它们怎么配合?
这一章的知识点,在安全启动里是这样配合的:
- 哈希函数:给固件算指纹,保证完整性。
- 数字签名:用私钥加密哈希值,保证身份认证和防篡改。
- 非对称加密:提供公钥/私钥体系,让验签可以在公开环境下进行。
- 对称加密:在需要保护数据机密性时(比如加密存储的变量),用 AES 快速加密。