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 数字签名:防抵赖的「电子印章」
数字签名不是加密。加密是为了保密,签名是为了认证和防抵赖。我刚开始学的时候也搞混过,后来被导师骂了一顿才记住。
签名流程很简单:
- 发送方用私钥对消息的哈希值加密(签名)。
- 接收方用发送方的公钥解密,比对哈希值。
这里有个关键点:私钥必须保密。一旦私钥泄露,签名就废了。我曾经帮一个客户做安全审计,发现他们把私钥硬编码在代码里……嗯,那场面,我至今难忘。
避坑指南:我曾经在项目中用 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 证书链:信任的「传递链条」
证书链,说白了就是一层一层往上追溯,直到你信任的那个根证书。我画个图帮你理解:
验证方拿到终端证书后,会做三件事:
- 验证签名:用上一级证书的公钥,验证当前证书的签名是否有效。
- 检查有效期:证书有没有过期?
- 检查吊销状态:证书有没有被吊销?
注意:证书链不是越长越好。链越长,验证开销越大,出问题的环节也越多。我见过一个客户,证书链有 7 层,结果中间 CA 过期了,整条链全废。建议控制在 3 层以内:根 CA → 中间 CA → 终端证书。
2.5 远程证明中的密码学组合拳
好了,四个工具都讲完了。在远程证明里,它们是怎么配合的?我举个例子:
假设设备 A 要向验证方 B 证明自己运行的是可信固件:
- A 计算固件哈希值(哈希函数)。
- A 用私钥对哈希值签名(数字签名)。
- A 把签名、固件版本、证书链一起发给 B。
- B 用 PKI 验证证书链,拿到 A 的公钥。
- B 用公钥验签,比对哈希值。
你看,四个工具缺一不可。哈希保证完整性,签名保证真实性,PKI 保证公钥归属,证书链保证信任传递。
个人经验:我在做 TPM 远程证明时,发现很多开发者只关注签名算法,忽略了证书链的验证。结果攻击者伪造了一个自签名证书,验证方没检查证书链就通过了。记住:签名再强,证书链不验也是白搭。
这一章的内容就到这里。密码学是远程证明的基石,后面讲具体协议时,你会反复看到这四个工具的身影。建议你把它们的关系理清楚,尤其是证书链的信任传递逻辑——这是最容易出 bug 的地方。