信任根与信任链:硬件信任根(TPM、TEE)、信任链的建立与传递机制
聊远程证明,绕不开一个最根本的问题:凭什么相信你?
你想想看,一个远程设备说“我是安全的”,我凭什么信它?它可能已经被攻破了,它的操作系统可能被篡改了,它的报告程序可能已经被替换了。所以,我们需要一个不可篡改的起点,然后从这个起点开始,一级一级地验证下去。这就是信任根和信任链的核心思想。
2.1 信任根:一切信任的起点
信任根(Root of Trust, RoT),说白了就是整个安全体系的锚点。它必须是一个物理上不可篡改、逻辑上绝对可信的硬件元件。我个人习惯把信任根比作“安全世界的奇点”——所有信任都从这里爆炸式地扩展出去。
目前主流的硬件信任根有两种:
| 信任根类型 | 代表技术 | 核心能力 | 典型应用 |
|---|---|---|---|
| TPM | 独立安全芯片 | 密钥存储、平台度量、密封存储 | PC、服务器、IoT设备 |
| TEE | CPU安全扩展 | 隔离执行、安全存储、远程证明 | 手机、云服务器、边缘计算 |
2.2 TPM:独立的安全芯片
TPM(Trusted Platform Module)是一个独立的硬件芯片,焊在主板上。它有自己的处理器、存储器和密码加速器。我在项目中遇到过不少客户问:“TPM不就是个存密钥的芯片吗?”其实远不止如此。
TPM的核心能力有三个:
- 平台配置寄存器(PCR):这是TPM的灵魂。PCR只能通过
Extend操作写入,无法直接覆盖。每次Extend操作都是:PCR_new = SHA256(PCR_old || 新度量值)。这意味着,只要度量顺序不同,最终PCR值就不同。攻击者无法伪造一个合法的PCR值。 - 背书密钥(EK):每个TPM出厂时烧录的唯一身份密钥。私钥永远不出芯片。这是远程证明的“身份证”。
- 身份证明密钥(AIK):用于签名的派生密钥。为了保护EK隐私,TPM用AIK来签名度量报告。AIK由EK担保,EK由TPM制造商担保。
关键点:TPM的信任根是物理不可克隆的。即使攻击者物理接触芯片,也无法提取EK私钥。这是硬件信任根和软件信任根的本质区别。
2.3 TEE:隔离的执行环境
TEE(Trusted Execution Environment)和TPM不同。TPM是个独立的芯片,而TEE是CPU内部的一个安全扩展。它把CPU划分成两个世界:普通世界(Normal World)和安全世界(Secure World)。
我最早接触TEE是在ARM的TrustZone上。当时有个项目需要在手机端做金融级身份认证。普通世界的Android系统可能被root,但安全世界里的代码和数据,普通世界完全无法访问。嗯,这里要注意:TEE的信任根是CPU固件,而不是独立芯片。
TEE的核心能力:
- 安全启动:从Boot ROM开始,逐级验证,确保只有签名的可信镜像才能运行在安全世界。
- 隔离执行:安全世界的代码和数据,普通世界无法读取或篡改。即使操作系统被攻破,TEE里的秘密依然安全。
- 远程证明:TEE可以生成一个签名报告,证明自己运行的是某个特定版本的代码。这个报告由TEE的硬件密钥签名。
我的经验:选择TPM还是TEE,取决于你的场景。如果是PC或服务器,TPM更成熟、标准更统一。如果是移动设备或云原生环境,TEE更灵活、性能更好。我曾经在一个IoT项目中同时用了TPM和TEE——TPM做平台度量,TEE做运行时隔离。两者互补,效果很好。
2.4 信任链:从信任根到整个系统
有了信任根,下一步就是建立信任链。信任链的本质是:从信任根开始,逐级度量、逐级验证、逐级传递信任。
我画了一张图,帮你理解这个链条:
这个链条的运作逻辑是这样的:
- 信任根(RoT):通常是Boot ROM或TPM。它是最初的信任锚点,不可篡改。
- 度量阶段1:Boot ROM度量Boot Loader的哈希值,存入PCR。如果哈希值匹配预期,信任传递给Boot Loader。
- 度量阶段2:Boot Loader度量OS Kernel的哈希值,存入PCR。信任传递给OS Kernel。
- 度量阶段3:OS Kernel度量关键应用和服务的哈希值,存入PCR。信任传递给应用层。
- 最终报告:所有度量值形成一个链式哈希,存储在PCR中。远程验证方可以通过请求PCR值和签名报告,验证整个系统的完整性。
避坑指南:我曾经在一个项目中,信任链在Boot Loader阶段断了——因为Boot Loader没有验证OS Kernel的签名,直接加载了。结果攻击者替换了OS Kernel,整个信任链形同虚设。记住:信任链的强度取决于最弱的一环。每一级都必须严格验证下一级的完整性。
2.5 信任传递机制:Quote与Attestation
信任链建立好了,怎么把它“传递”给远程验证方?这就需要Quote(引用)和Attestation(证明)机制。
Quote的过程:
- TPM/TEE收到一个Nonce(随机数),防止重放攻击。
- TPM/TEE读取当前PCR值,用AIK签名,生成Quote报告。
- Quote报告包含:PCR值、Nonce、签名。
- 远程验证方用AIK公钥验证签名,比对PCR值是否匹配预期。
Attestation的过程更复杂一些,因为它涉及证书链:
- TPM的EK证书由TPM制造商签发。
- AIK证书由EK担保(通过
ActivateIdentity协议)。 - Quote报告由AIK签名。
- 远程验证方需要验证:EK证书 → AIK证书 → Quote签名 → PCR值。
核心逻辑:信任传递不是“我说我可信”,而是“我证明我可信”。每一级信任都需要上一级的密码学担保。最终,所有信任都归结到硬件信任根——那个物理上不可篡改的锚点。
2.6 实战中的信任链设计
在实际项目中,信任链的设计往往比理论复杂得多。我分享几个经验:
| 场景 | 信任根选择 | 信任链设计要点 | 常见坑 |
|---|---|---|---|
| PC/服务器 | TPM 2.0 | UEFI安全启动 → Boot Loader → OS → 应用 | UEFI Secure Boot未启用 |
| 移动设备 | TEE (TrustZone) | Boot ROM → TEE OS → 安全应用 → 普通OS | TEE和普通OS共享内存未隔离 |
| 云服务器 | TEE (SGX/SEV) | CPU固件 → 安全飞地 → 应用代码 | 飞地内存页未加密 |
| IoT设备 | TPM + 安全MCU | 安全MCU → 主MCU → 传感器固件 | 传感器固件未签名 |
我的建议:设计信任链时,先问自己三个问题:
- 信任根是什么?它是否物理不可篡改?
- 每一级度量是否严格?有没有跳过验证的路径?
- 信任传递的密码学担保是否完整?证书链是否可追溯?
这三个问题想清楚,信任链就不会出大问题。
2.7 小结
信任根和信任链是远程证明的基石。没有硬件信任根,远程证明就是空中楼阁。没有信任链,信任根再强也无法扩展到整个系统。
我个人习惯把信任链比作“安全的多米诺骨牌”——第一块骨牌(信任根)必须稳如泰山,然后每一块骨牌(度量环节)都必须精准倒下(验证通过),最终才能证明整个系统的可信状态。
嗯,这一章的内容就到这里。记住:信任不是靠说的,是靠证明的。