4. TPM密钥层次与保护机制
TPM 2.0 的密钥体系不是一堆平级的密钥,而是一棵以种子(Seed)为根、以主密钥为中间层、以应用密钥为叶子的层次树。理解这棵树的关键在于两点:一是“谁能派生谁”,二是“谁保护谁”。TPM 内部保存的不是密钥本身,而是密钥的父级保护关系;真正落盘的只有被父密钥加密后的私钥 blob 和公开参数。因此,密钥层次本质上是一套“派生 + 封装”的信任链。
一、密钥层次:从种子到叶密钥
TPM 2.0 定义了三个持久种子:SP Seed(Storage Primary Seed)、EP Seed(Endorsement Primary Seed)和 PP Seed(Platform Primary Seed)。它们由 TPM 内部随机数发生器在制造或所有权建立时生成,永不出芯片。每个种子通过确定性派生函数(KDF)生成对应的主密钥:SP Seed 派生 SRK(Storage Root Key),EP Seed 派生 EK(Endorsement Key),PP Seed 派生平台主密钥。主密钥之下再逐级派生或创建子密钥,形成“主密钥 → 中间密钥 → 应用密钥”的树状结构。
需要区分两个概念:Primary Key(主密钥)由种子确定性派生,同一 seed 下参数相同则结果相同,可重建;Ordinary Key(普通密钥)由 TPM 随机生成,必须由父密钥封装保存,丢失 blob 即丢失密钥。SRK 是典型的 Primary Key,而应用加密密钥通常是 Ordinary Key。
二、各密钥角色与属性
SRK(Storage Root Key)是存储层次的根,通常为 RSA-2048 或 ECC P-256,属性为 fixedTPM=1、fixedParent=1、sensitiveDataOrigin=1、userWithAuth=0(默认需授权)。它的核心用途是封装其他密钥,一般不直接用于数据加密。SRK 的授权值在 TakeOwnership 时由用户设定,丢失后无法恢复其下所有子密钥。
EK(Endorsement Key)由 EP Seed 派生,是设备身份的唯一标识。EK 的证书由 TPM 厂商在制造时签发,包含厂商、型号、序列号等信息。EK 通常为 RSA-2048,属性 fixedTPM=1、fixedParent=1、sensitiveDataOrigin=1、adminWithPolicy=1,且 restricted=1、decrypt=1。它不能用于通用解密,只能用于建立会话或作为认证协议的起点。实践中常用 EK 的公钥加密一个挑战,证明“我是这台设备”。
AK(Attestation Key)是 EK 的“代理签名密钥”。因为 EK 本身受限,不能直接签名,所以需要创建一个 AK,由 EK 或 SRK 封装。AK 属性为 restricted=1、sign=1、fixedTPM=1、fixedParent=1,通常为 ECC P-256 或 RSA-2048。AK 用于对 PCR 值签名生成 Quote,远程方用 EK 证书验证 AK 的合法性,再用 AK 公钥验证 Quote 签名,从而确认平台状态未被篡改。
NK(Null Key)是一种特殊密钥,其私钥为空,所有操作直接返回成功或固定值。NK 的典型用途是测试、调试或作为“无密钥”占位符。在 TPM2_CreatePrimary 中指定 TPM2_RH_NULL 作为父级时,会生成一个 NK 作为临时主密钥,不持久化,重启即失效。NK 不能用于任何真实安全场景。
三、授权策略与使用场景
每个 TPM 密钥对象都带有一个授权策略(Auth Policy),决定“谁在什么条件下可以使用它”。授权方式分为三类:密码授权(Password Authorization)、HMAC 授权(HMAC Session)和策略授权(Policy Session)。密码授权最简单,明文传输授权值,适合低安全场景;HMAC 授权通过会话密钥计算 HMAC,防止窃听和重放;策略授权最灵活,可组合 PCR 值、命令码、物理存在(Physical Presence)、NV 索引等条件。
以“磁盘加密密钥”为例,典型策略是:PolicyPCR 绑定 PCR 0、2、4、7(固件、引导、MBR、Secure Boot),PolicyCommandCode 限制只能执行 Unseal,PolicyAuthValue 要求用户输入 PIN。这样,只有系统以正确配置启动且用户输入正确 PIN 时,密钥才能被解封。若引导链被篡改,PCR 值变化,策略校验失败,密钥无法释放。
TPM2_CreatePrimary 并指定 TPM2_RH_OWNER 作为层级,同时设置 userWithAuth=1 以便后续免密码使用。若需高安全,可设置 userWithAuth=0 并绑定 Policy。EK 和 AK 的创建应使用 TPM2_RH_ENDORSEMENT 层级,避免与存储层级混淆。
四、密钥属性速查与判断依据
判断一个密钥能否用于某场景,主要看四个属性:restricted(是否受限)、decrypt(能否解密)、sign(能否签名)、fixedTPM(是否绑定 TPM)。例如,SRK 通常 restricted=1、decrypt=1,只能解密“种子”类数据,不能直接解密用户数据;EK 是 restricted=1、decrypt=1,只能用于认证协议;AK 是 restricted=1、sign=1,只能签名 TPM 内部生成的数据(如 PCR Quote),不能签名任意外部数据。若需要签名任意数据,必须创建 restricted=0、sign=1 的普通签名密钥。
| 密钥 | 典型算法 | restricted | decrypt | sign | 主要用途 |
|---|---|---|---|---|---|
| SRK | RSA-2048 / ECC P-256 | 1 | 1 | 0 | 封装子密钥 |
| EK | RSA-2048 | 1 | 1 | 0 | 设备身份认证 |
| AK | ECC P-256 / RSA-2048 | 1 | 0 | 1 | PCR Quote 签名 |
| NK | — | — | — | — | 测试占位,无安全用途 |
| 应用加密密钥 | AES-256 / RSA-2048 | 0 | 1 | 0 | 数据加解密 |
| 应用签名密钥 | ECC P-256 / RSA-2048 | 0 | 0 | 1 | 任意数据签名 |
五、密钥生命周期与保护边界
密钥从创建到销毁经历:创建(Create/CreatePrimary)→ 加载(Load)→ 使用(Use)→ 持久化(Evict/ContextSave)→ 销毁(Flush)。持久化密钥通过 TPM2_EvictControl 写入 TPM 非易失存储,句柄通常为 0x81000000 以上。非持久化密钥在 TPM 复位后丢失,需从 blob 重新加载。保护边界在于:私钥永不离开 TPM 内部;TPM 外部只有公钥和加密后的私钥 blob;授权值通过会话保护,不直接暴露在总线上。
restricted=0 的存储密钥或直接使用 SRK 下的子密钥。
总结来看,SRK 是存储树的根,EK 是身份锚点,AK 是状态证明的签名者,NK 是测试占位。四者各司其职,通过种子派生、父级封装和授权策略形成完整的密钥保护链。理解这条链,是后续做密钥迁移、远程证明和策略绑定的基础。