【问题标题】:Ensure public key safety on deployed software确保已部署软件的公钥安全
【发布时间】:2020-09-29 23:30:03
【问题描述】:

我想用我自己的公钥将我的应用程序发送给我的客户。当我的客户需要从我的应用程序中导出 IP 数据以进行调试时,将使用此密钥。这些数据只能由我自己读取。假设客户无法读取我的代码,也无法访问我的应用程序的内存,但能够识别应用程序内的我的公钥,并可能将其替换为他们的公钥,从而使他们可以读取导出。在开始导出之前,我有哪些选项可以确保我的公钥实际上是我自己的私钥的一对?

【问题讨论】:

  • 将公钥存储在代码中。如果他们无法读取代码或访问进程内存,他们将如何更换密钥?如果可以,他们甚至可以在加密之前访问您的出口。
  • 出于各种原因,我想避免烘烤它。我假设用户无法读取/写入代码,从而绕过安全检查或无法直接从内存中读取数据,以使事情变得更简单(或者可能更简单)。我想他们总是可以在我的代码上运行字符串,当然我可以通过在我的代码中进行更多的修改来尝试击败,但我想保留这个作为最后的选择。
  • 如果公钥不在代码中(例如在文件或URL中),则用另一个私钥对公钥签名,存储公钥为那个在代码中,并在使用前验证公钥上的签名。这就是 PKI 信任树的工作方式。您甚至可以为此重新使用 X509 证书机制。
  • 你的约束是矛盾的。如果他们无法读取您的代码,则他们无法读取您应用中的公钥,如果他们无法编写您的代码,则他们无法替换密钥。但是,正如@Seva 指出的那样,在代码中硬编码一些公钥就是它的完成方式。如果每个浏览器、操作系统和计算环境都可以承受这种限制,那么您也可以做到。
  • @SevaAlekseyev:我的真正意思是,无论你提供什么答案,OP 都会说它不够好。

标签: encryption public-key-encryption public-key pki


【解决方案1】:

如果我们假设 OP 的威胁模型,特别是攻击者没有调试应用程序和/或以某种方式在运行时弄乱进程的内存,应用程序应在执行加密之前验证公钥,无论公钥来自何处。

按强度递减顺序:

  • 来自公共证书颁发机构的数字签名(将付费),依赖于系统受信任的根
  • 使用 OP 拥有的另一个私钥进行数字签名(在应用程序中硬编码公钥)
  • 具有硬编码秘密的公钥的 HMAC
  • 公钥的散列

在 RSA 密钥的情况下,模数几乎可以识别公钥。无论如何,我熟悉的大多数 RSA 供应商实现中的公共指数都硬编码为 65537。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多