3

我有一组 IIS 日志文件,我想发布这些文件用于研究。

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

UserName=XXXX65

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

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

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

UserName=AD5CBF0BA0A8646EBDBA6BE1B5DA4FCB1F385D39

这几乎是可用的,

SHA256 给出:

UserName=C9B84EE0DD2EFA53645D5268602E23A9E788903B31BBEB99C03982D9B50AF70C

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

PBKDF2-SHA1 散列给出

UserName=1000:153JkeeGAqtG2UsHX57RBqm3O0DIkXhF:31BBDlQrUqqeyaMo/ikCJAXRC4fFXf82

在我看来,这太长了,无法使用。

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

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

4

1 回答 1

5

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

  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;
}

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

cemala
gogipa
topeqe
lixate
fasota
rironu

如果您服务的用户数量与125 * 21 3相当,则需要生成更长的字符串,并且可能使用分隔符使其易于发音:

切马拉戈吉帕

于 2012-07-24T18:09:06.280 回答