TPM从零理解:保险箱里的密码世界

你的电脑里其实一直藏着一台”只进不出的保险箱电脑”——Windows 的 BitLocker、指纹登录全靠它,但你可能从没见过它干活。

📚 基本概念速读

名称 定义 省流
TPM Trusted Platform Module,可信平台模块 密钥永不出芯片的保险箱
TCG Trusted Computing Group,可信计算组织 制定 TPM 规范的标准组织
PCR Platform Configuration Register,平台配置寄存器 只能追加不能写的系统指纹
EK Endorsement Key,背书密钥 TPM 出厂身份证明
AIK Attestation Identity Key,认证身份密钥 给系统状态签名用的匿名密钥
SRK Storage Root Key,存储根密钥 密钥树的根,锁在芯片里
blob Binary Large Object,二进制大对象 被父密钥加密的密钥文件
sealing 密封 密钥和系统状态绑定
NVRAM Non-Volatile RAM,非易失存储器 掉电不丢的芯片内存储
dTPM/fTPM/vTPM 独立芯片/固件/虚拟机实现的 TPM 三种 TPM 实现形态
TSS TCG Software Stack,TCG 软件栈 应用程序访问 TPM 的接口库

🏦 TPM 是什么:一台”只进不出”的保险箱电脑

TPM(Trusted Platform Module,可信平台模块) 是一颗独立的密码协处理器芯片,焊在主板上(PCIe/SPI 总线连接)。它干的事:给你提供基于硬件的密钥存储和加密运算,密钥永远锁在芯片里,谁也拷不走。

把 TPM 想象成一台迷你专用电脑,它有两个门:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌─────────────────────────────┐
│ TPM(迷你电脑) │
│ │
│ ① 输入口(命令接口) │
│ · 给它数据算哈希 │
│ · 让它签名/加密/解密 │
│ · 让它生成密钥 │
│ · 让它扩展 PCR │
│ │
│ ② 保险柜(内部存储) │
│ · PCR 值(系统指纹) │
│ · 密钥(永远不出来) │
│ · NVRAM 数据 │
│ │
│ 它没有显示器、没有键盘 │
│ 你不能"登录进去看",只能 │
│ 通过命令指挥它干活 │
└─────────────────────────────┘

最重要的一条规矩:密钥一旦生成就锁在保险柜里,任何软件都拿不到密钥本身。你只能让它”用这把钥匙帮我签名”——它签完把结果给你,钥匙还在柜子里。

TPM 是行业标准(TCG 定义,ISO/IEC 11889),Windows 11 强制要求,几乎所有新主板都带。

🧬 TPM 的三大核心能力

① 度量(Measurement):PCR 与”只进不出”

平台启动时,逐级”测量并记录”:

1
2
3
4
5
6
平台启动时逐级测量:
固件 → 引导程序 → 内核 → ...
每级算出哈希,PCR_Extend 进 PCR


PCR 新值 = SHA256( PCR旧值 || 新测量值 ) ← || 是拼接,不是按位或

PCR(Platform Configuration Register,平台配置寄存器) 只有两个特性:

特性 含义
只能 Extend(追加) 没有”直接写”这个命令,固件层就不存在该接口
开机清零 每次启动重新累计,从零开始

所以 PCR 里的值 = 这台机器”从开机到现在装了什么”的不可篡改指纹。想伪装成”没装过恶意软件”?改不了——你加载过的任何恶意代码必然出现在 Extend 链里。

为什么只能 Extend?因为 PCR 的意义是”不可抵赖的系统指纹”。如果能直接写,恶意软件就能把 PCR 直接写成”干净的值”。Extend 用哈希链保证历史不可抹除:账本只能往后加页,不能撕掉前面的页。

② 存储(Sealing,密封):钥匙和状态绑定

1
2
3
4
5
6
seal(key, PCR值集合)  →  这把钥匙只在一个特定状态下才能 unseal

TPM 内部有密钥层级:
SRK(存储根密钥)→ 保护下面的所有子密钥
子密钥 → 保护应用的密钥
像一棵树,根在芯片里,枝叶在外面(磁盘上)

这就是”钥匙锁进保险箱,保险箱的门锁绑定系统状态”——系统被篡改(PCR 不对),unseal 直接失败。

sealing 的本质价值:密钥和”系统状态(PCR)“绑定。就算攻击者偷走了整个硬盘/内存里的密文,只要这台机器的状态不是当初密封时的状态(或他把东西搬去别的机器),密钥就永远解不开。 把”密码保护”升级成”状态保护”。

③ 认证(Attestation):AIK 与 Quote

密钥 全称 作用
EK Endorsement Key,背书密钥 出厂烧进芯片的身份密钥,证明”我是真 TPM”
AIK Attestation Identity Key,认证身份密钥 由 EK 背书派生,专用于给”系统状态”签名(匿名)
SRK Storage Root Key,存储根密钥 密钥树根节点,保护所有子密钥

Quote 操作TPM_Quote(AIK, PCR选择) → 返回”当前 PCR 值 + AIK 签名”。

远程认证的经典玩法:验证方给个随机数 nonce → 被验证方 TPM 对”PCR + nonce”签名 → 验证方核对签名和 PCR 是否符合预期。nonce 防重放,签名保证真实。

💻 TPM 是硬件还是软件?

TPM 是一个”逻辑规范”,实现方式有多种。 TPM 2.0 规范(TCG 定的)定义”这台设备应该提供什么命令、什么语义”,实现形态看厂商:

实现 形态 安全强度 例子
dTPM 独立芯片焊主板 ⭐⭐⭐ 最高 多数台式机/服务器主板
fTPM CPU 固件里跑的软件实现 ⭐⭐ AMD 的 fTPM 在 PSP 里执行
vTPM 虚拟机里的软件模拟 云上每个 VM 一个 vTPM
模拟器 纯软件测试用 Microsoft ms-tpm-20-ref

fTPM 的坑:faultPM 研究用电压故障注入物理攻击,成功干扰 fTPM 计算并提取了保护密钥。这也是机密计算里做 CTPM(机密 TPM) 的动机之一。

🏛 TCG 是啥?

TCG(Trusted Computing Group,可信计算组织) 是一个国际标准组织(成员包括 AMD、Intel、Microsoft、IBM 等),负责制定 TPM 的规范。类比:TCG 是”国标委”,TPM 2.0 规范是它发布的标准,各家芯片厂(英飞凌、国民技术等)按标准造芯片。TCG 还定义了 TSS(TCG Software Stack)——应用程序访问 TPM 的统一接口库。

🛠 用户怎么访问 TPM

1
2
3
4
5
6
7
用户 → TSS 软件栈(tpm2-tools 等)→ TPM 芯片

tpm2_pcrread 读 PCR
tpm2_createkey 生成密钥
tpm2_sign 用密钥签名
tpm2_quote 做远程认证
tpm2_nvwrite 写 NVRAM(需要授权)

命令行示例(Linux 上可跑):

1
2
3
tpm2_pcrread sha256:0          # 读 PCR 0 的值
tpm2_createprimary -c owner.ctx # 在 Owner 层级下创建主密钥
tpm2_quote -c aik.ctx -l sha256:0,1 -m quote.bin -s sig.bin # 做认证

🖥 你其实已经在用 TPM:三个日常场景

场景 A:BitLocker(磁盘加密)——用 TPM 保管磁盘密钥

1
2
3
4
5
6
① 启用 BitLocker,系统让 TPM 生成/存入"磁盘加密密钥"
② 开机时:
系统问 TPM:"当前 PCR 值是多少?符合预期吗?"
TPM 比对 → 符合 → 释放密钥 → 系统解密磁盘
→ 不符合(换了引导程序、有人改启动项)
→ 拒绝释放 → 屏幕让你插恢复 U 盘

防的是”有人拆走你的硬盘去别的机器上读”——硬盘到哪都解不开。

场景 B:Windows Hello / 指纹登录

1
2
3
① 注册时,系统让 TPM 生成一对密钥,私钥锁进 TPM
② 登录时,指纹匹配成功后系统让 TPM 用私钥签名
验证通过 → 放你进系统

私钥永远不会出现在内存/磁盘里,偷走 Windows 文件也偷不走密钥。

场景 C:远程认证

1
2
3
4
① 别人(验证方)发来一个随机数 nonce
② 你的 TPM 用 AIK 签名 (当前PCR值, nonce)
③ 对方验证签名 → 确认"这台机器的 PCR 确实是这个值"
④ 对方对照"干净机器的预期 PCR 表" → 通过则可信

注意 PCR 值来自 TPM 自己的保险柜,不是软件报告的——软件想谎报 PCR?它没有权限写 PCR。

🔑 blob 与两层加密

blob = Binary Large Object(二进制大对象),在 TPM 语境里特指”被父密钥加密后的密钥对象文件”:

1
2
3
4
5
6
7
8
磁盘上的一个密钥文件(比如 keyA.bin):
┌──────────────────────────────┐
│ 头部(元数据:密钥类型、属性) │
│ 密钥材料(用父密钥加密后的密文) │
│ 认证信息、策略等 │
└──────────────────────────────┘

这整个文件就叫"密钥 blob"

blob 是密文,没有芯片里父密钥的参与,磁盘上的 blob 什么都干不了。blob 可以放任何地方:磁盘、NVRAM、网络传输——都安全。使用时:加载 blob → TPM 内部用父密钥解开 → 密钥在芯片内就位 → 干活

TPM 体系里加密分两层,别混:

1
2
3
4
5
6
第 1 层(密钥层):父密钥加密 → 子密钥材料   → 产物 = 密钥 blob(密钥本身)
第 2 层(数据层):子密钥加密 → 数据 → 产物 = 数据密文(你的文件)

磁盘上最终看到两个文件:
key.bin ← 密钥 blob(里面是"被 SRK 加密过的 AES 密钥材料")
data.enc ← 数据密文(里面是"被 AES 密钥加密过的文件内容")

类比三层套娃:保险箱(SRK,永远在芯片内)→ 钥匙盒(blob,里面是加密的 AES 密钥材料)→ 信(数据,用这把钥匙加密)。blob 保护”钥匙不泄露”,数据密文保护”内容不泄露”,各管一层。

🧅 密钥树与 NVRAM:容器和结构的关系

TPM 密钥体系是”洋葱式”的,绝大多数密钥根本不在 TPM 芯片里

1
2
3
芯片内(NVRAM/内部):SRK、EK、种子(根节点)
芯片外(磁盘/文件): 所有子密钥 = "用父密钥加密的 blob"
↓ 要用时,blob 装进 TPM,父密钥在芯片内解开

存外面也不怕:没有芯片里的父密钥,磁盘上的 blob 就是一堆密文

NVRAM 里有什么?不都是密钥:

内容 说明
EK 证书 出厂身份证明
平台种子(如 EPSeed) 所有密钥的”源头”
部分 PCR 备份 视实现而定
计数器 防回滚的单调计数器
平台策略/授权数据 使用策略
少量核心密钥 SRK、AIK 等(不是全部!)

NVRAM 和密钥树的关系——一个是”存储空间”,一个是”逻辑层级”:

概念 本质 角色
密钥树 父密钥加密子密钥的逻辑结构 家谱
NVRAM 芯片内掉电不丢的存储区 保险柜里的抽屉

密钥树的(SRK/种子)必须呆在芯片内;枝叶(blob)可以放 NVRAM,也可以放外部磁盘(更常见)。一句话:密钥树是”家谱”,NVRAM 是”保险柜里的抽屉”;重要的东西锁在抽屉里,其余的放在外面的保险箱(加密磁盘)里也一样安全。

🎬 完整例子:用 TPM 加密一个文件(6 步)

场景:把 存折密码.txt 加密,要求”只有这台机器、且系统没被动过手脚时才能解开”。

Step 1:芯片初始化(出厂时发生,不是你做的)

1
2
TPM 芯片出厂:内部生成 EK + 平台种子
→ 这些是"根",永远锁在芯片里

Step 2:启动度量(每次开机自动发生)

1
2
3
开机 → UEFI 固件 → 引导程序 → 内核
每一级启动时被"度量":算出哈希 → Extend 进 PCR
开机完成后:PCR = [0x3A2F..., 0x8C11..., ...](不可篡改的系统指纹)

Step 3:创建你的加密密钥

1
2
3
4
5
6
7
8
9
你执行:tpm2_create ...(系统帮你调用 TPM)

TPM 芯片内部:
· 用根密钥 SRK 派生/保护一个新密钥(AES 密钥)
· 把新密钥的"材料"用 SRK 加密
· 把加密结果吐出来给你


磁盘上多了一个文件:mykey.bin ← 这就是 blob

⚠️ AES 密钥本身从未离开过芯片。你拿到的是”被 SRK 锁住的密钥”(blob),不是密钥。

Step 4:加密文件

1
2
3
4
5
6
7
① 让 TPM 加载 mykey.bin → 芯片内部用 SRK 解开 → AES 密钥就位(在芯片内)
② 把文件内容喂给 TPM,TPM 在内部用 AES 密钥加密
③ 吐出密文 → 写入 存折密码.txt.enc

磁盘上现在有:
mykey.bin (加密的密钥材料)
存折密码.txt.enc (加密的数据)

Step 5:解密(下次要用时)

1
2
① 加载 mykey.bin → TPM 解开 → AES 密钥就位
② TPM 用 AES 密钥解密密文 → 吐出明文

Step 6:加一道 sealing(TPM 的灵魂功能)

1
2
3
4
5
6
7
8
创建密钥时指定:只有 PCR 值 == [0x3A2F..., ...] 时才能解开
→ 密钥和"这台机器此刻的状态"绑死

攻击场景演示:
① 小偷把磁盘拆走,装到自己机器上
→ 他那台机器的 PCR ≠ 你的 PCR → TPM 拒绝解开 ✅
② 有人改了你的开机项/内核(植入恶意软件)
→ PCR 变了 → TPM 拒绝解开 → 敏感文件宁可打不开也不泄露 ✅

TPM 的工作模式一句话:秘密(密钥)永远在芯片里;你永远只能”命令它”(加载 blob、让它解密、让它签名);它永远只把”结果”给你,不给”秘密”。

⚠️ 常见误区

误区 正解
TPM 是纯软件 TPM 是规范,独立芯片(dTPM)、固件(fTPM)、虚拟机(vTPM)都能实现
NVRAM 里全是密钥 NVRAM 装种子/证书/计数器/策略/少量核心密钥,大部分密钥是外部的 blob
\|\| 是按位或 PCR 更新公式里的 \|\| 是拼接(concatenation),不是或运算
密钥文件加密的是数据 密钥 blob 加密的是密钥材料本身,数据另有单独一层加密
blob 放外面不安全 blob 是密文,没有芯片内父密钥就是一堆废数据
TPM 只是一个密钥管理器 它同时是密钥管理器 + 度量器(PCR)+ 签名器(AIK)+ 随机数发生器 + 加密引擎
PCR 可以被软件直接改写 固件层面只有 Extend 命令,没有”写 PCR”接口,历史不可抹除
所有 TPM 实现一样安全 dTPM > fTPM > vTPM,fTPM 曾被电压故障注入攻击提取密钥

✅ 总结

TPM 是一台只能通过命令指挥、密钥永不出柜的保险箱电脑:根密钥锁芯片内,子密钥以 blob 形式散落在外;PCR 只能 Extend 保证系统指纹不可伪造,sealing 把密钥和系统状态绑死,AIK Quote 支撑远程认证;BitLocker 和 Windows Hello 就是它最日常的应用。三个”永不”:根密钥永不离开芯片、任何密钥的工作形式永不出现明文、PCR 永不接受直接写入。

下一站:把 TPM 和 TEE 放到一起——信任根三件套与协作信任。

Happy Hacking! 🎉