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。

TPM 2.0 密钥层次与保护关系 SP Seed 存储主种子(永不出芯片) EP Seed 背书主种子(永不出芯片) PP Seed 平台主种子(永不出芯片) KDF派生 KDF派生 KDF派生 SRK 存储根密钥(Primary) EK 背书密钥(Primary) PP Primary 平台主密钥(Primary) 封装 封装 封装 存储密钥 Storage Key(可再派生) AK attestation Key(签名) NK Null Key(空密钥) 封装 封装 封装 应用加密密钥 AES-256 / RSA-2048 应用签名密钥 ECC P-256 / RSA-2048 HMAC 密钥 SHA-256 签名 Quote / 认证数据 PCR 签名输出 图例说明 种子层:TPM 内部持久,永不出芯片 主密钥层:由种子确定性派生,可重建 叶密钥层:随机生成,需父密钥封装 AK:专用于签名与认证,不可解密 派生关系(KDF) 封装关系(父保护子)

二、各密钥角色与属性

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 值变化,策略校验失败,密钥无法释放。

实践提示:创建 SRK 时建议使用 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;授权值通过会话保护,不直接暴露在总线上。

常见误区:把 EK 当作通用加密密钥使用。EK 是受限解密密钥,只能解密 TPM 内部生成的种子类数据,不能直接解密用户文件。若需加密用户数据,应创建 restricted=0 的存储密钥或直接使用 SRK 下的子密钥。

总结来看,SRK 是存储树的根,EK 是身份锚点,AK 是状态证明的签名者,NK 是测试占位。四者各司其职,通过种子派生、父级封装和授权策略形成完整的密钥保护链。理解这条链,是后续做密钥迁移、远程证明和策略绑定的基础。