2. 密码学基础回顾:哈希函数、数字签名、公钥基础设施(PKI)、证书链

远程证明这东西,说白了就是一场「你是谁?你说了什么?我凭什么信你?」的密码学对话。没有扎实的密码学底子,后面讲协议细节你肯定听得云里雾里。这一章咱们把四个核心工具过一遍——哈希、签名、PKI、证书链。我尽量用我踩过的坑帮你把概念焊死。

2.1 哈希函数:数据的「指纹」

哈希函数,你想想看,就是把任意长度的输入,压缩成一个固定长度的摘要。这个摘要就像人的指纹——理论上唯一,而且从指纹推不出人的长相。

一个合格的哈希函数,必须满足三个性质:

  • 抗原像性:给定 y,找不到 x 使得 H(x) = y。说白了就是不可逆。
  • 抗第二原像性:给定 x,找不到 x' ≠ x 使得 H(x) = H(x')。防止伪造。
  • 抗碰撞性:找不到任意两个不同的 x 和 x' 使得哈希值相等。

我在项目中遇到过一件事:有人用 SHA-1 做固件完整性校验,结果被碰撞攻击搞了。嗯,SHA-1 现在已经不推荐了。远程证明里,主流用的是 SHA-256 或 SHA-384。

远程证明中的典型用法:证明方把「证据」哈希一下,签名发给验证方。验证方重新计算哈希,比对签名里的摘要。这样既保证完整性,又避免传输原始数据。

2.2 数字签名:防抵赖的「电子印章」

数字签名不是加密。加密是为了保密,签名是为了认证和防抵赖。我刚开始学的时候也搞混过,后来被导师骂了一顿才记住。

签名流程很简单:

  1. 发送方用私钥对消息的哈希值加密(签名)。
  2. 接收方用发送方的公钥解密,比对哈希值。

这里有个关键点:私钥必须保密。一旦私钥泄露,签名就废了。我曾经帮一个客户做安全审计,发现他们把私钥硬编码在代码里……嗯,那场面,我至今难忘。

避坑指南:我曾经在项目中用 RSA-1024 做签名,后来发现 NIST 已经建议至少 2048 位了。远程证明里,ECDSA 比 RSA 更常见,因为密钥短、性能好。推荐 P-256 曲线。

2.3 公钥基础设施(PKI):信任的「身份证系统」

光有签名还不够——你怎么知道那个公钥是谁的?PKI 就是解决这个问题的。它像国家的身份证系统:CA(证书颁发机构)负责发证,RA(注册机构)负责审核身份。

PKI 的核心组件:

组件 作用 我见过的坑
CA 签发和吊销证书 CA 私钥泄露,整个信任链崩塌
RA 验证申请者身份 RA 审核不严,给伪造者发了证书
证书库 存储和分发证书 证书库被篡改,验证方拿到假证书
CRL/OCSP 证书吊销状态查询 OCSP 响应不及时,用了已吊销的证书

远程证明里,PKI 的作用是建立信任锚。验证方只需要信任一个根 CA,就能通过证书链验证任意证明方的身份。

2.4 证书链:信任的「传递链条」

证书链,说白了就是一层一层往上追溯,直到你信任的那个根证书。我画个图帮你理解:

证书链信任传递结构图 根 CA(自签名) 中间 CA 终端证书(证明方) 签发 签发 验证流程:验证方拿到终端证书 → 用中间 CA 公钥验签 → 拿到中间 CA 证书 → 用根 CA 公钥验签 → 信任根 CA 只要根 CA 可信,整条链上的证书都可信。这就是信任传递。

验证方拿到终端证书后,会做三件事:

  1. 验证签名:用上一级证书的公钥,验证当前证书的签名是否有效。
  2. 检查有效期:证书有没有过期?
  3. 检查吊销状态:证书有没有被吊销?

注意:证书链不是越长越好。链越长,验证开销越大,出问题的环节也越多。我见过一个客户,证书链有 7 层,结果中间 CA 过期了,整条链全废。建议控制在 3 层以内:根 CA → 中间 CA → 终端证书。

2.5 远程证明中的密码学组合拳

好了,四个工具都讲完了。在远程证明里,它们是怎么配合的?我举个例子:

假设设备 A 要向验证方 B 证明自己运行的是可信固件:

  1. A 计算固件哈希值(哈希函数)。
  2. A 用私钥对哈希值签名(数字签名)。
  3. A 把签名、固件版本、证书链一起发给 B。
  4. B 用 PKI 验证证书链,拿到 A 的公钥。
  5. B 用公钥验签,比对哈希值。

你看,四个工具缺一不可。哈希保证完整性,签名保证真实性,PKI 保证公钥归属,证书链保证信任传递。

个人经验:我在做 TPM 远程证明时,发现很多开发者只关注签名算法,忽略了证书链的验证。结果攻击者伪造了一个自签名证书,验证方没检查证书链就通过了。记住:签名再强,证书链不验也是白搭。

这一章的内容就到这里。密码学是远程证明的基石,后面讲具体协议时,你会反复看到这四个工具的身影。建议你把它们的关系理清楚,尤其是证书链的信任传递逻辑——这是最容易出 bug 的地方。