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,不要固定
我的经验:嵌入式设备上,AES-128-CBC是最稳妥的选择。硬件加速器普遍支持,性能开销可控。如果芯片支持AES指令集(比如ARMv8的Cryptography Extensions),加解密速度能提升10倍以上。

3.2 非对称加密:公钥私钥,各司其职

非对称加密就更有意思了——加密和解密用不同的钥匙。一把公钥公开,一把私钥自己藏着。你想想看,这就像个带锁的邮箱:谁都能往里面投信(用公钥加密),但只有你有钥匙能打开(用私钥解密)。

在安全启动里,非对称加密主要干两件事:

  • 数字签名:用私钥签名固件,设备用公钥验证。确保固件来源可信。
  • 密钥交换:用公钥加密对称密钥,设备用私钥解密。解决密钥分发难题。
常见算法对比:
算法 密钥长度 安全强度 性能 典型应用
RSA 2048/4096位 高 慢(尤其签名) 数字签名、密钥传输
ECC 256/384位 高(同等强度密钥更短) 快 嵌入式安全启动
SM2 256位 高(国密标准) 快 国内合规场景

我个人习惯在嵌入式设备上用ECC。为什么?256位的ECC和3072位的RSA安全强度相当,但密钥体积小、计算快。你想想看,MCU那点可怜的算力,跑一次RSA-4096签名验证可能要几百毫秒,而ECC-256只要几十毫秒——这在启动时间上差别太大了。

避坑指南:我曾经在一个项目中看到有人把私钥直接硬编码在固件里。这简直是灾难!攻击者只要拿到固件,就能提取私钥,整个安全体系瞬间崩塌。记住:私钥必须存储在安全硬件中(如HSM、SE、TEE),绝不能出现在固件镜像里。

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与官方发布的哈希值比对

嗯,这里有个关键点:哈希函数是单向的。你从哈希值无法反推出原始数据。这特性在安全启动里特别重要——攻击者即使拿到了固件的哈希值,也无法伪造出另一个能生成相同哈希值的恶意固件。

我的经验:在固件升级中,我建议对固件进行「分块哈希」。比如每64KB计算一个哈希值,最后再对所有哈希值做一次整体哈希。这样设备在下载过程中就能边下载边校验,不用等整个固件下载完才发现有问题——这在OTA升级中能省不少时间。

3.4 消息认证码:防篡改的「封条」

消息认证码(MAC),你可以把它想象成快递的封条。封条没坏,说明包裹没被打开过。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,密钥存储在安全芯片里,问题才解决。

重要提醒:MAC和数字签名不是一回事。MAC是对称的——通信双方共享同一个密钥。数字签名是非对称的——私钥签名,公钥验证。在安全启动场景里,我建议用数字签名而不是MAC。为什么?因为MAC密钥必须同时存储在设备和服务器上,一旦设备被破解,密钥就泄露了。而数字签名只需要公钥在设备上,私钥在服务器上,设备被破解也不影响其他设备的安全。

3.5 知识体系总览

说了这么多,咱们用一张图把今天的内容串起来。这张图我画了好几次才满意,它清晰地展示了密码学基础在安全启动中的位置和作用。

密码学基础在安全启动中的角色 密码学基础 对称加密 非对称加密 哈希函数 消息认证码 AES / SM4 / DES(淘汰) ECB(不推荐) / CBC / CTR / GCM RSA / ECC / SM2 数字签名 / 密钥交换 MD5(破解) / SHA-1(淘汰) / SHA-256 / SM3 完整性校验 / 签名预处理 HMAC / CMAC / GMAC 防篡改 / 需密钥 安全启动 & 固件升级核心应用 对称加密:加密固件镜像,保证机密性 非对称加密:数字签名,保证完整性和真实性 哈希函数:快速校验数据完整性

这张图把今天的内容都串起来了。你看,对称加密和非对称加密是「加密」的两条腿,哈希函数是「校验」的基石,消息认证码是「防篡改」的保障。在安全启动里,它们各司其职,缺一不可。

好了,今天的内容就到这儿。密码学基础是安全启动的「内功心法」,练好了后面学起来就轻松了。下一节咱们聊聊这些算法在实际固件升级中怎么落地——密钥怎么生成、怎么存储、怎么轮换,这些都是实战中的硬骨头。

可可精品资料库