【问题标题】:Query a server for the existence of a record without the server knowing exactly what record was being queried for在服务器不知道正在查询什么记录的情况下查询服务器是否存在记录
【发布时间】:2012-01-07 02:42:13
【问题描述】:

我一直在思考pwnedlist.comshouldichangemypassword.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


    【解决方案1】:

    pwnedlist.com 等服务正在处理公共信息。根据定义,每个人都可以访问这些数据,因此试图保护它是一个有争议的问题。攻击者只会从The Pirate Bay 下载它。

    但是,使用像这样的哈希函数仍然很容易被破解,因为它没有加盐并且缺乏键校正。实际上,像 sha-512 这样的消息摘要功能并不是适合这项工作的工具。

    使用Bloom Filter 会更好。这使您可以创建泄露数据的黑名单,而没有任何可能获得纯文本。这是因为基于排列的蛮力可能比真正的纯文本更容易找到冲突。查找和插入一个很酷的 O(1) 复杂度,并且表本身占用的空间要少得多,可能是使用传统 sql 数据库的空间的 1/10,000,但这个值是可变的,具体取决于您指定的错误率.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2019-07-30
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多