我正在寻找一种在数据库中匿名化数据的好方法,同时保留汇总/汇总统计信息的功能。
举个例子,假设我想跟踪每小时IP地址的点击次数,但实际上并不想存储IP地址。
我的第一个想法是只存储IP的哈希值(例如SHA-256)。但是,我不确定这提供了足够的安全性。如果攻击者获得了我们的数据库,并决定撤销我们的匿名化,他们可以生成一个IP的彩虹表,并相当容易地获取真实的IP信息。
我的下一个想法是在散列之前向IP添加静态前缀(例如192.168.1.10
变为MY_SECRET_STRING-192.168.1.10
)。当然,如果攻击者找到静态前缀,那么它基本上是无用的。
我一直在寻找这个问题的合理解决方案,到目前为止我还没找到任何我真正喜欢的东西。是否有任何众所周知的匿名数据方法?
答案 0 :(得分:2)
如果有人可以访问你的盐和数据库,我会说它几乎不可能(如果不是不可能的话)阻止他们创建某种碰撞表并“破解”你的哈希。你唯一的选择是让他们的工作变得艰难/昂贵。
使用静态盐是一个坏主意但是,因为盐的全部意义在于防止攻击者为您的所有记录生成彩虹表。 唯一性是盐成为好盐的原因,这是因为盐的目的是使每个哈希值都是唯一的,无论原始内容是否与另一个记录相同(因此要求攻击者暴力 - 强制每行确定其内容)。 值得注意的是,盐不需要保密,因此您可以将盐储存在额外的色谱柱中。
如果您对该主题有任何疑问,可以this nice article关于腌制和散列。
所述方法的问题在于,最终,就像攻击者一样,您将无法分辨哪些行是相同的IP。
一个潜在的解决方案我可以看到如果你真的需要实现这个就是有一个表存储IP +点击次数,然后每1小时就有一次通过简单地用最好的RANDOM值替换最后一小时的所有IP /散列来匿名化数据的过程。这最终意味着您只能在不知道实际IP的情况下每小时对点击进行分组,但请注意两件事:
另外,要使每小时非匿名化IP更难以破解,您可以拥有一个接受IP并生成唯一salt的函数,然后将该IP的唯一盐缓存到下一个小时,这意味着每个IP都会每小时都有自己独特的盐。这样攻击者每小时就必须为每行计算一个新的彩虹表,你仍然可以找出要增加的IP行。
答案 1 :(得分:0)
为什么,是的,有。最着名的叫做“腌制”。基本上,不是为所有纯文本添加静态字符串,而是为每个纯文本添加一个唯一的字符串。该字符串是随机或算法生成的,并单独存储。它不会使单个哈希更难破解,但它阻止使用表来破解多个哈希。请参阅有关Salt(密码学)的维基百科文章。
话虽如此,我认为IP的单向散列就足够了。攻击者必须破解每个IP地址。无论您使用何种方法,一旦IP被破解,该IP的所有记录都将被暴露。但破解一个IP对任何其他IP都无济于事。