安全,加密:愚蠢的挑战 - 响应协议?

时间:2008-10-09 16:23:09

标签: security cryptography challenge-response

好的家伙只是一场小游戏:

我有一些项目的规格。在某些时候,他们要求以下方法通过网络加密密码,并说这是一个挑战响应协议:

CLIENT ----------------------------- SERVER

(1)ask for challenge -------------->

(2)    <---------------------------- send SHA1 taken from the time
                                       (this is the challenge)
(3) make SHA1 xor PASSWORD --------> if it's equal to SHA1 xor stored password

(4)    <---------------------------- Grant access

对于那些不了解它的人,SHA代表安全散列算法,这是一种用于加密的标准算法。

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

10 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

以下内容如何:

  1. 服务器发送随机质询
  2. 客户端发送(质询+密码)
  3. 的SHA1校验和
  4. 服务器与SHA1校验和(质询+存储密码)
  5. 进行比较

答案 2 :(得分:2)

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

  • 任何听过第2步和第2步的人3知道密码
  • 如果他知道服务器上的时间精确度,那么任何听到第3步并注意时间可以强制密码的人
  • 我可以假装是服务器(arp中毒,dns rediction等),并获取密码,从未完成第4步并假装超时
  • 在中间攻击中容易受到攻击,因为客户端/服务器或服务器上的证书之间没有共享密钥
  • 依赖存储SHA1的服务器(时间)并等待响应,因此我可以通过请求挑战来重载服务器,从不回复。

我绝对错过了一些。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

您可能需要考虑HMAC(密钥哈希消息身份验证代码)。我在这里详细介绍了它:http://blog.ciscavate.org/2007/09/creating-a-secure-webauth-system-part-1-hmac.html,我将在下面给出一个快速摘要。

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

答案 5 :(得分:0)

我这样做的方法如下:

  1. 挑战服务器。
  2. 服务器使用它的公钥进行响应 (用于表示RSA加密)数字化 签名。

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

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

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

答案 6 :(得分:0)

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

您可能希望查看HTTP使用的Digest Authentication。事实上,如果你的协议是通过HTTP,你可以跳过编写自己的协议,只需使用或实现它。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

要克服你所面临的问题...... F - 接受密码和伪随机单调递增值并返回数字的函数。对于例如哈希(哈希(密码)^时间戳)

  1. 服务器:询问挑战,发送(时间戳)。记住最后发送的时间戳。
  2. 客户端,发送响应(发送F(密码,时间戳)和时间戳)
  3. 服务器:使用客户端发送的哈希(密码)和时间戳检查客户端(&gt;挑战中发送的时间戳)。
  4. 如果客户端正确,请授予访问权限。
  5. 确保当前时间戳大于下次挑战前所有客户端发送的时间戳,以防止重放攻击。
  6. 亲切的问候, Ashish Sharma

答案 9 :(得分:0)

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