TPM 所有者密码和锁定密码 Windows 10 & linux

TPM Owner password and lockout password with Windows 10 & linux

我设置了双启动,所以我有 windows 10 和 ubuntu。

按照 this page 上的步骤,我能够在 windows 10 注册表中检索我的 TPM 的锁定密码和所有者密码。结果如下所示:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TPM\WMI\Admin
OwnerAuthStatus    REG_DWORD    0x1
LastAuthLevel    REG_DWORD    0x4
OwnerAuthFull    REG_SZ    iTcW8t1B+tIKmP/uxXPL94QF2Jw=
LockoutHash    REG_SZ    Ki1RiIu8d+eqeDoEFYcAqIoi1n4=
SRKPub    REG_BINARY    A3FEFDE6DBAA425D24717422C46C7E9C85C433CB
StorageOwnerAuth    REG_SZ
TPMCleared    REG_DWORD    0x0

OwnerAuthFull 和 LockoutHash 都是 base64 编码的,所以我可以使用 this link for instance 对它们进行解码(所有者密码为 893716F2DD41FAD20A98FFEEC573CBF78405D89C)。

在 ubuntu 上启动后,我尝试使用这些密码与 TPM 进行交互。我正在使用 tpm2-tools 与 ubuntu 下的 TPM 交互。 当 linux 控制 TPM 并设置这些密码时,Tpm2-tools 工作得很好。但在这里我试图让 Windows 控制 TPM,并且仍然能够在 Ubuntu 下与它通信。例如,当我 运行 这些命令时(当 ubuntu 控制 TPM 时有效)。

$ tpm2_createprimary --hierarchy e -g sha256 -G rsa -C primary.ctx
attributes:
  value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth|restricted|decrypt
  raw: 0x30072
$ tpm2_create -g sha256 -G rsa -u key.pub -r key.priv  -c primary.ctx
algorithm:
  value: sha256
  raw: 0xb
attributes:
  value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth|decrypt|sign
  raw: 0x60072
type:
  value: rsa
  raw: 0x1
  rsa: d14e5b7473972e4430b780dff0ec31a3a021fa0049ea1bafc17e2de4e232cba3afcdd8504c9f7dc2fa57df04ec1f64759f6bb0d8563c1ac53a7ce8d563ab7437f1f4b760960acfde7c414355c371ac8c94bba0e004bb08b499f115ba5e8efd655174c87309d64a23e198f6fce8e5451a851b7e96f7c172ba3d4be8e339176d136752e5d038ad9979585008e35bdedfdabe3236b92c60d5c4eabcafaabc8c65401aab5b479d8471d20ca18631c31404b38f3d373b5612ca906599914865cf281e550a748685fed4d60a7aa9c955d374c1d0852bb36ce9d39209e66fada20e4c473765160988470e93b63d81361613e3f5b918da167048ff8afe5e74768544fe03
$ tpm2_load -c primary.ctx  -u key.pub  -r key.priv -n key.name -C key.ctx

Load succ.
LoadedHandle: 0x80000100

$ tpm2_evictcontrol --auth o -c key.ctx --persistent 0x81010003 -P hex:893716F2DD41FAD20A98FFEEC573CBF78405D89C
persistentHandle: 0x81010003
ERROR: Tss2_Sys_EvictControl(0x9A2) - tpm:session(1):authorization failure without DA implications

我得到

 ERROR: Tss2_Sys_EvictControl(0x9A2) - tpm:session(1):authorization failure without DA implications

有人知道我为什么会收到这个错误/为什么这个密码不起作用吗?我在哪里可以获得正确的密码?那么任何关于如何解决这个问题的指示都将受到赞赏! 谢谢!

我想我得到了答案,实际上 Windows 对密码进行 sha1 哈希,然后将其转换为 base64,然后将其存储在注册表中(如果 gpedit 是这样配置的): https://msdn.microsoft.com/en-us/library/windows/desktop/aa376421(v=vs.85).aspx

b3nj1 的回答不正确。使用 tpm2_evictcontrol--auth o 选项意味着您正在选择 TPM 的所有者控制域(请注意,在 2018 年 2 月发布问题时是这样,--auth 现在意味着其他东西)这需要所有者授权。 OwnerAuthFullLockoutHash 确实按照 b3nj1 的回答中的描述生成,但是 OwnerAuthFull 存储了 TPM 的 lockout 授权,而 LockoutHash 的目的未知。

OwnerAuthFull 的 base64 解码值是 锁定授权值。这可以使用 tpm2-tools' tpm2_changeauth 进行验证 - base64 解码值使人们能够成功更改锁定授权。您可以使用以下 powershell 命令对十六进制字符串进行 base64 解码:

([System.BitConverter]::ToString([System.Convert]::FromBase64String('stringToConvert'))).Replace('-','')

那么Windows中的所有者授权值是多少?根据此页面:https://docs.microsoft.com/en-us/windows/security/information-protection/tpm/trusted-platform-module-services-group-policy-settings,b3nj1 为 StorageOwnerAuth。从问题中引用的结果来看,它只是一个空字符串,这意味着所有者授权值只是一个 0 字节的缓冲区。这是默认值。同样,您可以使用 tpm2_changeauth.

验证这一点

请注意 link 声称 TPM 2.0 的锁定授权存储在 LockoutAuth 中。这是不正确的。如上面 b3nj1 的结果(以及我的计算机中)所示,有 StorageOwnerAuth,因此它必须是 TPM 2.0,但没有 LockoutAuth。取而代之的是 LockoutHash,但是这篇文章没有提到这个值。尝试使用 tpm2_changeauthLockoutHash 修改任何所有者、背书和锁定授权失败,因此不清楚此值的用途。

wang对b3nj1的回答的评论中的link是不正确的。可以用tpm2_changeauth验证Windows中的所有者和背书授权值都是空字符串,锁定授权存储在OwnerAuthFull中。这意味着 Windows 控制的授权值中 none 是未知的 and/or 已丢弃。

我已经在 GitHub 上的文档中提出了这些问题,如果有任何进展,我会进行更新。