安全、加密:愚蠢的挑战响应的协议?
-
06-07-2019 - |
题
好家伙只是一个小游戏:
我有一些规格为一个项目。在某些时候,他们要求对以下进行加密的密码网,他说,这是一个挑战响应的协议:
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("挑战"和"挑战异或密码",我这样做具有实际的密码只是另一个异或间他们两个!?!?还有其他的方式来实现这种协议??
解决方案
以下内容如何:
- 服务器发送随机质询
- 客户端发送(质询+密码) 的SHA1校验和
- 服务器与SHA1校验和(质询+存储密码) 进行比较 醇>
其他提示
您可以对密码进行反向工程。您想要发送密码的SHA,而不是密码本身。滚动自己的安全协议几乎不是一个好主意。你能不能使用SSL或类似的东西?
这是一个相当可怕的协议。如果这是某人想要你到实施,拒绝。有现有的、经过审查的协议对于这种类型的事情。如果这是一个游戏,你点了所有的缺点-好的。
- 任何人听到的步骤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计算重新生成散列,并将本地生成的摘要与消息附带的摘要进行比较。请记住:服务器也有秘密,所以它有足够的信息来确认摘要。 (这只考虑验证消息来源的问题,但是如果使用不同的秘密,比如一组公钥,则可以使用相同的方法加密整个消息。)
我这样做的方法如下:
- 挑战服务器。
-
服务器使用它的公钥进行响应 (用于表示RSA加密)数字化 签名。
-
客户端验证PK并加密 密码用密钥,然后 数字签名加密 密码
-
服务器验证签名和解密 存储/检查密码。
醇>
数字签名在这里很重要,因为它可以作为防止中间人攻击的开始。
正如其他人所指出的那样,是的,这是一种糟糕的挑战反应算法。
您可能希望查看HTTP使用的摘要式身份验证。事实上,如果你的协议是通过HTTP,你可以跳过编写自己的协议,只需使用或实现它。
公钥加密?使用服务器的公钥加密密码。
虽然推出自己的加密协议从来都不是一个好的解决方案,但我不建议这样做....
要克服你所面临的问题...... F - 接受密码和伪随机单调递增值并返回数字的函数。对于例如哈希(哈希(密码)^时间戳)
- 服务器:询问挑战,发送(时间戳)。记住最后发送的时间戳。
- 客户端,发送响应(发送F(密码,时间戳)和时间戳)
- 服务器:使用客户端发送的哈希(密码)和时间戳检查客户端(&gt;挑战中发送的时间戳)。
- 如果客户端正确,请授予访问权限。
- 确保当前时间戳大于下次挑战前所有客户端发送的时间戳,以防止重放攻击。 醇>
亲切的问候, Ashish Sharma
我相信Diffie-hellman是一个众所周知且可靠的密钥交换协议?