我的Java应用程序需要处理加密文件。这就是工作流程:
Amazon提供了用于下载/上传、解密/加密的S3类。此API接受作为输入java.security.KeyPair。我不确定客户应该如何为我的Java应用提供密钥,这样应用程序才能获得java.security.KeyPair密钥?
在客户和应用程序之间交换密钥的正确方法是什么?可以使用哪种密钥文件格式?
发布于 2012-12-07 15:44:18
通常,对称加密/解密的工作方式如下:
现在你从客户那里得到了一份文件。为了能够发送回加密消息,您需要另一个公钥/私钥对。这一次,客户必须是唯一知道私钥的人。例如,他可以把他寄给你的公匙放进他的档案里。不管怎么说,你得从他那弄到一把公钥。使用该密钥,您可以对文件进行加密,并将其发送到Amazon。用户获取它们并使用他的私钥解密它们。
因此,客户不能给您一个java.security.KeyPair,因为其中包含私钥。发送私钥是不安全的。但他可以把公钥作为java.security.PublicKey发给你。我认为最好的方法是将它发送给您,或者在他提供的文件中,或者在他同时上传的单独文件中,或者在提供的文件之外。
发布于 2012-12-08 15:19:56
问题是你还没有分配信任的方法。幸运的是,有一种方法运行得相当好: TLS。TLS证书存储在浏览器中(如果需要厚客户端,则存储在JRE中)。
您的密钥对应该在本地(或在安全机器上生成并导入)生成。私钥应始终保持安全。客户使用TLS连接到您的站点,并下载您的公钥。然后客户上传他的密钥对的公钥。这可以在某些设置/配置阶段执行。
现在,客户可以为您加密文件,您也可以为客户加密文件。注意,TLS已经提供了加密(机密性)。因此,您已经得到的是,文件是在存储期间,在他们已经被传输保护。一旦您对公钥(和可信任的系统)有了信任,就可以通过普通HTTP发送文件。
添加签名非常重要,否则任何人都可以替换存储中的文件。一些审计日志可能也是必需的,否则文件可能会被删除。
其他方案是可能的(我更喜欢用于文件加密/解密的PGP方案),但它们需要密钥的带外通信。请注意,这只是基本方案,有很多缺陷,但是为您的应用程序制定一个特定的安全体系结构显然是另一个话题。
https://stackoverflow.com/questions/13765787
复制相似问题