【发布时间】:2012-01-07 02:42:13
【问题描述】:
我一直在思考pwnedlist.com 和shouldichangemypassword.com 等服务以及它们的根本问题——信任。
也就是说,用户必须相信这些服务不会收集提交的查询。
Pwnedlist.com 提供了提交用户查询的 SHA-512 哈希的选项,这是一个进步,但如果数据库中确实存在查询,仍然会泄露信息。也就是说,恶意服务会知道给定的电子邮件地址是有效的(另请参阅:为什么永远不要单击垃圾邮件中的退订链接)。
我想出的解决方案如下:
1) 不是用户自己计算和提交哈希,而是通过客户端 javascript 计算哈希(在我的示例中我将使用更简单的 md5):
md5("user@example.com") = "b58996c504c5638798eb6b511e6f49af"
2) 现在,不再将整个哈希作为查询传输给服务器,而是仅传输前 N 位:
GET http://remotesite.com?query=b58996
3) 服务器使用其数据库中存在的所有以相同 N 位开头的哈希值进行响应:
{
"b58996afe904bc7a211598ff2a9200fe",
"b58996c504c5638798eb6b511e6f49af",
"b58996443fab32c087632f8992af1ecc",
...etc... }
4) 客户端javascript比较服务器返回的哈希列表并通知用户她的电子邮件地址是否存在于数据库中。 由于服务器响应中存在“b58996c504c5638798eb6b511e6f49af”,因此该电子邮件存在于数据库中 - 通知用户!
现在,此解决方案的明显问题是用户必须信任客户端 javascript 仅传输它所说的要传输的内容。然而,足够博学的人将能够验证查询没有被泄露(通过观察发送到服务器的查询)。这不是一个完美的解决方案,但如果用户能够(理论上)验证网站的功能是否与它所说的一样,它会增加信任度。
SO 对此解决方案有何看法?重要的是,有人知道该技术的任何现有示例或讨论吗?
注意:pwnedlist.com 和 shouldichangemypassword.com 显然都是由知名人士/组织运营的,我没有理由不相信。这更像是一种思考练习。
【问题讨论】:
标签: javascript hash passwords security