通过未加密的tcp / ip安全密码传输

时间:2010-05-16 08:54:47

标签: security encryption tcp passwords cryptography

我正处于用于移动客户端 - 服务器通信的自定义tcp / ip协议的设计阶段。如果不需要(数据不敏感),我希望避免使用SSL作为开销原因(在握手延迟和保存周期中)。

我的问题是,通过未加密的连接传输身份验证信息的最佳做法是什么?

目前,我喜欢SRP或J-PAKE(他们生成安全会话令牌,哈希/盐友好,并且允许在必要时踢入TLS),我相信这些都是在OpenSSL中实现的。但是,我有点小心,因为我没有看到很多人为此目的使用这些算法。也非常感谢指向任何讨论这个主题的材料,因为我找不到任何材料。

修改

也许问题应该是:对于未加密的tcp / ip,是否存在安全密码的最佳实践方法?如果没有,选择特定方法的原因是什么? (到目前为止,鲁克斯的答案与这个问题的精神最接近,即使它确实违反了这封信。)

编辑,部分deux

我主要对客户端 - 服务器身份验证的情况感兴趣,其中期望双方都具有共享秘密(密码)先验

3 个答案:

答案 0 :(得分:7)

您应该查看"Diffie-Hellman key exchange"

  

Diffie-Hellman密钥交换(D-H)是一种加密协议,它允许彼此之前没有先验知识的双方在不安全的通信信道上共同建立共享密钥。然后,可以使用此密钥使用对称密钥密码加密后续通信。

交换密钥后,您可以使用此密钥加密密码,并通过不安全的协议进行传输。

答案 1 :(得分:6)

我仍然认为SSL是迄今为止你最好的选择,毕竟为什么重新发明这么多可能会出错?如果您有一份“好”和“坏”(受损)证书清单,则无需购买昂贵的证书。 openSSL是完全免费的,我没有理由不使用它。

您可能不知道的一些事情:ssl handshakes can be resumed

此外,您可以使用UDP上的SSL / TLS来减少其名为DTLS的开销。

答案 2 :(得分:4)

您可以使用质询 - 响应算法。算法如下:

  • 服务器向客户端发送随机字符串。
  • 客户端将此字符串与密码组合在一起(通过组合,您可以对它们进行排序或只是附加它们)。
  • 客户端计算结果的哈希值(例如SHA1),并将其发送给服务器。
  • 服务器使用此随机数和真实密码计算相同的哈希值。
  • 服务器比较两个哈希值。

由于您不应该以纯文本形式存储密码,而是以哈希的形式存储密码,因此客户端应该在最开始时计算此哈希值。

可能有几个库实现了这一点,因此您可能不需要自己编写代码。