我认为您想保护用户的隐私很好,但是您正在构建的内容似乎与保护隐私相反,因此我认为不可能通过简单的设置来完成(例如,客户端以任何形式发送 url ,直接到您的后端服务)。
正如其他人所指出的,使用 sha1 进行散列是一个很好的第一步,但它只能实现隐私,防止人类冒着快速浏览数据库的风险。它不会为您提供针对旨在分析数据库内容的算法的太多隐私。
你泄露的不仅仅是访问的 url:如果你正在做实时检查,用户还会告诉你他什么时候在线并查看给定的 url。
其他一些人提出了解决隐私问题的解决方案。虽然他们都比什么都不做要好,但他们并没有解决问题。例如,Google 只发送 32 位哈希的解决方案看起来不错,但它仍然只将所有现有 url 映射到具有 40 亿个槽的哈希表。其中一些插槽可能包含大量条目,但由于并非所有 url 都同样可能被访问(例如,facebook url 比某些小学的主页更有可能被访问)并且单个域的 url 将很可能在 40 亿个可用插槽上相当均匀地散列,它仍然很容易猜到,给定一组完整的 url,它们散列到相同的 32 位前缀,实际上访问了哪个 url(尤其是对于 google,
此类攻击涉及某人构建他感兴趣的 URL 的彩虹表。您可以通过以下方式使其变得更加困难
- 使用密码散列函数而不是 sha1,这需要很长时间来计算散列 - 但这意味着您的浏览器插件似乎没有响应。
- 给你的哈希加盐。显然,您不能给每个用户自己的盐,或者不同用户提供的相同 url 的所有哈希值都是唯一的,这很可能使您的应用程序毫无意义。但是您的用户群增长得越大,需要相同盐值的用户就越少。您仍然没有保护用户隐私,但是您更难以计算彩虹表以准确找出访问了哪些网址,如果有人这样做是为了特定用户的盐,只有所有其他用户的隐私共享他的盐受到损害。
但是,如果攻击者对整组散列 URL 不感兴趣,而只想回答非常具体的问题(例如,哪些用户访问了属于给定域中的域的 URL),这仍然没有任何帮助。黑名单”?)因为这样的查询只涉及一个简短的列表(可能几十到几十万个 url,取决于黑名单的大小),在很短的时间内对它们中的每一个进行哈希处理是微不足道的,不不管你用什么对策来减慢它。
比这更糟糕的是,因为许多网站只有几个共同的入口点,最有可能的只是域,后面跟着一个空路径。其他经常访问的路径是登录页面、个人资料页面等,因此您需要散列的 url 数量以确定是否有人访问过特定域很可能非常少。如果攻击者这样做,他会错过使用网站深层链接的用户,但他会抓住其中的大部分。
更糟糕的是:如果攻击者设法从用户提供的哈希中找到一个完整的 url,他可能很容易获得该用户大部分浏览会话的所有 url。如何?好吧,既然他有一个 url,他可以用他自己的自定义爬虫取消引用它,查看文档中的所有链接,对它们进行哈希处理并在您的数据库中查找它们。然后他对这些链接做同样的事情,依此类推。
所以你可以做一些事情让它变得更难,但我认为没有办法让用户基本上信任你的浏览历史。我能看到的唯一方法是构建一个不完全受您控制的分布式系统并使用它来收集 url,例如一种混合器网络。另一种情况可能是让客户端下载大部分数据库内容,从而隐藏他们真正感兴趣的 url,并仅以大数据包的形式为您的数据库提供新内容,这至少会隐藏用户浏览的时间部分.