【问题标题】:How to use public key OpenPGP(GPG) without access to physical key ring in Java如何在不访问 Java 中的物理密钥环的情况下使用公钥 OpenPGP(GPG)
【发布时间】:2015-01-29 16:57:02
【问题描述】:

设置:

  • Linux 与 GnuPG 或 Windows 与 GPG4Win(OpenPGP)
  • 一个可以访问密钥环的特权用户创建了一个 2048 RSA 密钥对
  • 已为 Java 应用程序创建了第二个低权限用户来运行
  • 已授予此用户运行 GPG 命令的权限,但无法访问物理密钥环文件
  • Java 应用程序知道密钥 ID,提取私钥的密码短语也是如此
  • Java 应用程序已导入 Bouncycastle 库
  • java 程序需要使用密钥对执行加密和解密

问题:

我已经使用 Bouncycastle 成功执行了加密和解密。但它涉及尝试从发布和保密文件中读取公钥和私钥。 为了安全起见,我宁愿不让 java 应用程序直接访问密钥环文件。

我有什么选择。 Bouncycastle 中是否有任何选项可以在不读取密钥环或将密钥导出到单独文件的情况下执行此操作

注意:不需要使用充气城堡。

【问题讨论】:

  • 不读就不能使用这些键。你期待什么样的答案?比如弄清楚你必须以特权用户身份执行哪些命令?
  • 所以我真的不知道。也许答案是否定的,它做不到。也许这是与更安全的密钥代理进行通信的某种方式。也许它是一个众所周知的基于 jni 的实现或其他一些执行 gpg 命令的实现。但我的想法是,我宁愿不允许正在运行应用程序的用户访问物理密钥环文件。

标签: java security bouncycastle openpgp


【解决方案1】:

您的 Java 应用程序可以使用执行该应用程序的用户当前拥有的任何权限调用 gnupg。幸运的是,gnupg 支持大量command-line options,允许您提供所有必要的参数并读取/收集状态和结果,例如-batch-options-status-fd。您可以从 Java 调用程序并使用 Java 的 ProcessBuilder 或更高级别的库(例如 Plexus Utils)读回它们的结果

另一方面,至少有一个java-based wrapper library 直接与 GnuPG 可执行文件对话。虽然依赖于平台,但与为每个事务生成进程相比,这可能具有速度优势;并且可能会为您节省大量执行工作来确定命令行选项。

请注意,以这种方式使用 GnuPG 会完全绕过 BouncyCastle - 您将自动调用 GnuPG,有效地将其用作您的“库”。

【讨论】:

  • 太棒了。感谢您提供信息,尤其是指向 java wrapper library 链接的链接。看了5年没更新的master,放弃了。但我看到这个分支或多或少得到了很好的维护。我会试一试。
【解决方案2】:

BouncyCastle 需要直接访问密钥文件,包括公钥和私钥。

不使用 BouncyCastle

如果您想阻止 Java 应用程序访问密钥文件,但仍将其用于加密和解密,您可能会成功使用 GnuPG 2.1,它将所有需要访问私有密钥环的操作卸载到 gpg-agent。一个可能有效的设置看起来有点像这样:

  • 开始gpg-agent
  • 限制对 Java 应用程序的访问,使其可以访问 gpg-agent 套接字,但不能访问私钥文件

在 Linux 中,您可以考虑对套接字和密钥环文件使用 chroot 或适当的权限。在 Windows 中,可能会有类似沙盒的解决方案。

构建您自己的 BouncyCastle 守护进程

类似于轻量级的gpg-agent,您可以编写自己的守护程序来处理所有密钥操作,同时不暴露密钥(因此您有一个小型守护程序,其关键的可能性要低得多错误;而大型、可能不安全且暴露的主应用程序可以向“代理”应用程序发送加密/解密请求)。

【讨论】:

  • 感谢您的宝贵意见。我很感激。有关如何从 java 应用程序与 gpg-agent 通信的任何建议。我真的很喜欢将应用程序分解为 gpg 守护程序和主应用程序的想法。
  • 虽然这可能是一种可能的方式来走硬路线并自己实现与代理的通信(the protocol is described in the GnuPG documentation,我宁愿去调用 GnuPG 应用程序。当只与gpg-agent,您仍然需要在其他地方使用公钥进行 加密 并在应用程序中处理对称解密,因为代理只是解密并返回(对称)会话密钥,这与每条加密消息。
  • 再次感谢您的信息。查看文档,我也担心我可能会试图让自己陷入太多,所以我在你建议将应用程序拆分为主要和小应用程序之间存在分歧,在提升的权限下充当 gpg 代理与上面@tucuxy 的答案。
猜你喜欢
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多