好家伙只是一个小游戏:

我有一些规格为一个项目。在某些时候,他们要求对以下进行加密的密码网,他说,这是一个挑战响应的协议:

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("挑战"和"挑战异或密码",我这样做具有实际的密码只是另一个异或间他们两个!?!?还有其他的方式来实现这种协议??

有帮助吗?

解决方案

以下内容如何:

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

其他提示

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

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

这是一个相当可怕的协议。如果这是某人想要你到实施,拒绝。有现有的、经过审查的协议对于这种类型的事情。如果这是一个游戏,你点了所有的缺点-好的。

  • 任何人听到的步骤2和3知道密码
  • 任何人听到的步骤3,并注意到时间可以暴力破解的密码,如果他有任何主意的精确度的服务器上的时间
  • 我可以假装自己是一个服务器(arp中毒,dns rediction,等等),并获得您的密码,从未完成的步骤4和超时假装
  • 脆弱的中间人的攻击,因为没有共享之间的秘密客户/服务器或证书的服务器上
  • 依赖于服务器储存的SHA1(次)和等待反应,因此,我可以载的服务器要求和挑战从来没有答复。

我肯定丢失的更多一些。

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

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

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

正如对方已经指出的那样,你是对的。还要记住,当真实用户遇到网络问题(例如: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计算重新生成散列,并将本地生成的摘要与消息附带的摘要进行比较。请记住:服务器也有秘密,所以它有足够的信息来确认摘要。 (这只考虑验证消息来源的问题,但是如果使用不同的秘密,比如一组公钥,则可以使用相同的方法加密整个消息。)

我这样做的方法如下:

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

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

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

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

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

您可能希望查看HTTP使用的摘要式身份验证。事实上,如果你的协议是通过HTTP,你可以跳过编写自己的协议,只需使用或实现它。

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top