如何与客户交换加密密钥?

时间:2012-12-07 15:11:30

标签: java encryption amazon-s3 cryptography

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

  1. 客户加密文件(例如RSA加密)并将其上传到Amazon S3。
  2. 我的Java应用程序从AS3中获取文件。
  3. 我的Java应用程序解密文件。
  4. 我的Java应用程序使用解密的文件创建其他文件。
  5. 我的Java应用程序使用不同的密钥加密新文件并上传到AS3。
  6. 客户选择文件。
  7. 客户解密文件。
  8. Amazon S3提供用于下载/上传,解密/加密的Java类。此API用作输入java.security.KeyPair。我不确定客户应该如何提供My Java应用程序的密钥,以便应用程序可以获得java.security.KeyPair密钥?

    在Customer和App之间交换密钥的正确方法是什么?可以使用哪种密钥文件格式?

2 个答案:

答案 0 :(得分:3)

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

  • 您生成私钥/公钥对。私钥应该保密,不应该被发送等。公钥可以在没有安全问题的情况下提供给客户。
  • 现在客户使用此公钥加密他的文件。加密文件只能 使用私钥解密。因此,用户可以将文件发送给您(在您的情况下通过Amazon S3)。
    • 您收到该文件并使用您的私钥解密。

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

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

答案 1 :(得分:1)

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

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

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

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

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