我的Java应用程序需要处理加密文件。这是工作流程:
Amazon S3提供用于下载/上传,解密/加密的Java类。此API用作输入java.security.KeyPair
。我不确定客户应该如何提供My Java应用程序的密钥,以便应用程序可以获得java.security.KeyPair
密钥?
在Customer和App之间交换密钥的正确方法是什么?可以使用哪种密钥文件格式?
答案 0 :(得分:3)
通常,非对称加密/解密的工作原理如下:
现在您已收到客户的文件。为了能够发回加密的消息,您需要另一个公钥/私钥对。这一次,客户必须是唯一知道私钥的人。他可以 - 例如 - 将公钥放入他发给你的文件中。无论如何,你需要从他那里得到一把公钥。使用该密钥,您可以加密文件并将其发送到Amazon S3。用户拿起它们并用他的私钥解密它们。
因此,客户不得为您提供java.security.KeyPair
,因为其中包含私钥。发送私钥是不安全的。但他可以将公钥作为java.security.PublicKey
发送给您。我认为最好的方法是将其发送给他,无论是在他提供的文件中,还是在他同时上传的单独文件中以及提供的文件之外。
答案 1 :(得分:1)
问题是您还没有分发信任的方法。幸运的是,有一个工作得相当好:TLS。 TLS证书存储在浏览器中(如果您需要胖客户端,则存储在JRE中)。
您的密钥对应在本地生成(或在安全的计算机上生成并导入)。私钥应该始终保持安全。客户使用TLS连接到您的站点,并下载您的公钥。然后客户上传其密钥对的公钥。这可以在某些设置/配置阶段执行。
现在客户可以为您加密文件,您可以为客户加密文件。请注意,TLS已提供加密(机密性)。因此,您获得的是文件在存储期间受到保护,在传输之后。一旦您信任公钥(以及值得信赖的系统),您就可以通过普通HTTP发送文件。
添加签名非常重要,否则任何人都可以替换存储中的文件。也可能需要一些审计日志记录,否则文件可能会被删除。
其他方案也是可能的(我更喜欢用于文件加密/解密的PGP方案),但它们需要密钥的带外通信。请注意,这只是基本方案,存在很多陷阱,但为您的应用程序制定特定的安全架构显然不是主题。