2

好吧,伙计们只是一个小游戏:

我有一个项目的一些规范。在某些时候,他们要求以下内容通过网络加密密码,称这是一个质询响应协议:

客户端服务器

(1)要求挑战-------------->

(2) <---------------------------- 发送 SHA1 取自时间
                                       (这是挑战)
(3) make SHA1 xor PASSWORD --------> 如果它等于 SHA1 xor 存储的密码

(4) <---------------------------- 授予访问权限

对于那些不知道它的人来说,SHA 代表 Secure Hashing Algorithm,一种加密的标准算法。

我希望这很清楚。问题是:如果我嗅探数据包 2 和 3(“挑战”和“挑战异或密码”,我确实有实际密码,只是它们之间有另一个异或!?!?还有其他方法可以实现这种协议??

4

10 回答 10

4

您将能够对密码进行逆向工程。您要发送密码的 SHA,而不是密码本身。滚动您自己的安全协议几乎从来都不是一个好主意。你不能使用 SSL 或类似的东西吗?

http://en.wikipedia.org/wiki/Cryptographic_nonce

于 2008-10-09T16:26:51.657 回答
3

以下情况如何:

  1. 服务器发送随机挑战
  2. 客户端发送(挑战+密码)的 SHA1 校验和
  3. 服务器与(挑战+存储的密码)的 SHA1 校验和进行比较
于 2008-10-09T16:40:08.947 回答
2

这是一个非常可怕的协议。如果这是某人希望您实施的事情,请拒绝。这类事情有现有的、经过审查的协议。如果这是一个你指出所有缺陷的游戏 - 好吧。

  • 任何听到第 2 步和第 3 步的人都知道密码
  • 任何听到第 3 步并记下时间的人,如果他知道服务器上时间的精度,就可以暴力破解密码
  • 我可以伪装成服务器(arp 中毒、dns 重定向等),然后获取您的密码,永远不会完成第 4 步并假装超时
  • 容易受到中间人攻击,因为客户端/服务器之间没有共享秘密或服务器上的证书
  • 依赖于存储 SHA1(时间)并等待响应的服务器,因此我可以用挑战请求使服务器过载而从不回复。

而且我肯定还想念更多。

于 2008-10-09T16:37:14.397 回答
1

你是对的——如果你捕获了挑战和(挑战 XOR 密码),那么提取密码很容易。

您需要在步骤 3 中使用正确的加密,而不是 XOR。使用密码加密挑战。

为了使攻击者的生活更加困难,您可以将随机数据添加到您加密的内容中:例如加密填充CHALLENGEpadding。服务器不关心填充是什么,它知道在哪里寻找挑战,但这意味着攻击者不会知道整个明文是什么。

于 2008-10-09T16:27:04.213 回答
1

正如其他人指出的那样,您是对的。还要记住,有人可能会拦截通信 (3) 并可能在真实用户遇到网络问题(例如:DDOS)时重新发送它,然后冒名顶替者将登录并且通常足以更改密码(即,许多系统不要求您提供密码以便在您登录后进行更改)。

您可能需要考虑 HMAC(keyed-Hash Message Authentication Code)。我在这里详细介绍了它:http: //blog.ciscavate.org/2007/09/creating-a-secure-webauth-system-part-1-hmac.html我将在下面给出一个快速总结.

HMAC 是一种确保消息是由有权访问共享机密的人生成的方法。HMAC 使用某种单向散列函数(如 MD5 或 SHA-1)将密钥与消息一起加密。这会生成一个 16-20 字节的简短摘要,作为消息+秘密组合的指纹。当摘要与消息一起发送时,接收方(我们的服务器)可以使用相同的 HMAC 计算重新生成散列,并将本地生成的摘要与消息随附的摘要进行比较。记住:服务器也有秘密,所以它有足够的信息来确认摘要。(这仅考虑验证消息来源的问题,但您可以使用相同的方法来加密整个消息,如果您使用不同的秘密,例如一组公钥。)

于 2008-10-09T16:39:18.963 回答
0

我会这样做的方式如下:

  1. 挑战服务器。
  2. 服务器使用数字签名的公钥(例如 RSA 加密)进行响应。

  3. 客户端验证 PK,并用密钥对密码进行加密,然后对加密后的密码进行数字签名。

  4. 服务器验证签名并解密密码以存储/检查它。

数字签名在这里很重要,因为它是防止中间人攻击的开始。

于 2008-10-09T16:43:03.540 回答
0

正如其他人指出的那样,是的,这是一个糟糕的挑战响应算法。

您可能想查看HTTP 使用的Digest Authentication。事实上,如果您的协议是基于 HTTP 的,您可以跳过自己编写的协议,直接使用或实现它。

于 2008-10-10T11:14:03.860 回答
0

公钥加密?使用服务器的公钥加密密码。

于 2008-10-10T11:32:15.290 回答
0

虽然推出自己的加密协议从来都不是一个好的解决方案,但我不建议这样做......

为了克服您面临的问题... F - 一个函数,它接收密码和一个伪随机单调递增的值并返回一个数字。例如哈希(哈希(密码)^时间戳)

  1. 服务器:请求挑战,发送(时间戳)。记住上次发送的时间戳。
  2. 客户端,发送响应(发送 F(密码,时间戳)和时间戳)
  3. 服务器:使用客户端发送的哈希(密码)和时间戳(>挑战中发送的时间戳)检查客户端。
  4. 如果客户端正确,则授予访问权限。
  5. 确保当前时间戳大于下一次质询之前所有客户端发送的时间戳,以防止重放攻击。

亲切的问候, Ashish Sharma

于 2008-10-10T11:33:32.060 回答
0

我相信 Diffie-hellman 是一种众所周知且可靠的密钥交换协议?

于 2009-11-18T18:07:12.563 回答