2009-10-18 35 views
0

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

  1. 我可以透明地使用安全套接字替换常规套接字吗?
  2. 有没有与 安全套接字有关的开销,我可能想 避免非秘密信息 消息?

我宁愿java指针/例子,但也对其他语言感兴趣。

回答

2

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

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

如果内容缺少完整性保护,则连接实际上是匿名的。在那种情况下,为什么麻烦假装认证?

+0

我正在寻找一种权衡:有些信息我不想被黑客攻击 - 而且有些信息我并不在意。也许我的例子应该更复杂一点:“聊天消息应该是安全的,但也有一个'按键时间戳'消息经常发送,并不重要,所以我希望尽可能少的开销”。 – 2009-10-19 00:58:45

+1

SSL中的大部分开销都处于初始握手阶段。握手之后使用的对称算法不会增加很多开销(您必须对特定应用程序进行配置以查看其影响有多大)。但是,如果您确实有混合安全和不安全的流量,最好有两个单独的渠道...... SSL连接和不安全的连接,甚至可能使用UDP来进行按键等操作。尽管SSL在恢复SSL握手时避免了昂贵的握手,但在一个连接上开启和关闭SSL的开销会适得其反。 – erickson 2009-10-19 02:58:03

1

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

1

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

1

“login auth”是不够的,请考虑一下客户端被封装在一个shell中的情况,以便能够成功登录,并且能够检查或发送任何恶意消息,因为消息格式和协议都是明确的。

+0

大多数SSL实现也是如此(只要shell可以访问密钥存储和主机解析)。 SSL可以保护客户端和服务器之间的中间人,但假设客户端的环境是安全的。 – 2009-10-18 09:01:09

1

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

一个快速谷歌搜索,这里是一个HTTP认证方案可参考:

http://www.httpsec.org/

1

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

我不感兴趣的证书或验证身份,我只是想确保所提供的信息是不是被暴露

在这种情况下,你可以只加密信息的风险,虽然如果你没有使用它来识别用户,并且它不能用于任何进一步的消息(因为它们是以纯文本形式发送的),为什么它被发送呢?

SSL的大部分成本都在创建流的握手中,所以创建一个临时流似乎不是一个很好的解决方法,尽管您对应用程序的唯一方法是测量它。