3、密码学基础(上):对称加密与非对称加密,哈希函数与消息认证码
各位好,我是你们的嵌入式安全讲师。今天咱们聊聊密码学基础,这是安全启动和固件升级的「地基」。说实话,我见过太多工程师在加密算法上栽跟头——不是选错了算法,就是密钥管理一塌糊涂。咱们今天就把这块硬骨头啃下来。
3.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门钥匙——锁门和开门用的是同一把。
我在项目中遇到过最典型的场景:固件镜像在工厂烧录时,用AES-128加密,设备启动时再用同样的密钥解密。简单直接,效率也高。
- 算法代表:AES(高级加密标准)、DES(已淘汰)、SM4(国密标准)
- 密钥长度:AES支持128/192/256位,我建议至少用128位
- 工作模式:ECB(不推荐)、CBC(常用)、CTR(适合流式)、GCM(带认证)
嗯,这里要注意:ECB模式千万别用。为什么?同样的明文块会生成同样的密文块,攻击者能看出规律。我曾经在一个IoT项目里看到有人用ECB模式加密传感器数据,结果攻击者通过分析密文模式直接还原了设备状态——这跟没加密有啥区别?
// AES-128 CBC模式加密示例(伪代码)
uint8_t key[16] = {0x2b, 0x7e, 0x15, 0x16, ...};
uint8_t iv[16] = {0x00, 0x01, 0x02, 0x03, ...}; // 初始化向量
aes_cbc_encrypt(plaintext, plaintext_len, key, iv, ciphertext);
// 注意:每次加密应使用随机IV,不要固定
3.2 非对称加密:公钥私钥,各司其职
非对称加密就更有意思了——加密和解密用不同的钥匙。一把公钥公开,一把私钥自己藏着。你想想看,这就像个带锁的邮箱:谁都能往里面投信(用公钥加密),但只有你有钥匙能打开(用私钥解密)。
在安全启动里,非对称加密主要干两件事:
- 数字签名:用私钥签名固件,设备用公钥验证。确保固件来源可信。
- 密钥交换:用公钥加密对称密钥,设备用私钥解密。解决密钥分发难题。
| 算法 | 密钥长度 | 安全强度 | 性能 | 典型应用 |
|---|---|---|---|---|
| RSA | 2048/4096位 | 高 | 慢(尤其签名) | 数字签名、密钥传输 |
| ECC | 256/384位 | 高(同等强度密钥更短) | 快 | 嵌入式安全启动 |
| SM2 | 256位 | 高(国密标准) | 快 | 国内合规场景 |
我个人习惯在嵌入式设备上用ECC。为什么?256位的ECC和3072位的RSA安全强度相当,但密钥体积小、计算快。你想想看,MCU那点可怜的算力,跑一次RSA-4096签名验证可能要几百毫秒,而ECC-256只要几十毫秒——这在启动时间上差别太大了。
3.3 哈希函数:数据的「指纹」
哈希函数,说白了就是把任意长度的数据,压缩成固定长度的摘要。就像每个人的指纹——数据不同,哈希值就不同;数据相同,哈希值一定相同。
在固件升级里,哈希函数主要用来:
- 完整性校验:计算固件的哈希值,和官方发布的对比,看有没有被篡改
- 数字签名的预处理:先对固件哈希,再对哈希值签名,效率更高
- 密码存储:存储密码的哈希值,而不是明文(这个咱们后面细聊)
- MD5:128位输出,已破解,别用了
- SHA-1:160位输出,理论上已不安全,建议淘汰
- SHA-256:256位输出,目前最推荐
- SM3:256位输出,国密标准,国内项目必选
// SHA-256哈希计算示例
uint8_t firmware_data[] = {0x00, 0x01, 0x02, ...};
uint8_t hash[32]; // SHA-256输出32字节
sha256_calculate(firmware_data, sizeof(firmware_data), hash);
// 将hash与官方发布的哈希值比对
嗯,这里有个关键点:哈希函数是单向的。你从哈希值无法反推出原始数据。这特性在安全启动里特别重要——攻击者即使拿到了固件的哈希值,也无法伪造出另一个能生成相同哈希值的恶意固件。
3.4 消息认证码:防篡改的「封条」
消息认证码(MAC),你可以把它想象成快递的封条。封条没坏,说明包裹没被打开过。MAC没通过,说明数据被篡改了。
MAC和哈希的区别在哪?哈希只防「无意的损坏」,MAC防「恶意的篡改」。为什么?因为MAC需要密钥——只有知道密钥的人才能生成正确的MAC值。
- HMAC:基于哈希的MAC,如HMAC-SHA256。最通用,推荐使用
- CMAC:基于分组密码的MAC,如AES-CMAC。硬件加速友好
- GMAC:GCM模式下的认证标签,效率高
// HMAC-SHA256计算示例
uint8_t key[32] = {0x2b, 0x7e, 0x15, ...}; // MAC密钥
uint8_t data[] = {0x00, 0x01, 0x02, ...};
uint8_t mac[32]; // HMAC输出32字节
hmac_sha256(key, sizeof(key), data, sizeof(data), mac);
// 将mac与接收到的MAC值比对
我曾经在一个车联网项目里遇到个坑:有人直接用哈希值做完整性校验,没加MAC。结果攻击者截获了固件包,篡改内容后重新计算哈希值,设备完全检测不出来。后来改成HMAC,密钥存储在安全芯片里,问题才解决。
3.5 知识体系总览
说了这么多,咱们用一张图把今天的内容串起来。这张图我画了好几次才满意,它清晰地展示了密码学基础在安全启动中的位置和作用。
这张图把今天的内容都串起来了。你看,对称加密和非对称加密是「加密」的两条腿,哈希函数是「校验」的基石,消息认证码是「防篡改」的保障。在安全启动里,它们各司其职,缺一不可。
好了,今天的内容就到这儿。密码学基础是安全启动的「内功心法」,练好了后面学起来就轻松了。下一节咱们聊聊这些算法在实际固件升级中怎么落地——密钥怎么生成、怎么存储、怎么轮换,这些都是实战中的硬骨头。
可可精品资料库