如果散列不够,如何正确匿名数据?

信息安全 哈希 匿名
2021-08-22 08:13:38

今天在Bruce Schneier 的博客ArsTechnica上有新闻,介绍纽约市如何发布有关出租车/出租车司机、他们的旅行等信息。

基本上,敏感信息只是简单的 MD5 散列。由于输入是有限的(最多 3 个数字,3 个字母),很容易进行一些暴力攻击:生成所有可能的组合,然后进行回顾。

考虑到信息的性质(非常小的输入,很容易生成所有组合),如何正确匿名化这些数据?

我想到的一些方法::

  • 通过默默无闻的安全性(使用“秘密”迭代次数)只是通过默默无闻的安全性。

  • 附加一个通用的、唯一的盐,将蛮力增加 0%:简单地附加盐并完成。

  • 为每个用户添加一个唯一的盐,会增加蛮力,但不会太多:取盐并计算每个盐的 3 位 3 个字母。

可以做些什么?

4个回答

您可以使用标记化。这意味着您创建一个单独的数据库,其中随机生成的 ID 映射到 3 个数字和 3 个字母。然后,您插入令牌而不是真实身份。

另一种选择,如果您不需要将数据映射回来,您可以使用例如具有长随机生成密钥的 HMAC(散列算法)。如果没有秘密,您将无法强制使用原始 ID,即使它们甚至仅包含 1 个单个字符。

使用 HMAC 实际上是使用“秘密盐”的正确方法(盐实际上在密码学中从未被认为是秘密的)。

不发布数据的方法就是不发布数据。

标记化不会很好地工作,因为我所要做的就是知道任何地方和何时驱动程序是知道驱动程序在任何地方和何时,然后我知道那个驱动程序的令牌。

如果您不希望我能够弄清楚这一点,请不要以任何形式发布该数据。

如果输入是有限的,您将始终遇到此问题。

唯一的解决方案是让您添加更多“东西”以使输入多样化。正如你所说,盐是一种选择,但如果它被妥协,它不会有太大的好处。使用密钥或密码也是如此。

我想说,在这种特定情况下,答案是连接更多关于出租车的信息。例如:

Nonce | Driver Name | Driver's License | License Plate | ...

基本上是一个更丰富的输入来补偿车牌的简单暴力破解。哦,显然,使用加密安全的哈希函数:-)

如果你想匿名它,你根本不提供密钥。没有私有数据的随机散列,没有代理令牌,什么都没有。

您只需说“A Driver”、“Another Driver”、“Another Driver”等。

如果需要将任何特定驱动程序引用回其个人数据,那么您需要该代理令牌(数据库中每个驱动程序的 guid/uuid)。但是,如果唯一的目的是向公众展示一些关于匿名司机的统计数据,则不需要密钥,只需列出非敏感数据即可。