我有一组IIS日志文件,我想发布用于研究。
然而,这些包含一些我想匿名的敏感信息,例如:
UserName=XXXX65
我想使用一种保留一些“用户友好”的算法来对目录文件进行目视检查,但这也很安全,导出原始用户名是不可能/不切实际的。
我不能只是 * *所有UserNames,因为能够在日志中关联来自相同用户名的请求非常重要。
使用SHA1哈希给我一些类似
的东西UserName=AD5CBF0BA0A8646EBDBA6BE1B5DA4FCB1F385D39
这几乎是可用的,
SHA256给出:
UserName=C9B84EE0DD2EFA53645D5268602E23A9E788903B31BBEB99C03982D9B50AF70C
开始变得太长而无法使用,
UserName=1000:153JkeeGAqtG2UsHX57RBqm3O0DIkXhF:31BBDlQrUqqeyaMo/ikCJAXRC4fFXf82
在我看来太长了,无法使用。
是否有一种算法可以提供相对较短的单向散列,但仍保持安全/不可逆?
我正在寻找可以用你的眼睛扫描日志文件的东西,并且仍然注意到UserName的相关性。
答案 0 :(得分:4)
单向哈希并不是真正的匿名。为什么?可以轻松验证哪个用户对应于哪个哈希:
"root"
是用户。hash("root")
,结果是foo
。您发布包含对foo
。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 相当,则需要生成更长的字符串,并且可能使用分隔符使其易于发音:
cemala-gogipa