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 | ┌─────────────────────────────┐ |
最重要的一条规矩:密钥一旦生成就锁在保险柜里,任何软件都拿不到密钥本身。你只能让它”用这把钥匙帮我签名”——它签完把结果给你,钥匙还在柜子里。
TPM 是行业标准(TCG 定义,ISO/IEC 11889),Windows 11 强制要求,几乎所有新主板都带。
🧬 TPM 的三大核心能力
① 度量(Measurement):PCR 与”只进不出”
平台启动时,逐级”测量并记录”:
1 | 平台启动时逐级测量: |
PCR(Platform Configuration Register,平台配置寄存器) 只有两个特性:
| 特性 | 含义 |
|---|---|
| 只能 Extend(追加) | 没有”直接写”这个命令,固件层就不存在该接口 |
| 开机清零 | 每次启动重新累计,从零开始 |
所以 PCR 里的值 = 这台机器”从开机到现在装了什么”的不可篡改指纹。想伪装成”没装过恶意软件”?改不了——你加载过的任何恶意代码必然出现在 Extend 链里。
为什么只能 Extend?因为 PCR 的意义是”不可抵赖的系统指纹”。如果能直接写,恶意软件就能把 PCR 直接写成”干净的值”。Extend 用哈希链保证历史不可抹除:账本只能往后加页,不能撕掉前面的页。
② 存储(Sealing,密封):钥匙和状态绑定
1 | seal(key, PCR值集合) → 这把钥匙只在一个特定状态下才能 unseal |
这就是”钥匙锁进保险箱,保险箱的门锁绑定系统状态”——系统被篡改(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 | 用户 → TSS 软件栈(tpm2-tools 等)→ TPM 芯片 |
命令行示例(Linux 上可跑):
1 | tpm2_pcrread sha256:0 # 读 PCR 0 的值 |
🖥 你其实已经在用 TPM:三个日常场景
场景 A:BitLocker(磁盘加密)——用 TPM 保管磁盘密钥
1 | ① 启用 BitLocker,系统让 TPM 生成/存入"磁盘加密密钥" |
防的是”有人拆走你的硬盘去别的机器上读”——硬盘到哪都解不开。
场景 B:Windows Hello / 指纹登录
1 | ① 注册时,系统让 TPM 生成一对密钥,私钥锁进 TPM |
私钥永远不会出现在内存/磁盘里,偷走 Windows 文件也偷不走密钥。
场景 C:远程认证
1 | ① 别人(验证方)发来一个随机数 nonce |
注意 PCR 值来自 TPM 自己的保险柜,不是软件报告的——软件想谎报 PCR?它没有权限写 PCR。
🔑 blob 与两层加密
blob = Binary Large Object(二进制大对象),在 TPM 语境里特指”被父密钥加密后的密钥对象文件”:
1 | 磁盘上的一个密钥文件(比如 keyA.bin): |
blob 是密文,没有芯片里父密钥的参与,磁盘上的 blob
什么都干不了。blob
可以放任何地方:磁盘、NVRAM、网络传输——都安全。使用时:加载 blob → TPM 内部用父密钥解开 → 密钥在芯片内就位 → 干活。
TPM 体系里加密分两层,别混:
1 | 第 1 层(密钥层):父密钥加密 → 子密钥材料 → 产物 = 密钥 blob(密钥本身) |
类比三层套娃:保险箱(SRK,永远在芯片内)→ 钥匙盒(blob,里面是加密的 AES 密钥材料)→ 信(数据,用这把钥匙加密)。blob 保护”钥匙不泄露”,数据密文保护”内容不泄露”,各管一层。
🧅 密钥树与 NVRAM:容器和结构的关系
TPM 密钥体系是”洋葱式”的,绝大多数密钥根本不在 TPM 芯片里:
1 | 芯片内(NVRAM/内部):SRK、EK、种子(根节点) |
存外面也不怕:没有芯片里的父密钥,磁盘上的 blob 就是一堆密文。
NVRAM 里有什么?不都是密钥:
| 内容 | 说明 |
|---|---|
| EK 证书 | 出厂身份证明 |
| 平台种子(如 EPSeed) | 所有密钥的”源头” |
| 部分 PCR 备份 | 视实现而定 |
| 计数器 | 防回滚的单调计数器 |
| 平台策略/授权数据 | 使用策略 |
| 少量核心密钥 | SRK、AIK 等(不是全部!) |
NVRAM 和密钥树的关系——一个是”存储空间”,一个是”逻辑层级”:
| 概念 | 本质 | 角色 |
|---|---|---|
| 密钥树 | 父密钥加密子密钥的逻辑结构 | 家谱 |
| NVRAM | 芯片内掉电不丢的存储区 | 保险柜里的抽屉 |
密钥树的根(SRK/种子)必须呆在芯片内;枝叶(blob)可以放 NVRAM,也可以放外部磁盘(更常见)。一句话:密钥树是”家谱”,NVRAM 是”保险柜里的抽屉”;重要的东西锁在抽屉里,其余的放在外面的保险箱(加密磁盘)里也一样安全。
🎬 完整例子:用 TPM 加密一个文件(6 步)
场景:把 存折密码.txt
加密,要求”只有这台机器、且系统没被动过手脚时才能解开”。
Step 1:芯片初始化(出厂时发生,不是你做的)
1 | TPM 芯片出厂:内部生成 EK + 平台种子 |
Step 2:启动度量(每次开机自动发生)
1 | 开机 → UEFI 固件 → 引导程序 → 内核 |
Step 3:创建你的加密密钥
1 | 你执行:tpm2_create ...(系统帮你调用 TPM) |
⚠️ AES 密钥本身从未离开过芯片。你拿到的是”被 SRK 锁住的密钥”(blob),不是密钥。
Step 4:加密文件
1 | ① 让 TPM 加载 mykey.bin → 芯片内部用 SRK 解开 → AES 密钥就位(在芯片内) |
Step 5:解密(下次要用时)
1 | ① 加载 mykey.bin → TPM 解开 → AES 密钥就位 |
Step 6:加一道 sealing(TPM 的灵魂功能)
1 | 创建密钥时指定:只有 PCR 值 == [0x3A2F..., ...] 时才能解开 |
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! 🎉