我正处于用于移动客户端 - 服务器通信的自定义tcp / ip协议的设计阶段。如果不需要(数据不敏感),我希望避免使用SSL作为开销原因(在握手延迟和保存周期中)。
我的问题是,通过未加密的连接传输身份验证信息的最佳做法是什么?
目前,我喜欢SRP或J-PAKE(他们生成安全会话令牌,哈希/盐友好,并且允许在必要时踢入TLS),我相信这些都是在OpenSSL中实现的。但是,我有点小心,因为我没有看到很多人为此目的使用这些算法。也非常感谢指向任何讨论这个主题的材料,因为我找不到任何材料。
修改
也许问题应该是:对于未加密的tcp / ip,是否存在安全密码的最佳实践方法?如果没有,选择特定方法的原因是什么? (到目前为止,鲁克斯的答案与这个问题的精神最接近,即使它确实违反了这封信。)
编辑,部分deux
我主要对客户端 - 服务器身份验证的情况感兴趣,其中期望双方都具有共享秘密(密码)先验。
答案 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)
您可以使用质询 - 响应算法。算法如下:
由于您不应该以纯文本形式存储密码,而是以哈希的形式存储密码,因此客户端应该在最开始时计算此哈希值。
可能有几个库实现了这一点,因此您可能不需要自己编写代码。