[如何 TPM](https://res.cloudinary.com/practicaldev/image/fetch/s--ioaZbOjx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/sdrnihmljg37ycb8v5qz.jpg)

作为最近工作的一部分,我们在 TPM 上做了一个峰值。在这个过程中,我意识到那里没有可供初学者使用的材料,至少在一个地方没有。很多关于它的文档都是神秘的(双关语无意!)。这个想法是为了让像我这样的 TPM 新手更容易理解。我计划分部分记录这一点,以便阅读和写作都不会压倒一切。此外,本系列不会深入探讨规范的技术实现,而是我对 TPM 以及如何使用 TPM 的基本了解。

TPM - 简介

什么是 TPM?

TPM 代表可信平台模块。 TPM 是一个加密协处理器。这意味着除了其他东西之外,TPM 还包含一个专门用于加密用例的处理器。它是附在计算机主板上的硬件芯片。 TPM 是一个内置的安全模块。

随着时间的推移,已经有多个版本的 TPM

  • TPM 1.1b

  • TPM 1.2

  • TPM 2

在这篇文章中,我将只讨论 TPM 2,除非我想深入研究一些历史背景或多个版本之间的差异。

TPM 能做什么?

到目前为止我探索的用例,TPM 可用于

  • 生成密钥对

  • 存储密钥对

  • 哈希

  • 标志

  • 加密/解密

  • 验证签名

  • 生成随机数

它也可能用于一大堆其他用例。在这一点上,我还没有探索其他事情。

现在,转到 TPM 特定词汇。

层次结构

您可以将层次结构视为以父键为根的树结构。这将环绕并加密其所有子密钥。可以在以下 4 个层次结构中的任何一个下创建密钥。

  • 背书 - 背书层次结构是隐私敏感树,是用户有隐私问题时选择的层次结构。 TPM 和平台供应商证明此层次结构中的主键受限于连接到真实平台的真实 TPM。

  • Owner - 也称为存储层次结构,旨在供平台所有者使用,即设备所有者或用户

  • 平台 - 旨在由平台制造商控制。这由 BIOS 和系统管理模式 (SMM) 使用。

其中,背书、所有者和平台层次结构是持久的层次结构。 Null 层次结构是一个短暂的层次结构。这意味着,使用 Endorsement/Owner/Platform 层次结构创建的密钥可以在系统重新启动后继续存在。另一方面,使用 Null 层次结构创建的密钥是短暂的,即不会在系统重新启动之间保留。所有 TPM 对象(键/数据)都属于一个层次结构。

每个层次结构的加密根是一个种子。种子是 TPM 生成的大随机数。这个种子永远不会暴露在 TPM 的安全边界之外。这个种子是生成密钥的起始值。还可以通过向密钥添加密码来进一步增加密钥的安全性。密钥的使用现在也需要密钥密码。

尽管 TPM 带有有限数量的非易失性 (NV) 内存,但可以生成多个密钥。这是因为人们可以通过对给定种子应用加密算法来重新创建相同的密钥。它是确定性的。因此密钥不需要保存在文件系统中(TPM 允许将密钥保存在文件系统中);总是可以重新生成它们。

空层次结构是一个例外。对于临时 Null 层次结构,此种子值在电源循环之间发生变化。一旦种子值发生变化,就无法重新生成以前的密钥。因此,空层次结构可用于创建无密码的临时会话密钥。

把手

句柄是对 TPM 中实体的 32 位引用。唯一标识占用 TPM 内存的 TPM 资源的标识符。

有 3 种类型的键柄。

  • 瞬态

  • 持续

  • 永久

瞬态句柄是 NVRAM 中键的地址。这些指向已使用 tpm2_load 加载的密钥或已(重新)创建但未持久化的密钥。

持久处理 TPM 的 NV 内存中的引用键。这些密钥在电源循环中保持不变,因此不需要重新创建。要使用这些密钥,首先需要将它们加载到 TPM 中。但是,使用持久密钥,不需要加载,因为它们驻留在 TPM 本身中。如果密钥(重新)创建时间较长,则使用 tpm2_evictcontrol 进行持久化。否则,可以根据需要重新创建它们。

永久处理无法删除的引用实体。除此之外,这还包括 4 个层次结构的句柄。

此外,还有其他类型的用于 NV 索引、已保存会话、PCR 等的句柄。

创建密钥

要创建用于签名的密钥,首先需要在 4 个层次结构中的任何一个下创建一个主密钥。此主键现在可用于创建子键。子密钥现在可用于签名。主键的每个子键如果满足一定条件也可以成为父键。因此,一个人可以有一个很深的密钥层次结构。

主键不能签名。它只能解密用于签名的子密钥。这是由所谓的关键属性指定的。密钥的属性在密钥创建时设置。这些属性用于控制键的行为。

一些常用的属性是:

  • fixedTPM: 如果设置了这个属性,key不能以任何方式复制

  • fixedParent: 如果设置了此属性,则无法更改此键的父级(有关此内容的更多信息在以后的帖子中)。

  • sign: 如果要使用密钥进行签名,则需要设置此属性。

  • restricted: 具有此属性集的密钥只能对 TPM 中生成的哈希进行签名

  • 解密: 只允许具有此属性的密钥创建或加载子密钥。如果设置了此属性,则键可以是父键。

  • sensitiveDataOrigin: 如果设置了该属性,则表示TPM为该key生成了除auth值之外的所有敏感数据

  • noDA: 对象受到字典攻击保护

通过使用这些属性的组合,可以创建主密钥、签名密钥、父密钥等。

在接下来的部分中,我将介绍各种 TPM 组件、访问 TPM、动手创建密钥和签名。

点击阅读全文
Logo

更多推荐