【问题标题】:"User-friendly" but secure algorithm for anonymising log files用于匿名日志文件的“用户友好”但安全的算法
【发布时间】:2012-07-23 01:00:44
【问题描述】:

我有一组 IIS 日志文件,我想发布以进行研究。

但是,这些包含一些我想匿名的敏感信息,例如:

UserName=XXXX65

我想使用一种算法,该算法保留了一些“用户友好”特性来对日志文件进行视觉检查,但它也足够安全,无法/不切实际地推导出原始用户名。

我不能只** 排除所有用户名,因为能够在日志中关联来自同一用户名的请求非常重要。

使用 SHA1 散列给了我类似的东西

UserName=AD5CBF0BA0A8646EBDBA6BE1B5DA4FCB1F385D39

这几乎是可用的,

SHA256 给出:

UserName=C9B84EE0DD2EFA53645D5268602E23A9E788903B31BBEB99C03982D9B50AF70C

这开始变得太长而无法使用,

PBKDF2-SHA1 hashing 给了

UserName=1000:153JkeeGAqtG2UsHX57RBqm3O0DIkXhF:31BBDlQrUqqeyaMo/ikCJAXRC4fFXf82

在我看来太长而无法使用。

是否有一种算法可以提供相对较短的单向哈希但仍然安全/不可逆?

我正在寻找可以用肉眼扫描日志文件并仍然注意到用户名相关性的东西。

【问题讨论】:

  • 一种方式哈希听起来不像有助于匿名的东西。如果我聪明地猜测“root”是一个可能的用户,那么我可以自己应用哈希函数来知道哪些日志对应于 root。
  • 散列用户名是可逆的。毕竟你有一个所有用户名的列表,因为你已经有了映射回纯文本,所以破坏它是微不足道的。

标签: security hash privacy


【解决方案1】:

一种方式的哈希并不是真正匿名的。为什么?可以轻松验证哪个用户对应哪个哈希:

  1. "root"是用户。
  2. 你申请hash("root"),结果是foo。您发布的日志包含对foo 的多个引用。
  3. 我聪明地猜测root 是您机器上的用户。然后我自己申请hash("root") 并获得foo。现在我知道哪些日志对应于"root"

因此,本质上:当您以后希望能够从已发布的日志中验证某个用户是某个日志的原因时,哈希非常有用。当目标是匿名时不是。

另外,哈希很难阅读。

我会生成随机的可发音字符串,并将一个映射到每个用户名。然后使用随机字符串发布日志。真正匿名且真正可读。

如何产生随机发音的字符串? 交替的辅音和元音。下面是如何使用 C(当然,这只会产生一个随机的 6 个字符的字符串。在处理日志时,您需要更多的逻辑来处理它,例如:将每个用户名映射到一个字符串,确保字符串是独一无二的):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define NAME_LENGTH 6

#define RAND_CHAR(string) \
  ( (string)[rand () % strlen (string)])

int main (void)
{
  char vowel[] = "aeiou";
  char consonant[] = "bcdfghjklmnpqrstvwxyz";
  int i;

  char rand_name[NAME_LENGTH + 1];

  srand (time (NULL));

  for (i = 0; i < NAME_LENGTH; i++)
    rand_name[i] = (i % 2) ? RAND_CHAR (vowel) : RAND_CHAR (consonant);

  rand_name[NAME_LENGTH] = '\0';

  printf ("%s\n", rand_name);

  return 0;
}

以下是它为我制作的一些示例:

西马拉
戈吉帕
头条
利克斯
法索塔
里罗努

如果你服务的用户数与 125 * 213 相当,你需要生成更长的字符串,并且可能使用分隔符以便于发音:

cemala-gogipa

【讨论】:

  • 感谢您指出这项技术。我能看到的唯一缺点是我需要找到一个安全且可访问的地方来存储查找表。这就是为什么我希望有一种标准的算法方法来生成“友好而安全”的哈希值。
  • @DavidLaing - 为什么要存储查找?我只是在处理日志文件时构建查找(在内存中,作为地图),然后在我完成对日志的匿名化后将其删除。 存储映射有用的唯一原因是当您想要从已发布的匿名日志中复制原始日志时。那是你想做的吗?如果是这样,为什么(特别是因为您已经拥有原始日志)?
  • 你说得很好——我想我只是在说明我最终需要重新匿名一组未来的日志,并希望匿名用户名与已经发布的用户名保持一致。
  • @DavidLaing - 这似乎是一件合理的事情。
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 2010-09-30
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多