问题标签 [tpm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
347 浏览

tpm - 嵌入式系统中的 TPM 密钥库解锁

在 PC 上使用 TPM 时,您通常通过用户可以输入的密码来解锁密钥库。然而,在嵌入式系统中,通常不存在可以输入密码的用户。是否有其他方法可以解锁 TPM 密钥存储?例如,有没有办法指定如果测量引导 PCR 具有某个值,则密钥存储被解锁?逻辑是,如果系统正在运行预期的软件,则可以打开密钥库。或者当没有用户输入密码时,还有其他方法可以解锁密钥库吗?

0 投票
1 回答
247 浏览

security - Windows 远程证明

我正在构建一个分布式应用程序,其中我的公司将软件安装在我们客户的硬件上。因此,客户可以篡改软件。我想知道是否存在一种技术,以便当客户硬件上运行的软件向我们的中央服务器(即完全在我们的控制之下)发出网络请求时,我们可以验证该请求来自我们软件的未篡改版本.

我相信这被称为“远程证明”。有关远程证明的 Web 搜索会返回各种结果,从“不可能”到“使用 TPM”。但是我还没有找到一个简单易懂的例子来说明如何在 Windows 中编写代码。

所以,我的问题是:在 Windows 中是否可以进行远程证明,如果可以,是否有一个工作示例可以用作实施的基础?

注意:远程证明有时是通过“隐藏”技术实现的,例如将“共享秘密”嵌入到应用程序中,然后以各种方式隐藏它,以确保攻击者无法通过反编译等轻松提取该共享秘密。我对此类技术不感兴趣,并且正在寻找能够提供真正安全性而不是通过默默无闻提供安全性的东西。

0 投票
1 回答
53 浏览

virtualization - 是否可以从 SRTM 访问 TPM 的位置 2 寄存器?

我们正在设计一个使用虚拟化和 TPM 的解决方案。我们的目的是利用其位置来控制对某些 PCR 的访问。问题是从静态引导管理程序或来宾操作系统读取位置 2 中的状态寄存器是否有意义?如果我理解正确,管理程序和客户操作系统位于位置 0,似乎没有什么可以阻止它们读取寄存器。

0 投票
4 回答
23093 浏览

c# - 如何使用 TPM(可信平台模块)加密字节

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

加密保护数据

Windows 提供了一个(相对)简单的 API 来使用 API 加密 blob CryptProtectData,我们可以将其包装一个易于使用的函数:

的细节ProtectBytes不如您可以很容易地使用它的想法重要:

  • 这是我想通过保存在System
  • 把加密的 blob 还给我

返回的blob是一个未记录的文档结构,其中包含解密和返回原始数据所需的一切(散列算法、密码算法、盐、HMAC 签名等)。

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

如何对 TPM 做同样的事情?

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

现在是时候更进一步了。我想加密一些只能由本地 TPM 解密的数据(例如硬盘加密主密钥)。换句话说,我想用Windows 中的 TPM 替换下面针对 Android 的框图中的 Qualcomm 可信执行环境 ( TEE ):

在此处输入图像描述

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

那么代码在哪里呢?

问题是 TPM 编程在 MSDN 上完全没有记录。没有可用于执行任何操作的 API。相反,您必须为自己找到一份Trusted Computing Group 的软件堆栈(又名 TSS),找出要发送到 TPM 的命令、有效负载、按什么顺序,然后调用Window 的Tbsip_Submit_Command函数直接提交命令:

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

这相当于尝试通过向硬盘发出 SATA I/O 命令来创建文本文件

为什么不只使用裤子

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

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

  • OpenSSL
  • 线程

我只想让代码用我的 TPM 加密一些东西。

以上CryptProtectData只需要函数体中的内容。

使用 TPM 加密数据的等效代码是什么?正如其他人所指出的,您可能必须查阅三本 TPM 手册,然后自己构建 blob。它可能涉及TPM_seal命令。虽然我觉得我不想数据,但是我想我想绑定一下:

绑定– 使用 TPM 绑定密钥加密数据,这是从存储密钥派生的唯一 RSA 密钥。 密封– 以与绑定类似的方式加密数据,但另外指定了 TPM 必须处于的状态才能解密数据(未密封)

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

但我知道我在读什么。如果有任何类型的教程或示例,我可能会有机会。但我完全迷失了。

所以我们问 Stackoverflow

以同样的方式,我能够提供:

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

除了在 LSA 中锁定的密钥之外System,在 TPM 中锁定的密钥是否相同?

研究开始

我不知道确切的绑定是什么意思。但是查看 TPM Main - 第 3 部分命令 - 规范版本 1.2,提到了bind

10.3 TPM_UnBind

TPM_UnBind 获取作为 Tspi_Data_Bind 命令结果的数据 blob 并将其解密以导出给用户。调用者必须授权使用将解密传入 blob 的密钥。TPM_UnBind 以逐块为基础进行操作,并且不知道一个块与另一个块之间的任何关系。

令人困惑的没有Tspi_Data_Bind命令。

研究工作

令人震惊的是,从来没有人费心记录 TPM 或其操作。就好像他们把所有的时间都花在了想出这个很酷的东西上来玩,但不想处理让它用于某些东西的痛苦步骤

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

第 3 章 - TPM 2.0 快速教程

TPM 可以访问自己生成的私钥,因此它可以使用公钥加密密钥,然后将生成的 blob 存储在硬盘上。这样,TPM 可以保留几乎无限数量的可用密钥,但不会浪费宝贵的内部存储空间。存储在硬盘上的密钥可以擦除,但也可以备份,这在设计者看来是一个可以接受的折衷方案。

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

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

应该使用 TPM 但不使用的应用程序

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

开发人员如何锁定 TPM 的密钥?

第 9 章 - 等级制度

用例:存储登录密码

典型的密码文件存储密码的加盐哈希。验证包括对提供的密码进行加盐和散列处理,并将其与存储的值进行比较。因为计算不包括秘密,所以它会受到对密码文件的离线攻击。

此用例使用 TPM 生成的 HMAC 密钥。密码文件存储加盐密码的 HMAC。验证包括对提供的密码进行加盐和 HMAC 处理,并将其与存储的值进行比较。由于离线攻击者没有 HMAC 密钥,因此攻击者无法通过执行计算来发起攻击。

可以工作。如果 TPM 有一个秘密 HMAC 密钥,并且只有我的 TPM 知道 HMAC 密钥,那么我可以用“HMAC”替换“签名(又名 TPM 用它的私钥加密)”。但在接下来的一行中,他完全颠倒了自己:

TPM2_Create,指定 HMAC 密钥

如果我必须指定 HMAC 密钥,这不是 TPM 机密。当您意识到这是关于 TPM 提供的加密实用程序的章节时,HMAC 密钥不是秘密的事实是有意义的。您不必自己编写 SHA2、AES、HMAC 或 RSA,您可以重新使用 TPM 已经存在的内容。

第 10 章 - 钥匙

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

出色的!你怎么做呢!?

密钥生成器

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

TPM是否能够生成加密密钥并在硬件边界内保护其机密?是这样,怎么样?

第 12 章 - 平台配置寄存器

授权 PCR

用例:将硬盘加密密钥密封到平台状态

如果 TPM 保护加密密钥,则全盘加密应用程序比将其存储在同一个磁盘上(仅受密码保护)要安全得多。首先,TPM 硬件具有反锤击保护(TPM 字典攻击保护的详细描述见第 8 章),使得对密码的暴力攻击变得不切实际。仅受软件保护的密钥更容易受到弱密码的攻击。其次,存储在磁盘上的软件密钥更容易被窃取。拿走磁盘(或磁盘的备份),你就得到了密钥。当 TPM 持有密钥时,整个平台,或者至少是磁盘和主板,都必须被盗。

密封允许密钥不仅受密码保护,而且受策略保护。典型的策略将密钥锁定为在密封时当前的 PCR 值(软件状态)。这假设第一次启动时的状态没有受到损害。首次启动时存在的任何预装恶意软件都将被测量到 PCR 中,因此密钥将被密封到受损的软件状态。不太信任的企业可能有一个标准的磁盘映像和代表该映像的 PCR 的印章。这些 PCR 值将在可能更受信任的平台上预先计算。更复杂的企业将使用 TPM2_PolicyAuthorize,并提供多个票证来授权一组受信任的 PCR 值。参见第 14 章,详细描述策略授权及其解决 PCR 脆性问题的应用。

尽管密码也可以保护密钥,但即使没有 TPM 密钥密码,也可以获得安全性。攻击者可以在不提供 TPMkey 密码的情况下启动平台,但在没有操作系统用户名和密码的情况下无法登录。OSsecurity 保护数据。攻击者可以启动替代操作系统,例如从实时 DVD 或 USB 记忆棒,而不是从硬盘驱动器,以绕过操作系统登录安全性。但是,这种不同的引导配置和软件会改变 PCR 值。由于这些新的 PCR 与密封值不匹配,TPM 不会释放解密密钥,因此硬盘驱动器无法解密。

出色的!这正是我碰巧想要的用例。这也是微软使用 TPM 的用例。我该怎么做!?

所以我读了整本书,它没有提供任何有用的信息。这令人印象深刻,因为它有 375 页。你想知道这本书包含什么 - 回顾它,我不知道。

因此,我们放弃了 TPM 编程的权威指南,转而使用 Microsoft 的一些文档:

来自Microsoft TPM Platform Crypto-Provider Toolkit。它确切地提到了我想要做的事情:

背书密钥或 EK

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

TPM 内部的某处是 RSA 私钥。那把钥匙被锁在那里——永远不会被外界看到。我希望 TPM 用它的私钥签署一些东西(即用它的私钥加密它)。

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

在此处输入图像描述

用你的私钥加密一些东西。我什至(还)没有要求更复杂的东西:

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

我要求 TPM 可以做的最基本的操作。为什么无法获得有关如何操作的任何信息?

我可以得到随机数据

当我说 RSA 签名是 TPM 可以做的最基本的事情时,我想我是在胡说八道。可以要求 TPM 做的最基本的事情是给我随机字节已经弄清楚该怎么做:

花哨的东西

我意识到使用 TPM 的人数非常少。这就是为什么 Stackoverflow 上没有人有答案的原因。所以我真的不能太贪婪地为我的常见问题找到解决方案。但我真正想做的是“密封”一些数据:

在此处输入图像描述

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

换句话说:

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

Windows 中最初的 Cryptography API 被称为 Crypto API。

从 Windows Vista 开始,Crypto API 已被Cryptography API: Next Generation(内部称为BestCrypt,缩写为BCrypt ,不要与密码散列算法混淆)取代。

Windows 附带两个 BCrypt提供程序

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

TPM 平台加密提供者工具包

TPM 平台加密提供程序和工具包包含用于在 Windows 8 中使用 TPM 相关功能的示例代码、实用程序和文档。描述的子系统包括 TPM 支持的 Crypto-Next-Gen (CNG) 平台加密提供程序,以及证明服务提供程序如何可以使用新的 Windows 功能。支持基于 TPM1.2 和 TPM2.0 的系统。

Microsoft 的意图似乎是通过 Cryptography NG API 的Microsoft Platform Crypto Provider来展示 TPM 加密功能。

使用 Microsoft BCrypt 的公钥加密

鉴于:

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

我的下一步将是使用标准提供程序(MS_PRIMITIVE_PROVIDER)使用 RSA 公钥在 BCrypt 中进行加密。例如:

  • 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 7 F 16 2 A B9 F6 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 9 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

使用该代码功能,我可能能够切换到使用 TPM 提供程序 ( MS_PLATFORM_CRYPTO_PROVIDER)。

2016 年 2 月 22 日:随着 Apple 被迫帮助解密用户数据,人们对如何让 TPM 执行最简单的任务——加密某些东西——重新产生了兴趣。

这大致相当于每个人都拥有一辆车,但没有人知道如何启动它。它可以做非常有用和酷的事情,只要我们能通过Step 1

微软密钥存储 API

Microsoft 的TPM Base Services存档文档主页说我们可能希望使用密钥存储 API:

笔记

TPM 可用于密钥存储操作。但是,我们鼓励开发人员将密钥存储 API 用于这些场景。密钥存储 API提供了创建、签名或加密以及保存加密密钥的功能,对于这些目标场景,它们比 TBS 更高级且更易于使用。

Key Storage API档案的介绍说:

密钥存储架构

CNG 提供了一个私钥存储模型,允许适应当前和未来创建使用密码学特性(如公钥或私钥加密)的应用程序的需求,以及存储密钥材料的需求。密钥存储路由器是该模型的中心例程,在 Ncrypt.dll 中实现。应用程序通过密钥存储路由器访问系统上的密钥存储提供程序 (KSP),该路由器对应用程序和存储提供程序本身隐藏了诸如密钥隔离等细节。下图展示了 CNG 密钥隔离架构的设计和功能。

在此处输入图像描述

他们注意到支持硬件安全模块(可能是 TPM 的术语):

如上所述,可以支持广泛的硬件存储设备。在每种情况下,所有这些存储设备的接口都是相同的。它包括执行各种私钥操作的功能以及与密钥存储和管理有关的功能。

我唯一不知道的是您是否必须要求使用 HSM,或者它是否在可用时自动发生(以及如何知道它何时不可用 - 所以您无论如何都不要尝试继续)。

奖金阅读

0 投票
1 回答
160 浏览

tpm - 使用 TPM 加密文件夹,以便只有我的程序可以访问密钥

我希望能够加密一个文件夹,然后让我的程序只能解密该文件夹。我知道我可能必须让我的程序以自己的用户身份运行,但我想知道是否已经有 TPM 所有者,即使我的程序是请求的程序,该所有者是否可以访问我存储的密钥存储了那个密钥?

我不介意管理员是否能够删除加密文件夹,但我不希望计算机的任何用户能够获取密钥并解密内容。

编辑:https ://play.google.com/store/books/details?id=F69zBgAAQBAJ&rdid=book-F69zBgAAQBAJ&rdot=1&source=gbs_vpt_read&pcampaignid=books_booksearch_viewport

因此,根据本文,这是一种可能的情况,但您必须向 TPM 传递一个 authValue 才能对实体进行操作。

但是如果你的程序在内存中运行并且可以推断出这个值,你将如何存储这个 authValue 呢?

0 投票
1 回答
655 浏览

wmi - 是否可以在远程计算机上为 MicrosoftTPM 命名空间查询 WMI?[对 Win32_Tpm 类的远程 WMI 查询失败,HRESULT 0x80041013]

我正在尝试从远程机器查询 WMI 的 Win32_Tpm 类。但它失败并显示 HRESULT 0x80041013 和描述:提供程序加载失败。是否可以远程访问 MicrosoftTPM 命名空间?以下是代码,

//这里我失败了hrs = 0x80041013和uReturn = 0,TPMClass的值在执行上述语句后也为NULL。

下面是详细的代码,

0 投票
1 回答
29 浏览

tpm - 如果我们想使用 TPM v1.2 中定义的附加 loaclities,是否必须使用 TXT 引导?

我对阅读 TPM 规范感到困惑。它说 DRTM 是新的地方打算与之合作的。但是 DRTM(intel 平台上的 TXT)是否一定需要使用 localities 1 及以上?

0 投票
1 回答
197 浏览

emulation - 使用 TSS 测试套装运行 Mario 的 TPM 模拟器

我正在尝试使用 TrouSerS(TSS 测试 API)和 TSS API 测试套件运行 Mario 的 TPM 模拟器( https://github.com/PeterHuewe/tpm-emulator )。到目前为止,我已经使用 IBM 的模拟器运行了整个设置,包括裤子堆栈和测试套件。到目前为止,我已经成功编译并安装了它。当我启动 tpmd 时,默认的自检也通过了。但我不确定配置它需要哪些配置或命令,以便我可以将它与 TSS API 测试套件一起使用。

0 投票
1 回答
737 浏览

linux - 交叉编译 tpm-tool

我正在尝试为 powerpc 交叉编译 tpm-tools。我用于配置的命令是:

我已将 CC 变量设置为 apt 位置,但仍然出现错误:

检查 -ltspi 中的 Tspi_Context_Create ... 否

配置:错误:未找到 tss lib:libtspi.so

我不明白为什么当我将 tpm-tools 配置为使用静态库时,它会搜索共享库。任何帮助将非常感激。

0 投票
1 回答
167 浏览

java - jTSS“似乎没有 TCS 正在运行”

我想在我的 Ubuntu 14.04 64 位上使用 jTSS,我有一个 1.2 版的硬件 TPM。我安装了 .deb 就像第 4.3 节中所说的那样http://trustedjava.sourceforge.net/index.php?item=jtss/readme 我启动了守护进程:jtss(TCS 运行)

但是,如果我想在你的包(run_tests_simple.sh 或 run_test.sh)中运行测试,我会遇到错误:“错误!无法初始化 TSP-TCS 绑定。jTSS Wrapper 和 jTSS 都已尝试。检查 TSP 配置文件。”

使用这个命令'jtt tpm_version',我有同样的错误:

我删除了裤子,但保留在 /etc/group 中:tss:x:126:root,jtss