密码学基础(上):对称加密与非对称加密、哈希函数与数字签名、公钥基础设施(PKI)概念

说实话,很多做UEFI开发的兄弟,一听到「密码学」三个字就头大。我当年也一样,觉得这是数学系的事,跟我一个搞固件的有什么关系?直到我第一次接触Secure Boot的签名验证流程,才发现——不懂密码学,你连BIOS里那几行配置都看不懂。

这一章,咱们就把UEFI安全启动依赖的密码学基础捋一遍。不推公式,不讲玄学,只讲你在实际开发中必须搞明白的那些概念。

2.1 对称加密:简单粗暴,但有个大麻烦

对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用同一个密钥。

你想想看,A要给B发一条消息,先用密钥K加密,B收到后用同样的密钥K解密。这个过程很快,硬件实现也简单。UEFI里的某些变量存储、TPM通信,底层用的就是对称加密。

常见对称加密算法:
  • AES(Advanced Encryption Standard)—— 目前最主流,UEFI Secure Boot的签名数据包有时也会用到AES-CBC做辅助加密
  • DES/3DES —— 太老了,别用了,我在一个遗留项目里见过还在用DES的,性能差还不安全
  • SM4 —— 国密标准,国内UEFI方案里越来越常见

但对称加密有个致命问题:密钥怎么安全地传给对方?如果你和对方之间还没有建立安全通道,那第一次传输密钥的过程本身就是个死循环。这就是所谓的「密钥分发问题」。

我的经验: 在UEFI的早期启动阶段,系统还没加载网络驱动,你没法用TLS去协商密钥。所以对称加密在固件里通常只用于本地数据保护,比如加密存储的变量。跨设备通信?得靠非对称加密。

2.2 非对称加密:公钥公开,私钥藏好

非对称加密的思路就巧妙多了。它用一对密钥:公钥(Public Key)和私钥(Private Key)。公钥可以公开给任何人,私钥只有你自己知道。

公钥加密的数据,只能用私钥解密。反过来,私钥签名的数据,可以用公钥验证。这两个方向,构成了UEFI Secure Boot的底层逻辑。

操作 使用密钥 典型场景
加密 公钥加密,私钥解密 传输对称密钥、固件更新包加密
签名 私钥签名,公钥验证 UEFI Secure Boot的签名验证

常用的非对称算法有RSA(最常见,UEFI Secure Boot默认支持)、ECC(椭圆曲线,密钥更短,效率更高)、SM2(国密)。

注意: 非对称加密虽然解决了密钥分发问题,但速度比对称加密慢好几个数量级。所以实际应用中,通常是用非对称加密来传输一个临时对称密钥,然后用对称加密来加密实际数据。这叫「混合加密」,HTTPS就是这么干的。

2.3 哈希函数:数据指纹,不可逆

哈希函数,你可以把它理解成给数据打一个「指纹」。不管输入多大,输出都是固定长度。而且,从哈希值几乎不可能反推出原始数据。

UEFI Secure Boot里,哈希函数用来做两件事:

  • 完整性校验:验证固件镜像有没有被篡改
  • 数字签名的前置步骤:先对镜像算哈希,再对哈希值签名(而不是直接签名整个镜像)
UEFI里常见的哈希算法:
  • SHA-256 —— 目前最常用,Secure Boot默认要求
  • SHA-1 —— 已不推荐,我在一个旧平台上见过SHA-1的签名,被安全审计直接打回
  • SHA-384 / SHA-512 —— 更高安全等级,但计算开销大
  • SM3 —— 国密哈希标准

这里有个关键点:哈希碰撞。两个不同的数据算出同一个哈希值,就叫碰撞。理论上存在,但好的哈希算法(比如SHA-256)让碰撞在计算上不可行。我曾经在测试中故意修改一个UEFI驱动的二进制文件,只要改一个字节,哈希值就完全变了——这就是哈希的「雪崩效应」。

2.4 数字签名:用私钥给哈希值盖章

数字签名,本质上就是「用私钥加密数据的哈希值」。验证方用公钥解密签名,得到原始哈希值,再跟自己算出来的哈希值对比。一致,说明数据没被改过,而且确实是私钥持有者签的。

UEFI Secure Boot的签名验证流程,说白了就是三步:

  1. 计算待加载镜像的哈希值(比如SHA-256)
  2. 用公钥解密镜像附带的签名,得到原始哈希值
  3. 对比两个哈希值,一致则通过,不一致则拒绝加载
避坑指南: 我曾经在调试一个Secure Boot失败的问题时,发现签名验证总是失败。查了两天,最后发现是签名算法不匹配——镜像用的是RSA-PSS,而固件里只实现了RSA-PKCS1v1.5。UEFI规范其实支持多种签名方案,但不同厂商的实现可能只支持子集。所以,签名前一定要确认目标平台的算法支持列表。

2.5 公钥基础设施(PKI):信任链的骨架

有了公钥、私钥、签名,还缺一个东西:你怎么知道某个公钥确实是某个厂商的?这就是PKI要解决的问题。

PKI的核心是「证书」和「证书链」。一个证书,就是把公钥和身份信息绑定在一起,并由一个可信的第三方(CA,证书颁发机构)签名。

UEFI Secure Boot的PKI结构是这样的:

  • 根证书(Platform Key, PK):由平台厂商(比如微软、OEM)内置在固件中,是整个信任链的起点
  • 中间证书(Key Exchange Key, KEK):由根证书签名,用于授权签名数据库的更新
  • 签名数据库(db / dbx):存放允许或禁止加载的签名/证书

你想想看,如果没有PKI,任何人都可以声称自己是Intel,然后签一个恶意驱动。有了PKI,系统只信任由根证书链验证过的签名。

重要: 根证书一旦被攻破,整个信任链就完了。所以UEFI规范要求PK必须存储在防篡改的硬件中(比如TPM或一次性写入的fuse)。我在一个项目中见过把PK放在SPI Flash里,结果被攻击者直接物理替换——那之后,我们改用了eFuse方案。

2.6 知识体系总览

下面这张图,把这一章的核心概念串起来了。你可以看到,从哈希到签名,从对称到非对称,最后汇聚到PKI这个信任骨架。UEFI Secure Boot的每一环,都离不开这些基础。

密码学基础与UEFI Secure Boot关系图 对称加密 AES / SM4 非对称加密 RSA / ECC / SM2 哈希函数 SHA-256 / SM3 密钥分发 签名前置 数字签名 私钥签名 + 公钥验证 结合 公钥基础设施(PKI) 根证书 → 中间证书 → 签名数据库 PK → KEK → db/dbx 信任链 UEFI Secure Boot 镜像签名验证 → 加载/拒绝 策略执行 混合加密: 非对称传密钥 对称加密数据

2.7 小结:这些概念怎么串起来?

咱们用UEFI Secure Boot的实际场景,把这一章的知识点串一遍:

  1. OEM厂商用私钥对固件镜像的哈希值做数字签名
  2. 签名和镜像一起打包,发布给用户
  3. UEFI固件启动时,用公钥(来自PKI证书链)验证签名
  4. 验证通过,镜像被信任,加载执行
  5. 验证失败,拒绝加载,系统可能进入恢复模式

整个过程,对称加密没怎么出现——因为Secure Boot是「验证」而非「加密」场景。但如果你要做固件更新包的加密传输,对称加密就派上用场了。

我的建议: 刚开始接触这些概念时,别急着背算法参数。先搞清楚「谁信任谁」「谁签名谁」「谁验证谁」这个逻辑链条。我在带团队时,经常让新人先画一张信任关系图,画清楚了,代码怎么写自然就明白了。