【问题标题】:Passing username and password securely between 2 backend systems endcrypted在加密的 2 个后端系统之间安全地传递用户名和密码
【发布时间】:2018-09-28 22:34:48
【问题描述】:

在 java 中,在 vpn 后面用 Java 编写的 2 个后端系统之间传递加密的用户名和密码的最安全方法是什么?

目标是如果加密的用户名和密码被某人捕获,则永远无法解密。

【问题讨论】:

  • 您是否有不能使用 TLS 的原因?
  • 您是否还想以某种方式通过同一介质将您的加密密钥发送到接收端,或者接收端是否已经拥有密钥?

标签: java security encryption key


【解决方案1】:

从理论上讲,非对称加密工具用于传输机密数据。每个节点/客户端都有一对密钥,其中一个是私有的,只有自己知道,另一个是公共的,任何想要向该特定节点发送机密数据的人都应该知道。问题是,如果负载数据使用客户端 X 的 public 密钥加密,则只能使用客户端 X 的 private 密钥解密。

SSL、TLS 等协议是该概念的一些广泛使用的实现。

【讨论】:

  • 谢谢,所以通过 SSL (Https) 传递这些信息实际上应该“足够好”?
  • 据我所知,是的,应该是。
【解决方案2】:

假设您可以以不受监控的方式控制两台服务器(或至少不受入侵者监控)并且可以在两台服务器上实现任何代码然后: 您可以在两个系统上编写自己的协议及其加密算法,并使用它在两个系统之间共享您的数据。 这样,入侵者甚至不知道捕获的数据是什么或如何解释它们。

既然您说“永远不会被解密”,您的协议可以使用已在两台服务器上定义的加密密钥,并且不会在它们之间交换(例如通过握手),并且可以使用不存储任何内容的加密算法传输数据中的加密密钥验证(如填充或哈希等),当然不应该交换加密算法。

值得注意的是,ssl/tls 或任何其他暴露其加密算法并交换所使用的加密密钥的协议对于达到您的目标来说是个坏主意,因为如果捕获了它们的某些流量,这些协议很容易被破译。

【讨论】:

    【解决方案3】:

    SHA(安全散列算法)是流行的加密散列函数之一。加密哈希可用于对文本或数据文件进行签名。

    SHA-256 算法生成一个几乎唯一的、固定大小的 256 位(32 字节)哈希。这是一个单向函数,因此无法将结果解密回原始值。

    目前,SHA-2 散列被广泛使用,因为它被认为是加密领域中最安全的散列算法。

    一些库,如 Guava 或 Apache commons codec 提供了这些功能。

    在您的情况下,我建议您以明文形式发送用户名,但使用 SHA 加密发送密码,因为它无法解密,在另一个后端系统中,您已将加密字符串保存在数据库等安全的地方,当密码发送过来,你只需要看到加密的字符串匹配。

    这是一篇很好的教程文章,讨论了 java 中的 SHA: https://www.baeldung.com/sha-256-hashing-java

    【讨论】:

    • SHA 与传输安全工具无关。
    • 不幸的是,使用单向函数算法(如 SHA)发送散列密码并没有提供任何安全改进。是的,无法加密散列字符串以获得实际密码,但实际上散列字符串成为密码。例如,如果我作为黑客获得了哈希字符串,我可以简单地向实际客户端发送确切的请求。
    • sha 家族哈希函数是暴力破解的,特别是如果它们用于哈希密码之类的小字符串,这仍然会暴露用户名,他希望它们不被暴露。
    • 好点,SHA应该在内部使用。用公钥加密数据,用私钥解密(使用RSA算法)是一种流行的方式。
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 2012-04-06
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多