我被要求使用TPM为具有TPM芯片的x86_64设备实现许可加密狗的数量.基本上所需要的是确保为设备发布的软件只能在设备本身上运行,这样如果软件迁移到虚拟机或不同的硬件,它将拒绝运行.
我不认为该解决方案可以抵抗逆向工程,而是一种典型的"加密狗"类型解决方案,它会阻碍普通用户并使企业客户保持诚实.
我已经成功构建并包含了TPM模块,以及TrouSerS和openssl-tpm-engine代码 - 我可以成功获得TPM的所有权,但除此之外,可用的文档并不完全涵盖这个用例 - 或者如果我到目前为止一直无法找到一个简单的英语解决方案.
我希望尽可能依赖TPM中存储的私钥的秘密性质,而不是利用平台组件哈希(硬盘驱动器可能会死,CPU可能会被替换等等.我宁愿犯错客户端,以便在例行硬件升级后系统不会变得不可用.
同样,理想情况下我怀疑此解决方案可以设计为在制造过程中收集每个设备的公钥并将其添加到签名钥匙串中,以便可以针对每个设备可能存储在TPM中的单个密钥对软件进行签名,而不是要求多次签署软件?我可能会在这里弄错,但必须有一些满足平台认证方法的批量方法,否则看起来很难扩展.
如果设备是由您设置的,您可以遵循以下方案:
A. 发货前:
B. 准备申请:
C. 启动应用程序时:
注 1:从理论上讲,此解决方案是不安全的,因为可以修补二进制文件。你知道这一点,所以这应该有效。
注意 2:如果设备不是您自己设置的,您就不能信任客户可能给您的公钥。
编辑 1:更准确地解释某些要点
@A.2:由于我使用jtt & jTSS而不是 TrouSerS,我不知道 TrouSerS 包中是否包含用于创建密钥的命令行工具。但我确信它提供了正确的 API 来做到这一点。无论如何,例如 jtt 有一个执行create_key此操作的命令。当您使用此工具时,您会遇到 jTSS 和 TrouSerS 的密钥库与 AFAIK 不兼容的问题。
@A.3:不,除了存储根密钥 (SRk) 和背书密钥 (EK) 之外,TPM 中没有存储任何密钥。但是 TPM 保证属于 TPM 的密钥的任何私有部分都不会以未加密的格式出现在 TPM 之外。所以你有一个密钥库,它以某种方式由包含加密密钥材料的可信软件堆栈(TSS -> jTSS,TrouSerS)管理。TSS 还负责在使用 TPM 之前将正确的密钥加载到 TPM 中,例如用于签名操作。
@C*:应用端的加密部分是相当标准的。我不知道你在那个领域的知识如何。对于 TPM 部分,TSS 再次提供高级 API。我不知道是否有用于使用 TPM 进行签名的现有命令行工具。
| 归档时间: |
|
| 查看次数: |
2294 次 |
| 最近记录: |