gpt4 book ai didi

linux - 如何在 Linux 上使用 TPM 实现平台许可证 "dongle"?

转载 作者:IT王子 更新时间:2023-10-29 00:33:17 29 4
gpt4 key购买 nike

有人要求我为具有 TPM 芯片的 x86_64 设备实现相当于使用 TPM 的许可证加密狗。本质上需要的是确保为设备发布的软件只能在设备本身上运行,这样如果软件被迁移到虚拟机或不同的硬件,它将拒绝运行。

我不希望该解决方案能够抵抗逆向工程,而是一种典型的“加密狗”类型的解决方案,它会阻碍普通用户并保持企业客户的诚实。

我已成功构建并包含 TPM 模块,以及 TrouSerS ,以及 openssl-tpm-engine 代码——我可以成功获得 TPM 的所有权,但除此之外,可用的文档并没有完全涵盖这个用例——或者如果它涵盖了,我到目前为止还无法找到一个简单的英语解决方案。

如果可能的话,我更愿意依赖存储在 TPM 中的私钥的 secret 性质,而不是利用平台组件哈希(硬盘驱动器可能会坏掉,CPU 可能会被更换,等等。我宁愿客户一方会犯错,以便系统在例行硬件升级后不会变得不可用。

此外,理想情况下,我怀疑此解决方案可以设计为在制造过程中收集每个设备的公钥并将其添加到签名钥匙串(keychain)中,以便可以根据每个设备可能存储的单个 key 对软件进行签名在 TPM 中,而不是要求对软件进行多次签名?我在这里可能会弄错,但必须有一些批量方法来满足平台身份验证方法,否则它似乎很难扩展。

最佳答案

如果设备是由您设置的,您可以遵循以下方案:

一个。发货前:

  1. 取得所有权 - 同时创建存储根 key (SRK)
  2. 创建不可迁移的签名 key
  3. 将包装后的 key 存储在平台上受信任的 keystore 中
  4. 将创建的 key 的公钥存储在您的数据库/文件系统/什么地方

B.准备申请:

  1. 您必须将公钥与应用程序的二进制文件一起发送
  2. 我不会将公钥编译成二进制文件,相反我更愿意使用类似 CA 系统的系统,其中只编译根 CA 公钥。然后可以将 TPM 签名 key 的公共(public)部分作为证书文件发送。这样可以防止为每个设备单独编译二进制文件。

C.启动应用程序时:

  1. 创建一个 NONCE
  2. 让TPM签署NONCE
  3. 阅读证书并验证
  4. 从经过验证的证书中提取公钥
  5. 使用获取的公钥验证TPM返回的签名(当然还要检查签名数据是否等于NONCE)
  6. 如果签名有效=> 你很高兴

注意 1: 从理论上讲,此解决方案是不安全的,因为二进制文件可以修补。你知道这一点,所以这应该有效。

注意 2:如果设备不是您自己设置的,您就不能相信客户可能给您的公钥。


编辑 1: 更准确地解释某些要点

@A.2:因为我使用 jtt & jTSS而不是 TrouSerS 我不知道 TrouSerS 包中是否包含用于创建 key 的命令行工具。但我确信它提供了适当的 API 来执行此操作。无论如何,例如 jtt 有一个执行此操作的命令 create_key。当您使用此工具时,您会遇到 jTSS 和 TrouSerS 的 key 存储据我所知不兼容的问题。

@A.3:不,除了存储根 key (SRk) 和认可 key (EK) 之外,TPM 中没有存储任何 key 。但是 TPM 保证属于 TPM 的 key 的任何私有(private)部分都不会以未加密的格式出现在 TPM 之外。所以你有一个 keystore ,它以某种方式由包含加密 key Material 的可信软件堆栈(TSS -> jTSS,TrouSerS)管理。 TSS 还负责在使用它们进行签名操作之前将正确的 key 加载到 TPM 中。

@C*:应用端的加密部分是相当标准的。我不知道你在那个领域的知识如何。对于 TPM 部分,TSS 再次提供高级 API。我不知道是否存在用于使用 TPM 进行签名的现有命令行工具。

关于linux - 如何在 Linux 上使用 TPM 实现平台许可证 "dongle"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117772/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com