在不记录 IP 地址的情况下跟踪唯一的网站访问

信息安全 加密 网络 哈希
2021-09-05 04:37:21

星期一,某个 IP 地址 xxx.xxx.xxx.xxx 访问了我的网站。我记录下来。

周二,另一个 IP 地址 yyy.yyy.yyy.yyy 访问了我的网站。我记录下来。

如果两个 IP 地址相等,我会丢弃第二个,因为我只对我的网站的唯一访问感兴趣。如果它们不相同,我将两者都保存在我的日志中。


问题:是否有可能在不记录 IP 地址本身的情况下通过使用某种散列/加密来执行此操作,从而无法从散列/加密数据中推断出 IP 地址?

乍一看,在我看来这是不可能的,因为您总是可以将所有可能的 IP 地址强制使用您正在使用的任何散列/加密方案,直到它与您的散列/加密数据匹配 - 从而推断出原始IP地址。

但我希望我错过了什么。也许有可能花时间来以某种方式实现这一目标?

我在安全方面的知识不足,无法知道这种情况的可能性或不可能性。任何意见,将不胜感激。


附加信息:我想存储尽可能多的信息(当然,不能推断出原始 IP 地址)。例如,我可能不一定只想存储唯一访问者的历史总数。相反,我可能想知道在特定的一天、一周或一个月内的唯一身份访问者总数。因此,实际存储所有加密/散列的 IP 地址非常重要。所以,从这个意义上说,当我在上面谈到“扔掉第二个”时,我错了。


注意:我正在寻找一些方案,在这种方案下,没有人,甚至我,都可以推断出 IP 地址。已经提供了一些解决方案,这样我就可以自己在技术上推断出原始 IP 地址,但我什至不希望自己能够这样做。这听起来不可能,但谁知道呢。也许存在一些诡计来实现我想要的?

4个回答

首先:为什么您如此关心不存储 IP 地址?这不是私人数据;操作系统或 NAT 路由器很乐意将它包含在每个发送的数据包中。好吧,这有点必要,但我的意思是他们并不是真正的私人。此外,随机 IP 对黑客来说并不是真正有用的,而且当您只能自己查看它们时,这不是隐私问题。

其次,为了计算唯一访问次数而保存 IP 地址并不是很有用。不仅一个IP可以拥有成百上千的用户(比如学校),单个用户也可以轻松占据一两个/16子网(很多人的IP每隔几天左右就变一次),更不用说笔记本电脑和手机了。更好的技术是会话 cookie,不幸的是,它仅限于浏览器(因此仅限于一个设备,所以不计算人,但实际上是浏览器的数量),但它比 IP 地址好得多。

最后,如果您仍然想存储IP地址,基本上有两种方法:

  1. 布隆过滤器,如前所述。虽然这不是 100% 正确,但可能足以达到此目的。
  2. 使用需要永远计算的散列函数。对 IP 进行数百万次的 Sha-2,暴力破解是不切实际的。
    • (全球大约有 37 亿个可用且唯一的 IP 地址,所以如果计算一个哈希需要 50 毫秒,那么在不考虑摩尔定律的情况下,你需要 2.9 年才能有 50% 的机会暴力破解其中一个。)

让我们考虑一下系统的整个状态。该状态可以复制;只需关闭机器并获取磁盘内容的副本。

现在将该副本作为初始状态复制到一些虚拟机,这将模拟您的服务器。给他们加电,做会计事情,产生“唯一访问”的数量。这给出了一个数字N然后模拟来自给定 IP 的连接(这些是虚拟网络中的虚拟机,因此您可以根据需要模拟整个 Internet),然后再次进行计费。如果这产生N+1,那么 IP 是新的;否则,它将返回N,表明 IP 已被占用。

这种极其通用的方法表明,无论您可能在问题上投入多少密码,作为系统管理员,您仍然有能力测试给定 IP 是否在“以前见过的 IP 地址”集合中。鉴于只有大约 40 亿个可能的 IP 地址(在 IPv4 中),穷举搜索是可行的。只要您的机器是您的,您就不能放弃这种力量。如果你不能失去这种力量,你将无法说服任何人你没有它(除了容易上当的人)。

充其量,您可以使用慢速散列(如bcrypt)使穷举搜索变得更加困难,但您不能将标准提高得太高,因为您的服务器必须为每个传入的客户端执行此散列。此外,所有这些哈希都必须使用相同的“盐”,因为这与密码哈希的情况不同。无论如何,您将无法证明您没有在某处保留 IP 地址,因为很容易插入另一台被动监视网络并记录来自传入连接的 IP 地址的机器。


正如@Luc 提到的,IP 地址不是秘密。它们来自有限的集合,可以用现有技术详尽列举。另一种情况是,当您想要跟踪电子邮件地址、检测重复项,但实际上并没有将它们保存在您的数据库中,因为您不想成为负责将数百万个地址泄露给任何窃取备份副​​本的垃圾邮件发送者的人。对于这种情况,散列很方便。IP 地址和电子邮件地址之间的主要区别在于可能地址集的大小,这使得详尽的枚举对于 IP 地址非常可行,而对于电子邮件地址则完全可笑。

我向您确认,可能不记录访问者的 IP 地址。例如,如果您使用 apache 作为 Web 服务器,您可以自定义日志格式,使其不跟踪 IP 地址。通过这种方式,您不需要散列 IP 地址。

但是,如果您必须跟踪您网站的唯一身份访问者,则为此目的使用 ip 无济于事。试着想想一个有无数潜在访问者的局域网。您应该改用会话机制并存储唯一会话 ID 以及实际日期而不是 ip。

尽管这不能保证您的 IP 地址不会存储在其他地方,例如路由器或防火墙或其他软件/硬件设备中。

http://en.wikipedia.org/wiki/Bloom_filter - Bloom Filter 允许您创建组(过滤器)并向其中添加数据,由于误报,这是不可逆的。

其他方法不行,因为很容易攻击32bit IPv4空间。