好的家伙只是一场小游戏:
我有一些项目的规格。在某些时候,他们要求以下方法通过网络加密密码,并说这是一个挑战响应协议:
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的实际密码!?!?还有其他方法来实现这种协议??
答案 0 :(得分:4)
您可以对密码进行反向工程。您想要发送密码的SHA,而不是密码本身。滚动自己的安全协议几乎不是一个好主意。你能不能使用SSL或类似的东西?
答案 1 :(得分:3)
以下内容如何:
答案 2 :(得分:2)
这是一个非常可怕的协议。如果这是某人希望您实施的内容,请拒绝。现有的,经过审查的协议适用于此类事情。如果这是一个游戏,你指出所有的缺陷 - 好吧。
我绝对错过了一些。
答案 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)
我这样做的方法如下:
服务器使用它的公钥进行响应 (用于表示RSA加密)数字化 签名。
客户端验证PK并加密 密码用密钥,然后 数字签名加密 密码
服务器验证签名和解密 存储/检查密码。
数字签名在这里很重要,因为它可以作为防止中间人攻击的开始。
答案 6 :(得分:0)
正如其他人所指出的那样,是的,这是一种糟糕的挑战反应算法。
您可能希望查看HTTP使用的Digest Authentication。事实上,如果你的协议是通过HTTP,你可以跳过编写自己的协议,只需使用或实现它。
答案 7 :(得分:0)
公钥加密?使用服务器的公钥加密密码。
答案 8 :(得分:0)
虽然推出自己的加密协议从来都不是一个好的解决方案,但我不建议这样做....
要克服你所面临的问题...... F - 接受密码和伪随机单调递增值并返回数字的函数。对于例如哈希(哈希(密码)^时间戳)
亲切的问候, Ashish Sharma
答案 9 :(得分:0)
我相信Diffie-hellman是一个众所周知且可靠的密钥交换协议?