如何使用TPM(可信平台模块)encryption字节

如何使用机器的TPM模块encryption字节?

CryptProtectData

Windows提供了一个(相对)简单的API来使用CryptProtectData API来encryption一个blob,我们可以使用这个API来封装一个简单易用的函数:

 public Byte[] ProtectBytes(Byte[] plaintext) { //... } 

ProtectBytes的细节并不重要,因为你可以很容易地使用它:

  • 这里是我想要encryption的字节保存在System密钥
  • 把我加回去encryption的blob

返回的blob是一个未公开的文档结构,其中包含解密和返回原始数据所需的所有内容(哈希algorithm,密码algorithm,盐,HMAC签名等)。

为了完整ProtectBytes ,下面是使用Crypt API保护字节的ProtectBytes示例伪代码实现:

 public Byte[] ProtectBytes(Byte[] plaintext) { //Setup our n-byte plaintext blob DATA_BLOB dataIn; dataIn.cbData = plaintext.Length; dataIn.pbData = Addr(plaintext[0]); DATA_BLOB dataOut; //dataOut = EncryptedFormOf(dataIn) BOOL bRes = CryptProtectData( dataIn, null, //data description (optional PWideChar) null, //optional entropy (PDATA_BLOB) null, //reserved null, //prompt struct CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE, ref dataOut); if (!bRes) then { DWORD le = GetLastError(); throw new Win32Error(le, "Error calling CryptProtectData"); } //Copy ciphertext from dataOut blob into an actual array bytes[] result; SetLength(result, dataOut.cbData); CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData); //When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says. } 

如何做与TPM一样的?

以上代码仅用于本地机器的数据encryption。 数据使用System帐户作为密钥生成器进行encryption( 细节虽然有趣,但并不重要 )。 最终的结果是我可以encryption只能由本地机器解密的数据(例如硬盘encryption主密钥)。

现在是时候进一步了。 我想encryption一些只能由本地TPM解密的数据(例如硬盘encryption主密钥)。 换句话说,我想用Windows下的TPM代替Android下面的框图中的Qualcomm Trusted Execution Environment( TEE ):

在这里输入图像说明

注意 :我意识到TPM不会执行数据签名(或者如果是这样,它不保证签名相同的数据将每次都给出相同的二进制输出)。 这就是为什么我愿意用 用硬件绑定密钥encryption256位blob”replace“RSA签名

那么代码在哪里?

问题是TPM编程在MSDN上完全没有文档 。 没有API可用于执行任何操作。 相反,您必须find可信计算组织的软件堆栈(又名TSS)的副本,根据什么顺序找出发送给TPM的有效负载的命令,并调用Window的Tbsip_Submit_Command函数直接提交命令:

 TBS_RESULT Tbsip_Submit_Command( _In_ TBS_HCONTEXT hContext, _In_ TBS_COMMAND_LOCALITY Locality, _In_ TBS_COMMAND_PRIORITY Priority, _In_ const PCBYTE *pabCommand, _In_ UINT32 cbCommand, _Out_ PBYTE *pabResult, _Inout_ UINT32 *pcbOutput ); 

Windows没有更高级别的API来执行操作。

试图通过向您的硬盘发出SATA I / O命令来创build一个文本文件是道德等同的

为什么不只是使用裤子

可信计算组织(TCG)确定了自己的API: TCB软件栈 (TSS) 。 这个API的实现是由一些人创build的,被称为TrouSerS 。 一个人然后将该项目移植到Windows 。

该代码的问题是它不能移植到Windows世界中。 例如,你不能在Delphi中使用它,你不能在C#中使用它。 这个需要:

  • OpenSSL的
  • 并行线程

我只是想让代码使用我的TPMencryption一些东西。

上面的CryptProtectData除了在函数体内部什么都不需要。

使用TPMencryption数据的等效代码是什么? 正如其他人所指出的, 您可能需要查阅三个TPM手册,并自行构buildBlob 。 它可能涉及TPM_seal命令。 虽然我想我不想密封数据,但我想我想要绑定它:

绑定 – 使用TPM绑定密钥(一个存储密钥后面的唯一RSA密钥)encryption数据。 密封 – 以类似于绑定的方式encryption数据,但是另外指定TPM必须为了数据被解密(未密封)的状态

我尝试阅读三个所需的卷,以find我需要的20行代码:

  • 第1部分 – devise原则
  • 第2部分 – TPM的结构
  • 第3部分 – 命令

但我知道我在读什么。 如果有任何一个教程或例子,我可能会有一个镜头。 但是我完全失去了。

所以我们问Stackoverflow

就像我能够提供的一样:

 Byte[] ProtectBytes_Crypt(Byte[] plaintext) { //... CryptProtectData(...); //... } 

有人可以提供相应的等价物:

 Byte[] ProtectBytes_TPM(Byte[] plaintext) { //... Tbsip_Submit_Command(...); Tbsip_Submit_Command(...); Tbsip_Submit_Command(...); //...snip... Tbsip_Submit_Command(...); //... } 

除了在System LSA中locking的密钥之外,还会执行相同的操作,但会被locking在TPM中?

研究开始

我不知道绑定是什么意思。 但是看看TPM Main – Part 3 Commands – Specification Version 1.2,有一个提到绑定

10.3 TPM_UnBind

TPM_UnBind获取作为Tspi_Data_Bind命令的结果的数据blob,并将其解密以导出到用户。 调用者必须授权使用将解密传入blob的密钥。 TPM_UnBind以块为单位进行操作,并且在一个块与另一个块之间没有任何关系的概念。

令人困惑的没有Tspi_Data_Bind命令。

研究努力

令人震惊的是,谁也没有想过loggingTPM或其运行。 就好像他们花费了所有的时间来玩这个很酷的东西 ,但是不想处理让它变得可用的痛苦的一步。

从(现在)免费的书开始TPM 2.0实用指南:在新的安全时代使用可信平台模块

第3章 – TPM 2.0快速教程

TPM可以访问自己生成的私钥,因此可以使用公钥对密钥进行encryption,然后将生成的Blob存储在硬盘上。 通过这种方式,TPM可以保留几乎无限的密钥数量,但不会浪费宝贵的内部存储空间。 存储在硬盘上的密钥可以被删除,但是也可以备份,这对于devise者来说似乎是可以接受的权衡。

如何使用TPM的公钥encryption密钥?

第4章 – 使用TPM的现有应用程序

应该使用TPM,但不要

在过去几年中,networking应用程序的数量有所增加。 其中有基于networking的备份和存储。 现在有大量公司提供这样的服务,但就我们所知,这些服务的客户端都没有让用户将备份服务的密钥locking到TPM。 如果这样做了,如果TPM密钥本身是通过在多台机器上复制来备份的,那肯定会很好。 这似乎是开发者的一个机会。

开发人员如何lockingTPM的密钥?

第九章 – Heirarchies

使用案例:存储login密码

一个典型的密码文件存储密码的盐渍散列。 validation包括对提供的密码进行腌制和哈希处理,并将其与存储的值进行比较。 由于计算中不包含密码,所以密码文件会受到离线攻击。

此用例使用TPM生成的HMAC密钥。 密码文件存储闽南密码的HMAC。 validation包括腌制和HMACing提供的密码,并将其与储值进行比较。 由于脱机攻击者没有HMAC密钥,攻击者无法进行计算攻击。

可以工作。 如果TPM有一个秘密的HMAC密钥,并且只有我的TPM知道HMAC密钥,那么我可以用“HMAC”replace“Sign(也就是用私钥encryption的TPM)”。 但是在接下来的一行中,他完全颠倒了自己:

TPM2_Create,指定一个HMAC密钥

如果我必须指定HMAC密钥,这不是TPM秘密。 当您意识到这是TPM提供的密码实用程序章节时,HMAC密钥不是秘密的事实是有意义的。 您不必自己编写SHA2,AES,HMAC或RSA,而是可以重新使用TPM已经铺设的东西。

第十章 – 键

作为一个安全设备,应用程序使用密钥的能力, 同时保证它们在硬件设备中的安全性是TPM最大的优势。 TPM可以生成和导入外部生成的密钥。 它支持不对称和对称密钥。

优秀! 你怎么做呢!?

密钥生成器

可以说,TPM最大的优势在于能够生成encryption密钥并保护其在硬件边界内的秘密。 密钥生成器基于TPM自己的随机数生成器,不依赖于外部随机源。 从而消除了基于软件软件的熵不足的弱点。

TPM 是否有能力生成encryption密钥并保护其硬件边界内的秘密? 是这样,怎么样?

第12章 – 平台configuration寄存器

PCRs授权

使用案例:将硬盘encryption密码密封到平台状态

如果TPM保护encryption密钥,则完全磁盘encryption应用程序要比存储在同一磁盘上的应用程序安全得多,只能通过密码保护。 首先,TPM硬件具有反锤击保护(请参阅第8章有关TPM字典攻击防护的详细说明),对密码不切实际进行powershell攻击。 只有软件保护的密钥更容易受到弱密码的攻击。 其次,存储在磁盘上的软件密钥更容易被窃取。 取出磁盘(或磁盘的备份),然后获取密钥。 当TPM持有密钥时,整个平台或至less磁盘和主板都必须被盗。

密封不仅可以通过密码而且可以通过策略来保护密钥。 典型的策略将密钥locking在密封时的PCR值(软件状态)上。 这假定初次启动时的状态不受影响。 首次启动时出现的任何预先安装的恶意软件都将被测量到PCR中,因此密钥将被密封到受损的软件状态。 一个不太信任的企业可能会有一个标准的磁盘映像和密封到代表该映像的PCR。 这些PCR值将在可能更可信的平台上预先计算。 一个更复杂的企业将使用TPM2_PolicyAuthorize,并提供几张授权一组可信的PCR值的票据。 详细说明政策授权及其应用来解决PCRbrittleness问题。

虽然密码也可以保护密钥,但是即使没有TPM密码密码也有安全性。 攻击者可以在不提供TPMkey密码的情况下启动平台,但不能在没有操作系统用户名和密码的情况下login。 OSsecurity保护数据。 攻击者可以启动一个替代的操作系统,例如从一个现场DVD或USB棒,而不是从硬盘驱动器,绕过操作系统login安全。 但是,这种不同的引导configuration和软件会改变PCR值。 由于这些新的PCRs不符合密封值,所以TPM将不会释放解密密钥,并且硬盘不能被解密。

优秀! 这正是我碰巧想要的用例。 这也是Microsoft使用TPM的用例。 我该怎么做!?

所以我读了整本书,没有提供任何有用的东西。 这是相当可观的,因为它是375页。 你想知道这本书里面包含了什么 – 回顾一下,我不知道。

所以我们放弃了对TPM进行编程的权威性指南,而是转而使用微软的一些文档:

来自Microsoft TPM平台Crypto-Provider Toolkit 。 它提到了我想要做的事情:

背书密钥或EK

EK旨在为平台提供可靠的encryption标识符。 企业可能会维护属于企业中所有PC的TPM的认可密钥的数据库,或者数据中心结构控制器可能在所有刀片中都有TPM的数据库。 在Windows上,您可以使用“Windows 8中的平台encryption提供程序”一节中所述的NCrypt提供程序来阅读EK的公共部分。

TPM中的某个地方是RSA私钥。 那把钥匙被锁在那里 – 外面的世界永远不会看到。 我希望TPM用私钥签名(即用私钥对其进行encryption)。

所以我想要可能存在的最基本的操作:

在这里输入图像说明

用你的私钥encryption一些东西。 我甚至还没有要求更复杂的东西:

  • 根据PCR状态“密封”
  • 创build密钥并将其存储在易失性或非易失性内存中
  • 创build一个对称密钥并尝试将其加载到TPM中

我要求TPM可以做的最基本的操作。 为什么不可能得到有关如何做的信息?

我可以得到随机数据

当我说RSA签名是TPM可以做的最基本的事情时,我想我正在滑稽。 TPM可以要求做的最基本的事情是给我随机字节。 我已经想出了如何做:

 public Byte[] GetRandomBytesTPM(int desiredBytes) { //The maximum random number size is limited to 4,096 bytes per call Byte[] result = new Byte[desiredBytes]; BCRYPT_ALG_HANDLE hAlgorithm; BCryptOpenAlgorithmProvider( out hAlgorithm, BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG" MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" ie the TPM 0 //Flags ); try { BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0); } finally { BCryptCloseAlgorithmProvider(hAlgorithm); } return result; } 

花式的东西

我意识到使用TPM的人数非常less。 这就是为什么Stackoverflow上没有人有答案。 所以我不能太过贪婪的解决我的共同问题。 但是我真正想要做的是“封印”一些数据:

在这里输入图像说明

  • 提供TPM的一些数据(例如32字节的密钥材料)
  • 有TPMencryption数据,返回一些不透明的blob结构
  • 稍后请求TPM解密该blob
  • 只有当TPM的PCR寄存器与encryption期间的相同时,解密才会起作用。

换一种说法:

 Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr) { //... } Byte[] UnprotectBytes_TPM(Byte[] protectedBlob) { //... } 

密码学下一代(Cng,又名BCrypt)支持TPM

Windows中的原始encryptionAPI被称为Crypto API。

从Windows Vista开始,Crypto API已被replace为encryptionAPI:下一代 (内部称为BestCrypt ,缩写为BCrypt ,不要与密码散列algorithm混淆)。

Windows附带有两个BCrypt 提供程序

  • Microsoft Primitive ProviderMS_PRIMITIVE_PROVIDER默认 :所有基元的默认软件实现(哈希,对称encryption,数字签名等)
  • Microsoft平台encryption提供程序MS_PLATFORM_CRYPTO_PROVIDER ):提供TPM访问的提供程序

Platform Crypto提供程序未在MSDN上logging,但确实有来自2012 Microsoft Research站点的文档:

TPM平台encryption提供程序工具包

TPM平台encryption提供程序和工具包包含在Windows 8中使用TPM相关function的示例代码,实用程序和文档。所描述的子系统包括TPM支持的encryption下一代(CNG)平台encryption提供程序以及certificate服务提供程序可以使用新的Windowsfunction。 支持基于TPM1.2和TPM2.0的系统。

看来微软的意图是使用Cryptography NG API的Microsoft Platform Crypto Provider来展示TPMencryptionfunction。

使用Microsoft BCrypt进行公钥encryption

鉴于:

  • 我想执行RSA非对称encryption(使用TPM)
  • Microsoft BestCrypt支持RSA非对称encryption
  • Microsoft BestCrypt有一个TPM提供程序

一个前进的方法可能是弄清楚如何使用Microsoft Cryptography Next Gen API进行数字签名。

我的下一个步骤是使用标准提供程序( MS_PRIMITIVE_PROVIDER )提供使用BCrypt进行encryption的代码,并使用RSA公钥进行encryption。 例如:

  • modulus :0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 4F 40 9F D2 D1 69 FB 995D 85 0C 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 DE 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55
  • publicExponent :65537

使用该代码的function,我可以切换到使用TPM提供程序( MS_PLATFORM_CRYPTO_PROVIDER )。

2/22/2016:随着苹果被迫帮助解密用户数据,人们重新关注如何让TPM执行最为简单的任务 – 即encryption一些东西。

这大致相当于拥有汽车的每个人,但没有人知道如何启动汽车。 如果我们只能通过第一步 ,它可以做很有用的,很酷的事情。

奖金阅读

  • Android – encryption – 存储encryption的密钥
  • Android探索 – 重温Android的磁盘encryption
  • DPAPI的秘密。 DPAPI中的安全分析和数据恢复(第1部分)

底漆

以下全部关于TPM 1.2。 请记住,Microsoft需要所有未来Windows版本的TPM 2.0。 2.0代与1.2有根本的不同

由于TPMdevise原则,没有单线解决scheme。 将TPM看作是资源有限的微控制器。 它的主要devise目标是便宜,但仍然安全。 所以TPM被撕掉了所有对安全操作不必要的逻辑。 因此,TPM只有在你至less有一些软件的时候才能工作,并按照正确的顺序发出很多命令。 而这些命令序列可能会变得非常复杂。 这就是为什么TCG用明确定义的API来指定TSS的原因。 如果您想要采用Java方式,那么甚至还有一个高级的Java API 。 我不知道C#/ .net的类似项目

发展

在你的情况下,我build议你看看IBM的软件TPM。

  • 项目页面
  • 包装整个包裹

在包中你会发现3个非常有用的组件:

  • 一个软件TPM仿真器
  • 一个轻量级的tpm库
  • 一些基本的命令行工具

您不一定需要软件TPM仿真器,您也可以连接到机器的HW TPM。 但是,您可以拦截发出的命令并查看响应,从而了解它们如何组装以及如何与命令规范相对应。

高水平

先决条件:

  1. TPM被激活
  2. TPM驱动程序已加载
  3. 你已经掌握了TPM的所有权

为了密封一个blob,你需要做以下的事情:

  1. 创build一个密钥
  2. 将密钥块存储在某个地方
  3. 确保密钥已加载到TPM中
  4. 密封的一滴

开封你需要:

  1. 获得钥匙
  2. 将密钥加载到TPM
  3. 开封密封的斑点

您可以将key-blob存储在您用来存储受保护字节的数据结构中。

大部分您需要的TPM命令都是授权的命令。 因此,您需要在需要时build立授权会话。 AFAIR主要是OSAP会议。

TPM命令

目前我无法运行debugging版本,所以我无法为您提供确切的序列。 所以考虑一下你将不得不使用的无序列表:

  • TPM_OSAP
  • TPM_CreateWrapKey
  • TPM_LoadKey2
  • TPM_Seal

如果你想读取当前的PCR值,

  • TPM_PCRRead

可信和encryption的密钥

可信密钥和encryption密钥是添加到现有内核密钥环服务中的两种新密钥types。 这两种新types都是可变长对称密钥,在这两种情况下,所有密钥都在内核中创build,用户空间仅查看,存储和加载encryption的斑点。 可信密钥要求提供可信平台模块(TPM)芯片以提高安全性,而encryption密钥可用于任何系统。 为方便起见,所有用户级别的blob都以hexASCII显示和加载,并进行了完整性validation。

可信密钥使用TPM来生成和密封密钥。 密钥在TPM中的2048位RSA密钥下密封,并且可选地密封到指定的PCR(完整性测量)值,并且只有在PCR和BLOB完整性validation匹配的情况下才由TPM解封。 加载的可信密钥可以用新的(未来的)PCR值更新,所以密钥很容易迁移到新的pcr值,例如内核和initramfs更新时。 相同的密钥可以在不同的PCR值下有许多保存的斑点,所以很容易支持多个引导。

默认情况下,可信密钥在SRK中被密封,SRK具有默认授权值(20个零)。 这可以通过裤子的实用工具设置在大家的时间: tpm_takeownership -u -z

 Usage: keyctl add trusted name "new keylen [options]" ring keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring keyctl update key "update [options]" keyctl print keyid options: keyhandle= ascii hex value of sealing key default 0x40000000 (SRK) keyauth= ascii hex auth for sealing key default 0x00...i (40 ascii zeros) blobauth= ascii hex auth for sealed data default 0x00... (40 ascii zeros) blobauth= ascii hex auth for sealed data default 0x00... (40 ascii zeros) pcrinfo= ascii hex of PCR_INFO or PCR_INFO_LONG (no default) pcrlock= pcr number to be extended to "lock" blob migratable= 0|1 indicating permission to reseal to new PCR values, default 1 (resealing allowed) 

keyctl print返回密封键的asciihex副本,它是标准的TPM_STORED_DATA格式。 新密钥的密钥长度始终以字节为单位。 可信密钥可以是32 – 128个字节(256 – 1024位),上限是适合2048位SRK(RSA)密钥长度,具有所有必要的结构/填充。

encryption密钥不依赖于TPM,而且速度更快,因为它们使用AES进行encryption/解密。 新密钥由内核生成的随机数创build,并使用指定的“主”密钥进行encryption/解密。 “主”密钥可以是可信密钥或用户密钥types。 encryption密钥的主要缺点是,如果它们不是植根于可信密钥中的,则它们只与encryption它们的用户密钥一样安全。 因此,主用户密钥应尽可能安全地加载,最好是在启动之初。

encryption密钥的解密部分可以包含简单对称密钥或更复杂的结构。 更复杂结构的格式是特定于应用程序的,由“格式”标识。

 Usage: keyctl add encrypted name "new [format] key-type:master-key-name keylen" ring keyctl add encrypted name "load hex_blob" ring keyctl update keyid "update key-type:master-key-name" format:= 'default | ecryptfs' key-type:= 'trusted' | 'user' 

可信和encryption密钥用法的示例

创build并保存长度为32字节的名为“kmk”的可信密钥:

 $ keyctl add trusted kmk "new 32" @u 440502848 $ keyctl show Session Keyring -3 --alswrv 500 500 keyring: _ses 97833714 --alswrv 500 -1 \_ keyring: _uid.500 440502848 --alswrv 500 500 \_ trusted: kmk $ keyctl print 440502848 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b e4a8aea2b607ec96931e6f4d4fe563ba $ keyctl pipe 440502848 > kmk.blob 

从保存的blob加载一个可信任的密钥:

 $ keyctl add trusted kmk "load `cat kmk.blob`" @u 268728824 $ keyctl print 268728824 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b e4a8aea2b607ec96931e6f4d4fe563ba 

在新的pcr值下重新安装一个可信任的密钥:

 $ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`" $ keyctl print 268728824 010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805 77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73 d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4 9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6 e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610 94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9 7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8 

可信密钥的初始消费者是EVM,它在引导时需要高质量的对称密钥来保护文件元数据的HMAC。 可信密钥的使用提供了强有力的保证,确保EVM密钥没有受到用户级别问题的危害,并且密封到特定的引导PCR值时,可以防止引导和脱机攻击。 使用上面的可信密钥“kmk”创build并保存encryption密钥“evm”:

选项1:省略“格式”

 $ keyctl add encrypted evm "new trusted:kmk 32" @u 159771175 

选项2:明确定义“格式”为“默认”

 $ keyctl add encrypted evm "new default trusted:kmk 32" @u 159771175 $ keyctl print 159771175 default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc $ keyctl pipe 159771175 > evm.blob 

从已保存的blob中加载已encryption的密钥“evm”:

 $ keyctl add encrypted evm "load `cat evm.blob`" @u 831684262 $ keyctl print 831684262 default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc 

可信和encryption密钥的其他用途,例如磁盘和文件encryption的预期。 特别是已经定义了新格式“ecryptfs”,以便使用encryption密钥来安装eCryptfs文件系统。 有关用法的更多细节可以在文件“Documentation / security / keys-ecryptfs.txt”中find。

当它说

指定HMAC密钥

这并不意味着提供 HMAC密钥 – 这意味着要“指向您要使用的HMAC密钥”

正如本书所指出的,TPM可以使用几乎无限的HMAC密钥。 你必须告诉TPM使用哪一个。

Interesting Posts