TPM 数据封存与解封


以下是两种使用 TPM 封存和解封数据的方法,一种是使用自定义的 Primary Key 作为父密钥,另一种是使用 Endorsement Key (EK) 和 Storage Root Key (SRK) 的组合。可以根据需求选择合适的方式。

方式一:使用 Primary Key 进行封存和解封

1. 清除 TPM 并设置密码(如果尚未设置)

确保 TPM 的状态是清除的,并设置 Owner 密码(例如 111111)。

1
2
tpm2_clear
tpm2_changeauth -c o 111111

2. 创建 Primary Key

在 TPM 中创建一个 Primary Key,作为封存对象的父密钥。

1
tpm2_createprimary -C o -c primary.ctx -P 111111
  • -C o:指定使用 Owner 层级。
  • -c primary.ctx:将 Primary Key 的上下文保存到 primary.ctx 文件中。
  • -P 111111:设置 Primary Key 的密码。

3. 封存(Seal)数据到 TPM

将要封存的数据(如 secret.txt 文件中的内容)存储到 TPM 中。

1
2
echo "my_secret_data" > secret.txt
tpm2_create -C primary.ctx -u seal.pub -r seal.priv -i secret.txt
  • -C primary.ctx:指定使用 Primary Key 作为父密钥。
  • -u seal.pub-r seal.priv:分别保存生成的公钥和私钥。
  • -i secret.txt:将 secret.txt 文件中的数据封存到 TPM 中。

4. 加载密钥上下文到 TPM

将封存对象加载到 TPM,以便后续可以进行解封操作。

1
tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx
  • -C primary.ctx:指定使用 Primary Key 作为父密钥。
  • -u seal.pub-r seal.priv:加载封存对象的公私钥。
  • -c seal.ctx:生成密钥的上下文文件 seal.ctx

5. 解封(Unseal)数据

从 TPM 中解封数据并输出到文件:

1
tpm2_unseal -c seal.ctx > unsealed_data.txt
  • -c seal.ctx:指定封存对象的上下文文件。
  • > unsealed_data.txt:将解封的数据保存到 unsealed_data.txt 文件中。

方式二:使用 Endorsement Key (EK) 和 Storage Root Key (SRK) 进行封存和解封

1. 清除 TPM 并设置密码

清除 TPM,确保 TPM 的状态是干净的。

1
2
3
tpm2_clear
tpm2_changeauth -c o 111111
tpm2_changeauth -c e 111111
  • tpm2_clear:清除 TPM。
  • tpm2_changeauth -c o 111111:设置 Owner 密码为 111111
  • tpm2_changeauth -c e 111111:设置 Endorsement 密码为 111111

2. 创建 Endorsement Key (EK)

生成 Endorsement Key (EK) 并保存其上下文。

1
tpm2_createek --ek-context ek.ctx --key-algorithm rsa -P 111111
  • --ek-context ek.ctx:将 EK 上下文保存到 ek.ctx 文件中。
  • --key-algorithm rsa:指定密钥算法为 RSA。
  • -P 111111:为 EK 设置密码。

3. 创建 Storage Root Key (SRK)

基于 EK 创建 Storage Root Key (SRK),将其上下文保存。

1
tpm2_createprimary -C e -c srk.ctx -P 111111
  • -C e:指定使用 EK(Endorsement)作为父密钥。
  • -c srk.ctx:将 SRK 的上下文保存到 srk.ctx 文件中。
  • -P 111111:设置 SRK 的密码。

4. 封存(Seal)数据

将要封存的数据(如 secret.txt 文件中的内容)存储到 TPM 中。

1
2
echo "my_secret_data" > secret.txt
tpm2_create -C srk.ctx -u seal.pub -r seal.priv -i secret.txt
  • -C srk.ctx:指定 SRK 作为父密钥。
  • -u seal.pub-r seal.priv:分别保存生成的公钥和私钥。
  • -i secret.txt:将 secret.txt 文件中的数据封存到 TPM 中。

5. 加载密钥上下文

将封存对象加载到 TPM,以便后续解封操作。

1
tpm2_load -C srk.ctx -u seal.pub -r seal.priv -c seal.ctx
  • -C srk.ctx:指定 SRK 作为父密钥。
  • -u seal.pub-r seal.priv:加载封存对象的公私钥。
  • -c seal.ctx:生成密钥的上下文文件 seal.ctx

6. 解封(Unseal)数据

从 TPM 中解封数据并输出到文件。

1
tpm2_unseal -c seal.ctx > unsealed_data.txt
  • -c seal.ctx:指定封存对象的上下文文件。
  • > unsealed_data.txt:将解封的数据保存到 unsealed_data.txt 文件中。

总结

  • 方式一 使用自定义的 Primary Key 进行封存和解封,适合自定义管理密钥层级。
  • 方式二 使用 EK 和 SRK 进行封存和解封,适合 TPM 内部的密钥管理流程。

根据应用需求选择其中一种方式即可实现 TPM 的数据封存与解封操作。