【问题标题】:Logging IP address for uniqueness without storing the IP address itself for privacy记录 IP 地址的唯一性,而不存储 IP 地址本身以保护隐私
【发布时间】:2011-01-15 06:15:10
【问题描述】:

在 Web 应用程序中记录一些数据时,我想确保我可以识别来自不同时间但来自相同 IP 地址的数据。另一方面,由于数据将公开发布,因此出于隐私问题,我想确保无法检索实际 IP。所以我需要某种方式将 IP 地址映射到其他字符串,以确保 1-1 映射。

如果我理解正确,那么 MD5、SHA1 或 SHA256 可能是一个解决方案。我想知道它们在所需的处理方面是否不太昂贵?

我会对任何解决方案感兴趣,不过如果在 Perl 中有实现会更好。

【问题讨论】:

    标签: perl hash ip-address md5 privacy


    【解决方案1】:

    我认为 MD5 会足够好且足够快。您需要添加一些恒定的盐字符以避免彩虹表/网络查找。例如,字符串“127.0.0.1”有 md5 f528764d624db​​129b32c21fbca0cb8​​d6,它有很多谷歌点击。另一方面,“szabgab127.0.0.1”得到“您的搜索 - 501ff2fbdca6ee72247f8c61851f17b9 - 不匹配任何文档”(直到我发布这个答案......)

    【讨论】:

    • 我没有看到任何值得投反对票的内容,所以我赞成取消。
    • 我认为是反MD5部队在起作用。出于这个特殊目的,我认为 MD5 是可以的(请参阅我对 daxim 答案的评论),但总的来说应该避免。
    【解决方案2】:

    使用Rabin fingerprinting。它快速且易于实施。

    给定一个 n 位消息 m0,...,mn-1,我们 将其视为 n-1 次的多项式 在有限域 GF(2) 上。

    然后我们选择一个随机的不可约 k 次多项式 p(x) GF(2),我们定义指纹 的 m 是之后的余数 r(x) f(x) 除以 p(x) 在 GF(2) 上 可以看成一个多项式 度数 k-1 或作为 k 位数。

    请注意,这仍然不是您所寻求的perfect hash function,但要获得一个,您可能会面临破解函数并从哈希中获取原始 IP 的问题。在大多数情况下,指纹识别中极低的碰撞几率是可以接受的。

    另外请注意,无论您最终使用什么哈希函数,如果您的哈希函数已知,查找哪些日志条目来自给定 IP 地址将是微不足道的。如果你想保护自己免受这种情况的影响,你应该加密哈希。

    【讨论】:

      【解决方案3】:

      基于@marcog 和@daxim 的答案,您可以在日志生成设备上使用带有硬编码密钥的HMAC,例如HMAC-SHA。如果这个秘密泄露出去,那么这个方案就会变得和这里给出的任何方案一样弱。

      或者,也许更简单,您可以使用相同的密钥概念来加密 IP 地址。 AES 的 128 位块大小非常适合确保所有可能的 IP 地址的 1-1 映射。只需在 ECB 模式下使用 AES。

      【讨论】:

        【解决方案4】:

        如果你只使用哈希,那么有人可以进行暴力攻击。

        最简单的方法是使用布隆过滤器。特别是,http://www.afflib.org/ 的 C++ 布隆过滤器实现允许您将任意字符串添加到布隆过滤器,然后探测它们是否存在。如果您想防止暴力攻击,只需提高误报频率,使其达到十亿分之一。这样你就有了唯一性,但人们将无法弄清楚你看到了哪些 IP 地址。

        【讨论】:

          【解决方案5】:

          ⚠ 不要再使用MD5SHA-1。 ⚠ 查看文章了解他们的弱点。

          使用 salted SHA-2 代替,Crypt::SaltedHash 提供了一个很好的抽象。推荐的 Perl 绑定是 Digest::SHA 并使用 XS。

          你说的贵。你有没有分析过代码?代码还没写?然后是too early to think about optimisation。安全必须是首要考虑因素。


          编辑:示例代码

          use Crypt::SaltedHash;
          my $normalised_string_representation_of_internet_address = '::1';    # or perhaps '10.10.10.10'
          
          # when you first get an address, make a hash and store it
          my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-512', salt_len => 32);
          $csh->add($normalised_string_representation_of_internet_address);
          my $salted = $csh->generate;
          
          # later retrieve the hash and see whether it matches
          my $valid = Crypt::SaltedHash->validate($salted, $normalised_string_representation_of_internet_address, 32);
          

          【讨论】:

          • 如果你使用salt,那么同一个IP地址会在不同的时间映射到不同的hash。这将破坏日志的目的之一。
          • 盐当然和哈希一起存储,你的担心是没有意义的。如果您以前这样做过,这应该非常清楚。 - 我添加了一些代码来证明这是可行的。
          • 不,这对密码有意义,但对这个应用程序没有意义。记录哈希地址后,将没有机会“验证” IP 地址。
          • 要检测重复的 IP,您只能使用常量盐。用哈希存储随机盐是没有用的。而且MD5的弱点确实不适用于这么短的数据。在任何情况下,无论使用何种算法,如果攻击者知道散列方法,从可能的 IP 地址范围开始的暴力攻击将会取得一些成功。 (好吧,随机盐确实使这变得更加困难,但同样,随机盐不适合这个目的。)
          【解决方案6】:

          另一个选项是Crypt::Eksblowfish::Bcrypt。然而,它“更好”的原因恰恰是因为它是(eks)昂贵的——可调的成本有多高——这使得破解尝试从某种程度上到荒谬的不切实际。对于您的应用程序,您可以缓存加密的 IP,这样至少在看到重复项时不会很慢。

          【讨论】:

            猜你喜欢
            • 2016-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-14
            • 1970-01-01
            • 2020-01-10
            • 2017-12-05
            • 1970-01-01
            相关资源
            最近更新 更多