我一直在研究使用 TPM2.0 来安全地持久保存秘密tpm2-工具。看来密封物体是解决这种问题的方法。
我希望这里有人能够更好地解释密封对象如何与创建和加载它们的父“主要对象”相关,特别是当涉及密码身份验证值时。我对我整理的一些示例(如下)感到有点困惑,这些示例允许进行各种操作,而无需提供我认为需要的密码。
(注意:实践中下面的许多示例都需要调用来tpm2_flushcontext -t
清理中间对象加载的空间,但为了简洁起见,我已将它们排除在外)
作为我评估的一部分,我了解到密封对象必须始终在必须首先创建的其他“主对象”/主键下创建。
# make a new primary key
$ tpm2_createprimary -C o -c testprim.ctx
# make a new sealing object under this primary key
$ tpm2_create -u testseal.pub -r testseal.priv -i hunter2.txt -C testprim.ctx
可以选择使用密码身份验证值创建这些主要对象。正如您所期望的,尝试通过受密码保护的主对象创建密封对象而不提供其密码是行不通的:
$ tpm2_createprimary -C o -p str:testpwd -c testprim-wauth.ctx
$ tpm2_create -u testseal-wpauth.pub -r testseal-wpauth.priv -i hunter2.txt -C testprim-wauth.ctx
WARNING:esys:src/tss2-esys/api/Esys_Create.c:398:Esys_Create_Finish() Received TPM Error
ERROR:esys:src/tss2-esys/api/Esys_Create.c:134:Esys_Create() Esys Finish ErrorCode (0x0000098e)
ERROR: Esys_Create(0x98E) - tpm:session(1):the authorization HMAC check failed and DA counter incremented
ERROR: Unable to run tpm2_create
$ tpm2_create -u testseal-wpauth.pub -r testseal-wpauth.priv -i hunter2.txt -C testprim-wauth.ctx -P str:testpwd
# OK
让我有点困惑的是,如果加载是在不同的环境下完成的,则加载和解封这些在身份验证保护的主键下创建的对象之一可以正常工作。未经授权首要的关键:
# no password required here
$ tpm2_load -C testprim.ctx -u testseal-wpauth.pub -r testseal-wpauth.priv -n testseal-loadedwnopauth.name -c testseal-loadedwnopauth.ctx
$ tpm2_unseal -c testseal-loadedwnopauth.ctx
hunter2
但是,如果在受身份验证值保护的主键下加载,则加载时需要密码...
# Try load without password
$ tpm2_load -C testprim-wauth.ctx -u testseal-wpauth.pub -r testseal-wpauth.priv -n testseal-loadedwpauth.name -c testseal-loadedwpauth.ctx
WARNING:esys:src/tss2-esys/api/Esys_Load.c:324:Esys_Load_Finish() Received TPM Error
ERROR:esys:src/tss2-esys/api/Esys_Load.c:112:Esys_Load() Esys Finish ErrorCode (0x0000098e)
ERROR: Eys_Load(0x98E) - tpm:session(1):the authorization HMAC check failed and DA counter incremented
ERROR: Unable to run tpm2_load
# with password:
$ tpm2_load -C testprim-wauth.ctx -u testseal-wpauth.pub -r testseal-wpauth.priv -n testseal-loadedwpauth.name -c testseal-loadedwpauth.ctx -P str:testpwd
# OK
...但是无需密码也可以解封。
$ tpm2_unseal -c testseal-loadedwpauth.ctx
hunter2
但是,我假设这是因为密封对象本身没有密码。如果密封对象本身被赋予了密码身份验证值(-p
标志 in tpm2_create
),那么如果没有该密码,它永远无法解封,这是预期的行为,因此至少可以正常工作。
我只是很困惑为什么在受密码保护的主键下创建的东西似乎仍然可以在以后使用而不需要该密码。
密码纯粹是为了能够在主键下创建后续的子对象吗?
我在这里错过了什么吗?