假设我正在编写一个聊天服务器和客户端,允许用户使用他们的用户名和密码登录。现在我只能以纯文本形式发送和接收信息,但可能会截获信息。因此应该保护插座以保护用户。我对证书或验证身份不感兴趣,我只是想确保所提供的信息不会有暴露的风险。我也不想保护发送/接收的后续消息。采取什么好方法?
我更喜欢java指针/示例,但也对其他语言感兴趣。
答案 0 :(得分:2)
这不是一个有效的用例。为什么要进行身份验证,只允许攻击者介入并伪造随后发送和接收的信息?
SSL不仅仅是为了保密。它还提供完整性:交换的每个数据包都受到消息验证代码的保护,因此中间人不能改变内容。
如果内容缺乏完整性保护,则连接实际上是匿名的。在那种情况下,为什么要假装进行身份验证?
答案 1 :(得分:1)
您可以使用散列交换,每方发送一个连接的nonce(一次性随机值)。
答案 2 :(得分:1)
使用C#很容易做到。您可以将正常的未加密NetworkStream(这是TCP套接字连接的封装)作为参数传递给SslStream对象。完成初始SSL传输后,您只需关闭SslStream并使用底层NetworkStream进行后续的纯文本传输。
答案 3 :(得分:1)
“登录身份验证”是不够的,请考虑客户端包装在shell中的情况,以便能够成功登录,并且能够检查或发送任何恶意消息,因为明确的消息格式和协议。
答案 4 :(得分:1)
答案 5 :(得分:1)
大多数允许登录的系统使用安全登录而不使用SSL,方法是传递密码的哈希值和来自服务器的一些独特信息以防止重放。几个最佳实践封装在SASL中。
我对证书或验证身份不感兴趣,我只是想确保所提供的信息不会有被曝光的风险
在这种情况下,您可以只加密该信息,但如果您没有使用它来识别用户,并且它不能用于任何其他消息(因为它们是以纯文本形式发送的),为什么它被送了?
SSL的大部分成本都在创建流的握手中,因此创建临时流似乎不是一种好的方法,尽管你应用程序知道的唯一方法是测量它