2010-05-16 56 views
5

我正在为移动客户端 - 服务器通信定制tcp/ip协议的设计阶段。如果不需要(数据不敏感),我想避免使用SSL(出于交换时间原因(握手延迟和节省周期))。安全的密码传输通过未加密的TCP/IP

我的问题是,通过未加密连接传输验证信息的最佳实践方式是什么?我相当喜欢SRP或J-PAKE(他们生成安全的会话标记,哈希/盐友好,并允许在必要时踢入TLS),我相信它们都是在OpenSSL中实现的。不过,我有点警惕,因为我没有看到许多人为此使用这些算法。对于讨论这个主题的任何材料,我一般也会很欣赏,因为我很难找到任何材料。

编辑

也许这个问题应该是:是有通过未加密的TCP/IP安全密码最佳实践的方法吗?如果不是,选择一种特定方法的原因是什么? (到目前为止,Rooks的答案在精神上最接近这个问题,即使它确实违反了这封信)。

编辑,部分德塞夫勒

我在客户端 - 服务器的认证,其中有一个期望,双方都有一个共享密钥(密码)先验的情况感兴趣。

回答

7

你应该看看"Diffie-Hellman key exchange"

Diffie-Hellman密钥交换(d-H)是一种加密协议,允许有彼此的先验知识,双方共同建立共享密钥关键在一个不安全的通信渠道。然后可以使用该密钥来使用对称密钥密码来加密随后的通信。

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

+0

+1 a Dh密钥交换确实解决了他的问题。然而,DH密钥交换不能防止主动的MITM攻击,只能是被动的。 – rook 2010-05-16 10:45:40

+1

为此,D-H似乎不如SRP或J-PAKE,因为后两者将密码验证为副产品,但前者在建立密钥后需要额外的工作来加密/解密密码。我在这里错过了一些微妙之处吗? – academicRobot 2010-05-16 16:56:44

4

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

  • 服务器向客户端发送一个随机字符串。
  • 客户端将此字符串与密码相结合(通过组合,您可以对它们进行异或将它们追加)。
  • 客户端计算结果的散列(例如SHA1),并将其发送到服务器。
  • 服务器使用此随机数和真实密码计算相同的散列值。
  • 服务器比较这两个散列。

由于您不应以纯文本格式存储密码,而应以散列代替,因此客户端应在开始时计算此散列值。

有可能有几个库实现这个,所以你可能不需要自己编码。

+0

这个简单的CR算法的安全性比Diffie-Helman密钥交换弱得多,因为在这里哈希密码的知识足以根据服务器验证客户端! – tangens 2010-05-17 05:18:19

+0

我知道。 CR是基于密码的对称密钥认证算法,而DH(和RSA)是非对称密钥算法,客户端拥有自己的私钥。我们使用什么取决于你需要什么。大多数网站仍然通过加密通道使用密码认证,而不是一些更复杂的方法。 – petersohn 2010-05-17 05:29:47

6

我仍然认为SSL是迄今为止您的最佳选择,毕竟为什么重新发明风车时会出现如此多的错误?如果您拥有“好”和“坏”(受损)证书列表,则不必购买昂贵的证书。 openSSL是完全免费的,我没有看到不使用它的好理由。

有些事情你可能不知道:ssl handshakes can be resumed

您也可以使用SSL/TLS over UDP来减少称为DTLS的开销。

+0

请您详细说明一下:“如果您有”好“和”坏“(受损)证书列表,您不必购买昂贵的证书。 感谢您指出重复使用SSL握手,我不知道这一点。 不幸的是,在一些移动平台上UDP不是一种选择,但我原则上喜欢这个想法。 – academicRobot 2010-05-16 17:08:15

+0

@academicRobot证书只是一个数字,通常人们会付证书授权机构来签名,但您不必这样做。您可以免费制作自签名证书(http://www.akadia.com/services/ssh_test_certificate.html)。您可以检查它们是否对数据库有效。如果你使用Apache,那么你应该使用这些环境变量(http://httpd.apache.org/docs/2.0/mod/mod_ssl.html)。 – rook 2010-05-16 23:52:37

+0

是的,我熟悉证书和自签名证书(测试和个人使用)。我被困在“好”和“坏”的部分(我应该更具体)。你是说客户应该保存一份它信任的证书清单吗?客户如何确定他们何时被入侵? – academicRobot 2010-05-17 00:59:02