2、密码学基础(上):对称加密与非对称加密、哈希函数、数字签名原理

说实话,很多做嵌入式固件的兄弟,一听到「密码学」三个字就头大。我当年也一样,总觉得这是数学博士才该碰的东西。直到有一次,我在一个 IoT 项目里,因为签名校验写得过于敷衍,被客户抓了个正着……嗯,从那以后,我老老实实把这几块基础啃透了。

这一章,咱们不扯虚的。我就带你过一遍安全启动里最核心的四个概念:对称加密、非对称加密、哈希函数、数字签名。你不需要成为密码学家,但得知道它们各自解决什么问题、怎么配合、以及——哪些坑我替你踩过了。

2.1 对称加密:快,但钥匙怎么给?

对称加密,说白了就是加密和解密用同一把钥匙。就像你家里的大门,用一把钥匙锁上,也用同一把钥匙打开。

它的优点是快。硬件加速下,AES-128 加解密一个 16 字节块,也就几个时钟周期。所以在 UEFI 里,像 BIOS 镜像的某些敏感区域(比如变量存储),会用对称加密来保护机密性。

常见对称加密算法:
  • AES(Advanced Encryption Standard)—— 目前最主流,128/192/256 位密钥
  • DES/3DES —— 太老了,别用了
  • SM4 —— 国密标准,国内项目常见

但问题来了:钥匙怎么安全地分发给对方? 你想想看,如果我把 AES 密钥通过明文网络发给设备,那中间人截获了,加密还有什么意义?

我曾经踩过的坑: 在一个 Bootloader 升级方案里,我把 AES 密钥硬编码在固件里。结果攻击者通过读 Flash 直接拿到了密钥,整个加密形同虚设。记住:对称密钥的分发和管理,才是真正的难点。

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 位输出
我曾经踩过的坑: 有个项目用了 SHA-1 做固件完整性校验。当时觉得「够用就行」。结果后来发现,SHA-1 已经被学术界证明存在碰撞攻击。虽然实际攻击成本很高,但客户审计直接打了回来。从那以后,我所有新项目一律用 SHA-256 起步。

2.4 数字签名:谁签的?改过没?

数字签名,就是把哈希函数和非对称加密结合起来,解决两个问题:

  1. 身份认证:这个固件到底是不是官方发布的?
  2. 完整性校验:固件有没有被篡改过?

流程很简单:

  • 签名方:对固件算哈希 → 用私钥加密哈希 → 得到签名 → 把固件和签名一起发布。
  • 验签方:收到固件和签名 → 对固件算哈希 → 用公钥解密签名得到原始哈希 → 对比两个哈希是否一致。

如果一致,说明固件确实是私钥持有者签发的,且内容没被改过。

下面这张图,把整个流程串起来了:

数字签名与验签流程 原始固件 哈希函数 (SHA-256) 固件哈希值 私钥加密 数字签名 —— 验签方 —— 收到的固件 哈希函数 (SHA-256) 计算出的哈希值 对比:一致则通过
我建议: 在实际的 UEFI Secure Boot 实现里,签名对象通常是固件的哈希值,而不是固件本身。因为固件可能很大(几十 MB),非对称签名运算很慢。先哈希,再签名,是工程上的标准做法。

2.5 小结:它们怎么配合?

这一章的知识点,在安全启动里是这样配合的:

  • 哈希函数:给固件算指纹,保证完整性。
  • 数字签名:用私钥加密哈希值,保证身份认证和防篡改。
  • 非对称加密:提供公钥/私钥体系,让验签可以在公开环境下进行。
  • 对称加密:在需要保护数据机密性时(比如加密存储的变量),用 AES 快速加密。