【问题标题】:How to exchange encryption keys with the customer?如何与客户交换加密密钥?
【发布时间】:2023-04-07 13:30:01
【问题描述】:

我的 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

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

【问题讨论】:

  • 那么,您基本上是在问如何进行非对称加密?
  • 我确信应该使用哪些文件格式来为应用提供密钥。
  • 你告诉我。您使用的是哪个加密工具集?例如,PGP/GPG 使用类似于 y3xz.com/yuvadm.pgp 的密钥

标签: java encryption amazon-s3 cryptography


【解决方案1】:

通常,非对称加密/解密是这样工作的:

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

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

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

【讨论】:

  • 这完全取决于您使用的加密/工具集。但我认为 PublicKey 甚至实现了Serializable,所以你可以把它转储到一个文件中。另外,您可以阅读official Java security doc
  • 您不能只接受自动消息中的每个公钥。您的密钥需要某种验证,否则任何人都可以执行中间人攻击(等等)。您可以在带外执行此操作,也可以使用 PKI 验证方法(证书链)。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2019-08-02
    • 2014-09-21
    • 2022-12-16
    • 2019-07-09
    • 2012-05-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多