1

设置:

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

问题:

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

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

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

4

2 回答 2

1

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

不使用 BouncyCastle

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

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

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

构建你自己的 BouncyCastle 守护进程

与 small-weight 类似gpg-agent,您可以编写自己的守护程序来处理所有密钥操作,同时不会暴露密钥(因此您有一个小型守护程序,出现严重错误的可能性要低得多;而大型,可能不安全和暴露的主应用程序可以向“代理”应用程序发送加密/解密请求)。

于 2014-12-01T16:51:44.743 回答
1

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

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

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

于 2014-12-01T16:47:10.283 回答