如何使用公钥OpenPGP(GPG)而无需访问Java中的物理密钥环

时间:2014-12-01 16:19:28

标签: java security bouncycastle openpgp

设定:

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

问题:

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

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

注意:不需要使用Bouncy城​​堡。

2 个答案:

答案 0 :(得分:1)

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

)读取其结果

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

请注意,使用GnuPG完全绕过BouncyCastle - 您可以自动调用GnuPG,有效地将其用作您的"库"。

答案 1 :(得分:1)

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

不使用BouncyCastle

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

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

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

构建自己的BouncyCastle Daemon

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