考虑以下互动:
用户将其用户名和密码存储在Web服务器上。为了安全起见,服务器记录了密码的哈希加上一些独特的盐。
当用户使用客户端应用程序时,它向服务器发出请求,提交他们的用户名和密码的哈希以及其他一些独特的盐。
因此,您在服务器上有以下信息,需要知道请求是否可信:
再次......客户发送:clientSalt
+ MD5(clientSalt + password)
。服务器有serverSalt
+ MD5(serverSalt + password)
。我不想知道密码,我只是想知道哈希是否是从相同的密码计算的。
在不知道哈希密码的情况下,有没有办法验证两个哈希值是否都是相同的密码?
我的目标是在客户端 - 服务器环境中允许某种形式的安全身份验证,而无需通过网络交换实际密码。这只是我的一个想法,但我甚至都不知道它是否可能。
答案 0 :(得分:4)
这需要取消密码,这是不可能的。如果服务器收到:salt, md5sum
,则无法看到进入md5sum的内容。
挑战 - 响应协议将起作用。服务器应生成随机值nonce
并将其发送给客户端。客户端计算md5(md5(password) | nonce))
并将其返回给服务器。服务器通过选中md5(storedpassword | nonce)
验证。
答案 1 :(得分:1)
不,你不能这样做。
在混合物中添加盐后,几乎不可能比较哈希值。 (为此,在比较“未散列”数据之前,需要以某种方式“散列”这些哈希值。)
答案 2 :(得分:1)
Challenge-response authentication可能是可行的方法,可能使用Kerberos,具体取决于您的权衡。其中一个权衡是攻击者控制客户端使用受损的哈希来验证自己的可能性。
不要发明自己的加密协议。使用众所周知且经过充分测试的产品。如果可能,请使用现有(审查)实施。
答案 3 :(得分:0)
我的目标是在客户端 - 服务器环境中允许某种形式的安全身份验证,而无需通过网络交换实际密码。这只是我的一个想法,但我甚至不知道它是否可能。
为此,我建议调查Kerberos:Official Site和Wikipedia
答案 4 :(得分:0)
这是不可能的。如果您不在服务器上存储密码,则用户必须提供密码。
OR
如果您在服务器上存储密码,则用户可以使用请求的盐计算哈希值。
答案 5 :(得分:0)
您将无法使用此设置验证哈希值。 如果您不希望有人通过网络查看密码,则SSL更容易。 如果您不想使用SSL,可以查看SRP。 另外:不要使用MD5 + Salt来存储密码,使用密钥加强功能,如bcrypt或scrypt。