爱丽丝有一个银行帐号,但忘了它是哪个银行的。有四家银行,由鲍勃、卡洛斯、大卫和夏娃经营。
她可以通过去所有的银行并询问他们是否有帐号就知道了。然而,如果夏娃知道爱丽丝的帐号,那么夏娃就会去爱丽丝的实际银行,偷走爱丽丝所有的钱。
爱丽丝可以对银行帐号进行散列,并询问有关哈希的信息,但由于账户号码只有8位数,所以Eve无论如何都可以强行执行哈希操作。然后,伊芙会去爱丽丝的银行偷她所有的钱。
Alice可以使用零知识证明协议,但是银行如何知道要检查哪个帐号而不重复每个帐号的ZKPP?他们每个人都有成千上万的顾客。
上下文:我正在编写一个程序,用于检索一个名为Tox (http://wiki.tox.im/index.php/Proposal:Friendslist_服务器)的项目的密钥和朋友列表的加密副本。我想让它自动检测到哪台服务器有它。
发布于 2013-08-09 11:29:03
正如夜猫子在评论中指出的那样,您的银行场景中的真正问题是,帐户号作为标识令牌和身份验证令牌都要执行双重任务。
解决方案同样简单:公开帐号并仅用于标识。让爱丽丝的银行给她发另一个号码(我们把它叫做PIN),这个号码不需要识别她的帐户,但需要从它取款。
当然,如果其他一些银行是不可信的,他们可能会声称有爱丽丝的帐户,并要求她的密码,然后利用它从她的真实帐户偷钱。为了防止这一点,艾丽斯可以(如你所建议的)使用零知识证明协议来验证她的密码到她的真实银行,而不允许一个冒名顶替的银行学习它。因为银行知道爱丽丝的帐号,所以他们可以用它来查找爱丽丝的帐户信息,并根据它核实她的密码。
同样的解决方案也适用于您的实际问题:使用用户名来标识用户,并使用密码对她进行身份验证。对于身份验证步骤,我建议使用一种增强的派克协议,如SRP,它允许用户向服务器证明她知道自己的密码,而不必向任何人实际披露所述密码(或任何类似的密码)。
Ps。另见最近这个类似的问题。
https://crypto.stackexchange.com/questions/9641
复制相似问题