密码学基础(上):哈希函数、数字签名与PKI

各位同学,欢迎来到《安全启动从零开始学》的第二讲。今天我们要聊的,是整个安全启动体系的基石——密码学。说白了,没有这些数学工具,你电脑上的安全启动就是个摆设。

我个人习惯把密码学比作一把锁。哈希函数是这把锁的指纹识别器,数字签名是锁芯里的弹子,而PKI就是管理所有钥匙的保安系统。咱们一个一个来看。

哈希函数:数据的“指纹”

哈希函数,你想想看,它干的事其实很简单:给你任意长度的数据,它都能算出一个固定长度的摘要。这个摘要,就是数据的“指纹”。

为什么叫指纹?因为好的哈希函数有这几个特性:

  • 单向性:从摘要反推原始数据,几乎不可能。我见过有人想暴力破解SHA-256,算到宇宙毁灭都算不完。
  • 抗碰撞性:很难找到两个不同的输入,算出相同的摘要。嗯,这里要注意,理论上碰撞一定存在,但找到它的计算代价高得离谱。
  • 雪崩效应:输入改一个比特,输出就面目全非。

在安全启动里,哈希函数主要用来做两件事:校验固件完整性,以及给数字签名“打底”。

核心要点:安全启动中,每次上电都会计算下一级固件的哈希值,与签名中携带的哈希值比对。不一致?直接拒绝启动。

目前业界最常用的哈希算法是SHA-256。它输出256比特,也就是32字节。我在项目中遇到过有人想用MD5做固件校验,被我当场拦下——MD5的碰撞攻击早在2004年就被公开了,用它的安全启动等于没锁门。

SHA-256 计算示例

下面是一个简单的Python示例,演示如何计算一段数据的SHA-256哈希值:

import hashlib

# 待校验的固件数据(实际场景中可能是二进制文件)
firmware_data = b"SecureBootFirmware_v1.0"

# 计算SHA-256哈希
hash_obj = hashlib.sha256()
hash_obj.update(firmware_data)
digest = hash_obj.hexdigest()

print(f"固件哈希值: {digest}")
# 输出示例: 3a7c...(32字节的十六进制表示)

小提示:实际工程中,计算固件哈希时通常会把整个固件镜像读入内存,分块更新哈希对象。不要一次性加载超大文件,容易撑爆内存。

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

哈希函数只能保证数据没被改过,但没法证明是谁签的。这时候就需要数字签名登场了。

数字签名基于非对称加密。说白了,就是一对钥匙:私钥签名,公钥验签。私钥只有你一个人有,公钥可以公开给全世界。

签名过程是这样的:

  1. 对固件计算哈希值。
  2. 用私钥对这个哈希值加密,得到签名。
  3. 把签名和固件一起发布。

验签过程反过来:

  1. 用公钥解密签名,得到原始哈希值。
  2. 重新计算固件的哈希值。
  3. 两个哈希值比对,一致则签名有效。

目前主流的两类签名算法是RSA和ECDSA。我整理了一个对比表,方便你理解它们的差异:

特性 RSA ECDSA
数学基础 大整数分解 椭圆曲线离散对数
密钥长度 2048/4096位 256/384位
签名速度 较慢 较快
验签速度 较快 较慢
典型应用 UEFI Secure Boot 嵌入式安全启动

避坑指南:我曾经在项目中遇到一个坑——RSA的密钥长度选错了。当时为了省存储空间,用了1024位的RSA密钥。结果产品上市前被安全审计发现,1024位RSA已被认为不安全,不得不紧急换芯片。记住:RSA至少2048位,ECDSA至少256位。

公钥基础设施(PKI):信任的链条

有了数字签名,你还需要回答一个问题:我怎么知道手里的公钥是可信的?

这就是PKI要解决的问题。PKI不是某个算法,而是一整套管理公钥的体系。它包含:

  • 证书颁发机构(CA):负责签发数字证书的权威机构。
  • 数字证书:把公钥和身份信息绑定在一起,由CA签名。
  • 证书链:从根CA到中间CA,再到最终实体证书,形成一条信任链。

在安全启动里,PKI的典型用法是这样的:

  1. 设备出厂时,烧录根CA的公钥到一次性可编程存储器(OTP)里。
  2. 固件签名时,使用中间CA签发的代码签名证书。
  3. 设备启动时,用OTP里的根公钥验证中间CA证书,再用中间CA公钥验证固件签名。

这样做的好处是:即使某个中间CA的私钥泄露,只需要吊销那张中间证书,根CA不受影响。整个体系还能继续运转。

关键设计原则:根CA私钥必须离线保存,最好放在硬件安全模块(HSM)里。我见过有人把根私钥放在开发电脑上,结果被勒索病毒一锅端——那场面,惨不忍睹。

知识体系总览

为了让你更直观地理解这三者之间的关系,我画了一张图:

密码学基础核心概念关系图 密码学基础核心概念关系图 哈希函数 SHA-256 数字签名 RSA / ECDSA 公钥基础设施 PKI 提供摘要 管理公钥 安全启动应用场景 三者协同工作流程 ① 哈希函数计算固件摘要 ② 数字签名对摘要签名,保证来源可信 ③ PKI 管理签名所用的公钥证书链 实现固件完整性 + 来源认证

这张图把今天讲的三个概念串起来了。哈希函数提供数据完整性保证,数字签名提供来源认证,PKI解决公钥信任问题。三者缺一不可。

小结

今天的内容是安全启动的数学基础。哈希函数保证固件没被篡改,数字签名保证固件来自可信方,PKI保证公钥本身可信。这三层叠加起来,才构成了安全启动的第一道防线。

嗯,这里要提醒一句:密码学工具本身是安全的,但实现细节里全是坑。密钥怎么存储?签名算法参数怎么选?证书链怎么验证?这些工程问题,我们后面的章节会逐一拆解。