【问题标题】:Can I implement end-to-end encryption in Java?我可以在 Java 中实现端到端加密吗?
【发布时间】:2014-10-06 04:10:27
【问题描述】:

我正在创建一个 Web 服务,用于存储用户列表及其在线公钥以及加密消息。我的最终目标是端到端加密。

我最初认为这很容易——“哦,OpenSSL 和 RSA 私钥/公钥非对称加密很棒。”错误的。 RSA will only encrypt a tiny bit of data, presumably to pass a regular, symmetric key back and forth.

好的,所以我尝试在网上找到解决方案。其中大多数不是ended without a functioning examplepointed at using the command line,所有这些似乎都过分且不完整。

有没有一种方法可以对具有非对称密钥的数据使用端到端加密,或者这完全是个人的白日梦? PHP 中的 OpenSSL 有 a way to do this already,虽然很笨拙但可以工作。

我在这里缺少一些方法吗?

【问题讨论】:

  • 端到端加密对实际数据使用对称加密(例如3DES),仅对会话密钥使用非对称加密。
  • 您只需要传输安全吗?或者您是否真的需要保护通过服务器/代理的单独消息?在前一种情况下,您不需要 TLS 以外的任何东西。 Java 肯定有带有 RSA 身份验证的 TLS。
  • 我不明白您对基于 RSA 的混合加密的问题。我个人更喜欢 ECIES 风格的加密,但这主要是个人喜好问题。除了填充的可疑选择之外,John Snow 对您链接的问题的回答很好。
  • @CodesInChaos 等人:我有点密集,我希望找到任何类型的示例、工作库等。我可以对这个想法点头,但没有任何实现示例,我很迷茫。

标签: java encryption cryptography


【解决方案1】:

使用非对称密钥(例如RSA)加密大量数据的常用方法是使用混合加密。在混合加密中,您混合对称和非对称加密。首先,您生成了一个随机对称密钥,用于加密数据。然后用非对称密钥加密对称密钥。然后将加密数据+加密随机密钥放在一起,组成完整的加密数据。

您所指的PHP中的openssl_seal()使用混合加密,其中对称算法为RC4。 openssl 实现已经定义了数据如何编码和放在加密文件中的方式,并且可能不一定是您想要的方式。作为混合加密的另一个例子,PGP 使用它自己的数据打包方式。

无论如何,混合加密并不是您在 java 中开箱即用的东西,您通常需要自己实现每个加密 + 打包步骤,或者使用实现该版本的库之一。 An example of doing it yourself is this Java code I found 可以解密上面提到的openssl_seal() 加密的消息。

使用库进行混合加密的示例可能是使用Bouncy Castle 中的 PGP 支持。

【讨论】:

  • 不幸的是,openssl_seal 有弱点:一方面,加密数据没有完整性保护,这意味着攻击者可以修改密文。另一方面,使用了 RC4,它现在被认为是一个糟糕的密码。 AEAD 等技术可提供完整性保护和加密。
  • 感谢您的链接;我现在正在检查它。我应该更具体一点:虽然我喜欢 OpenSSL 库的工作方式,但我不需要使用它们。所以这个例子完美地解决了我一半的困境;它在解密端工作得很好。我将不得不进一步挖掘加密,现在应该更容易了。
  • 仅供参考,在 Java 中使用 openssl_seal 的示例代码的链接已失效。考虑到它的年龄,这并不令人惊讶,但值得注意。
【解决方案2】:

Ebbe 的回答非常好,但是这个问题在 Google 中排名很高,我试图找到一个像样的混合加密库(Bouncy Castle 的文档不存在且不直接,而 GnuPG for Java 依赖于操作系统,并没有经过全面测试)。所以我想我会为疲惫的旅行者补充 Ebbe 的答案。

如果您可以使用它们,JWTs (JavaScript Web Tokens) 可能会很方便。 It's also an IETF Standard。有两种不同的类型:

不幸的是,目前对 JWE 的支持有点差。但是,这应该有望改善。在这个时间点(2017-04-11),唯一支持 JWE 的 Java JWT 库是BitBucket's Jose4j

【讨论】:

    【解决方案3】:

    我不太确定您要加密和解密的内容,但GnuPG for Java 可能是一个不错的选择。

    它支持公钥和私钥,可以加密和解密更大的文件和数据。

    【讨论】:

    • 他不需要任何第三方库。他只需要澄清他的问题。
    • 我无法发表评论。但他的问题是:“有没有办法使用非对称密钥对数据使用端到端加密”。我认为我的回答适合这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多