是否有可能/有效的TCP连接仅具有安全登录,但是非安全消息?

时间:2009-10-18 06:33:38

标签: java security sockets client-server

假设我正在编写一个聊天服务器和客户端,允许用户使用他们的用户名和密码登录。现在我只能以纯文本形式发送和接收信息,但可能会截获信息。因此应该保护插座以保护用户。我对证书或验证身份不感兴趣,我只是想确保所提供的信息不会有暴露的风险。我也不想保护发送/接收的后续消息。采取什么好方法?

  1. 我可以透明地用安全套接字替换常规套接字吗?
  2. 是否存在与a相关的开销 我可能想要的安全套接字 避免使用非秘密信息 消息?
  3. 我更喜欢java指针/示例,但也对其他语言感兴趣。

6 个答案:

答案 0 :(得分:2)

这不是一个有效的用例。为什么要进行身份验证,只允许攻击者介入并伪造随后发送和接收的信息?

SSL不仅仅是为了保密。它还提供完整性:交换的每个数据包都受到消息验证代码的保护,因此中间人不能改变内容。

如果内容缺乏完整性保护,则连接实际上是匿名的。在那种情况下,为什么要假装进行身份验证?

答案 1 :(得分:1)

您可以使用散列交换,每方发送一个连接的nonce(一次性随机值)。

答案 2 :(得分:1)

使用C#很容易做到。您可以将正常的未加密NetworkStream(这是TCP套接字连接的封装)作为参数传递给SslStream对象。完成初始SSL传输后,您只需关闭SslStream并使用底层NetworkStream进行后续的纯文本传输。

答案 3 :(得分:1)

“登录身份验证”是不够的,请考虑客户端包装在shell中的情况,以便能够成功登录,并且能够检查或发送任何恶意消息,因为明确的消息格式和协议。

答案 4 :(得分:1)

您似乎需要RSA公钥认证,这意味着用服务器的公钥加密用户名和密码。

通过快速谷歌搜索,这里有一个http auth方案可能被引用:

http://www.httpsec.org/

答案 5 :(得分:1)

大多数允许登录的系统使用安全登录而不使用SSL,方法是传递密码的哈希值和来自服务器的一些独特信息以防止重放。几个最佳实践封装在SASL中。

  

我对证书或验证身份不感兴趣,我只是想确保所提供的信息不会有被曝光的风险

在这种情况下,您可以只加密该信息,但如果您没有使用它来识别用户,并且它不能用于任何其他消息(因为它们是以纯文本形式发送的),为什么它被送了?

SSL的大部分成本都在创建流的握手中,因此创建临时流似乎不是一种好的方法,尽管你应用程序知道的唯一方法是测量它