注意:我最初在 SO(链接)上发布了这个,但后来意识到 Security SE 更合适,因为存在关于 Crypto-PAn 的问题,这与这里类似
我有一个我想匿名的数据库查询日志文件——这些是从客户端获得的,然后在外部进行分析。客户希望将这些匿名化到足以保护识别信息的程度,但仍要留下足够的空间以进行有用的分析。
有些行可能包含 IP 地址(例如源 IP)——我相信我可以使用Crypto-PAn 之类的东西来匿名这些。我的理解是,这种匿名化是单射的 (1:1) 以及可重复的,但也是不可逆的。
同样,行也可能包含字段和值 - 例如{ "name.first": "John" }。
对于这些值,我很高兴只使用直接的 MD5(或类似的内容)——我们看到它们是什么并不重要。
但是,对于数据库字段,我们希望以某种人类可读的格式保存它们。这是因为我们将围绕这些字段进行性能分析(例如,按字段分组查询等)
例如,name.first可能变成Tree.Blackboard.
约束是:
- 每个输入单词都应该映射到一个哈希,反之亦然(我知道会有一些冲突,但希望它们足够罕见)。
- 可重复 - 如果我们有多个日志文件,我们希望每次生成相同的哈希 - 这将允许我们跨日志文件进行比较。
- 不可逆 - 理想情况下,不应该有一种简单的方法来反转哈希以获取原始字段名称。
- 人类可读 - 哈希应该是人类可读/可发音的,但它们不一定需要是有效的英文单词(例如
Flerti可以接受,037751d79d1ebfdd0664b2c66b8d66d1不是)
我和一位同事讨论过,我们认为的一种方式是:
- 获取字段名称 - 并通过标准的单向哈希(例如 MD5)传递它。
- 从生成的哈希中获取足够的低位位以映射到英语单词字典(例如 1,000,000 个有效单词)。使用这些位的整数等价物,并做一个 mod 来索引该字典中的一个单词。
这个想法是 - 单词是可读的,但也总是一致的(假设你的字典保持不变)。
如果某些人担心字典攻击(即字段名称“firstname”总是映射为“Blackboard”),那么该人可以拥有自己的特定密钥文件来对哈希进行加盐。这意味着来自他们的匿名日志文件将是可重复的(即“名字”可能总是映射到他们的“十亿”),但与使用其他密钥文件的其他人不同。
问题 1 - 是否已经有一种现有的加密算法(类似于 Crypto-PAn)可用于以某种可发音/可读的方式对字符串进行匿名化?
问题 2 - 如果没有,您是否看到上述简单方法中有任何明显的漏洞?