【问题标题】:Java SSL sockets without authentication or stores?没有身份验证或存储的 Java SSL 套接字?
【发布时间】:2010-03-09 22:46:55
【问题描述】:

我有两个 java 应用程序需要通过加密的 TCP 套接字相互通信,但它们不需要相互验证(一个会接受()来自另一个的连接)。谁能指点我一个教程/code-sn-p 来帮助我设置这些?

我正在寻找相当简单的东西,并且我不想提供任何密钥库或信任库材料。

编辑:我应该在这里更具体。我的意思是他们不必通过 SSL 相互验证。我必须在应用程序级别进行一些重要的身份验证,因此我不能使用任何类型的基于 SSL 的身份验证方案。

此外,到目前为止(截至 2010 年 3 月 10 日中午)发布的答案中的某些链接需要密钥库文件。有没有一种简单的方法可以以编程方式生成我需要的密钥?

【问题讨论】:

  • 如果你的服务器不能相互认证,为什么还要麻烦加密呢?要么是可信的本地网络(在这种情况下不需要加密),要么是不可信的(在这种情况下需要进行身份验证以防止中间人攻击)。
  • 没有身份验证的加密可能有用的原因有很多。想象一个内部总线,它只物理连接两个安全服务器,但可能容易受到远程电磁窥探的影响。你知道你在和谁说话,你只是不应该发送明文。或者可能是消息传递系统受 FOI 法的约束,因此即使您的整个设施在技术上是安全的,您也不应该将客户数据放在上面。 IMO 仅仅因为您没有向 Verisign 付款就让所有人相信加密在某种程度上是无效的,这是一个不好的趋势。

标签: java sockets encryption ssl


【解决方案1】:

重申 Chris Jester-Young 的建议 - 如果您没有身份验证,那么您可能正在安全地进行通信,但您知道您正在与谁进行安全通信。您可以简单地与坏人本人进行非常安全的交流(他正在将您所说的一切传达给您希望您直接与之交谈的人)。

但是,有一个非常轻量级的身份验证方案可能适合您的目的,称为 TOFU(首次使用信任)。这是您使用 SSL 并为每一方生成自签名证书的地方 - 但是您不会跳过证书验证。相反,在与给定对等方的 first 连接上,您接受任何证书并将其存储在本地;在与该对等方的后续连接中,您接受已保存的证书。这类似于ssh 默认情况下用于主机身份验证的方式,并提供“我现在与之交谈的人与我昨天交谈的人”变体的身份验证。

【讨论】:

  • 那么,使用 SSLSocket 进行通信可以减少被嗅探的机会吗?在我的应用程序中,我在应用程序层有一个安全机制,在某种程度上我只需要降低被嗅探的机会或为零。
  • 不,除非您以某种方式验证所使用的证书,否则您可能会被中间人嗅探,他只是在转发所有内容,包括应用层身份验证。
【解决方案2】:

如果您坚持无视 Chris Jester-Young 的明智建议,您可以使用匿名 Diffie-Hellman 密码套件。这些密码套件默认不启用,您必须明确启用它们,例如使用SSLSocket.setEnabledCipherSuites() 方法。

【讨论】:

    【解决方案3】:

    如果您绝对不想将 SSL 与证书一起使用,您可以自行推出,尽管它显然不会那么安全。我只是在这里即兴发挥,将一些非对称加密与端口敲门混合在一起。

    首先,在客户端中创建一个随机的 RSA 密钥对,在内存中,无需将其存储在任何地方。然后客户端使用普通的 Socket 连接到服务器,并在连接时向服务器发送公钥(根据需要进行编码,以便您可以在服务器上轻松读取它)。然后服务器生成一个随机的 128 位密钥,在随机端口中启动另一个 ServerSocket,并使用客户端的公钥加密 128 位密钥和新的服务器端口号,并将数据发送回客户端。服务器必须等待一小段时间才能在新端口上接收来自同一客户端的连接。

    客户端关闭连接,解密数据,并在指定端口上打开一个新的 Socket 到服务器。然后客户端和服务器都必须使用 AES/CBC/PKCS5Padding(或 RC4,如果您愿意)使用指定的 128 位密钥将套接字的 InputStream 和 OutputStream 包装在 CipherInputStream 和 CipherOutputStream 上。瞧,您在客户端和服务器之间建立了安全连接,无需任何身份验证。

    如果您想处理身份验证,您可以通过安全连接进行,或者在第一次连接时,服务器也可以拥有 RSA 密钥对,它们交换密钥,服务器可以向客户端发送质询(服务器发送使用客户端的公钥向客户端发起质询,客户端使用服务器的公钥响应质询)。但这不必要地复杂,我认为你最好还是使用标准 SSL 和密钥库......也许你可以在客户端上创建一个内存中的 KeyStore 并将其发送到服务器,如上所述使用第一个连接(加密密钥库与服务器的公钥),然后您可以设置第二个连接以将 SSL 与该密钥库一起使用,该密钥库是临时的,将在客户端断开连接时被丢弃。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 2021-04-22
      • 2012-12-15
      • 1970-01-01
      • 2023-03-02
      • 2011-04-07
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多