1

我的 Java 应用程序需要处理加密文件。这是工作流程:

  1. 客户加密文件(例如 RSA 加密)并将它们上传到 Amazon S3。
  2. 我的 Java 应用程序从 AS3 中提取文件。
  3. 我的 Java 应用程序解密文件。
  4. 我的 Java 应用程序使用解密的文件创建其他文件。
  5. 我的 Java 应用程序使用不同的密钥加密新文件并上传到 AS3。
  6. 客户拿起文件。
  7. 客户解密文件。

Amazon S3 提供用于下载/上传、解密/加密的 Java 类。此 API 将作为输入java.security.KeyPair。我不确定客户应该如何提供 My Java 应用程序的密钥,以便应用程序可以获取密钥java.security.KeyPair

在客户和应用程序之间交换密钥的正确方法是什么?可以使用哪种密钥文件格式?

4

2 回答 2

3

通常,非对称加密/解密的工作方式如下:

  • 您生成一个私钥/公钥对。私钥应保密,不应四处发送等。公钥可以提供给客户而无需担心安全问题。
  • 现在客户用这个公钥加密他的文件。加密文件只能用私钥解密。因此,用户可以将文件发送给您(在您的情况下通过 Amazon S3)。
    • 您收到文件并使用您的私钥对其进行解密。

现在您已经从客户那里获得了一份文件。为了能够发回加密的消息,您需要另一个公钥/私钥对。这一次,客户必须是唯一知道私钥的人。例如,他可以将公钥放入他发送给您的文件中。无论如何,您需要以某种方式从他那里获得公钥。使用该密钥,您可以加密文件并将它们发送到 Amazon S3。用户拿起它们并用他的私钥解密它们。

所以,客户不能给你一个java.security.KeyPair,因为那些包含私钥。发送私钥是不安全的。但他可以将公钥作为java.security.PublicKey. 我认为最好的方法是将其发送给您,无论是在他提供的文件中,还是在他同时上传的单独文件中以及提供的文件之外。

于 2012-12-07T15:44:18.197 回答
1

问题是您还没有分配信任的方法。幸运的是,有一个运行良好:TLS。TLS 证书存储在浏览器中(如果您需要胖客户端,则存储在 JRE 中)。

您的密钥对应在本地生成(或在安全机器上生成并导入)。私钥应始终保持安全。客户使用 TLS 连接到您的站点,并下载您的公钥。然后客户上传他的密钥对的公钥。这可以在某些设置/配置阶段执行。

现在客户可以为您加密文件,您也可以为客户加密文件。请注意,TLS 已经提供加密(机密性)。因此,您获得的是文件在存储过程中受到保护,传输之后。一旦您信任公钥(和可信赖的系统),您就可以通过纯 HTTP 发送文件。

添加签名非常重要,否则任何人都可以替换存储中的文件。可能还需要一些审计日志,否则文件可能会被删除。

其他方案是可能的(我更喜欢用于文件加密/解密的 PGP 方案),但它们需要密钥的带外通信。请注意,这只是基本方案,有很多陷阱,但为您的应用程序制定特定的安全架构显然是题外话。

于 2012-12-08T15:19:56.060 回答