2TB CSV 中帐号的匿名化
Anonymization of Account Numbers in 2TB of CSV's
我有 ~2TB 的 CSV,其中前 2 列 包含两个 ID 号。这些需要匿名,以便数据可以用于学术研究。匿名化可以(但不一定)是不可逆的。这些不是病历,所以我不需要最高级的密码算法。
问题:
标准散列算法会生成很长的字符串,但我必须进行大量 ID 匹配(即 'for subset of rows in data containing ID XXX, do...)' 才能处理匿名数据,所以这并不理想。有更好的方法吗?
例如,如果我知道有大约 1000 万个唯一帐号,是否有使用整数集 [1:1000 万] 作为 replacement/anonymized ID 的标准方法?
计算限制是数据可能会在 32 核 ~500GB 服务器计算机上匿名化。
您似乎并不关心 id 是否可逆,但如果有帮助,您可以尝试 format preserving encryption 中的一种想法。它们几乎是为这个用例设计的。
否则,如果哈希值太大,您可以随时去掉它的末尾。即使您将(原始 ID 的)每个数字替换为十六进制数字(来自哈希),也不太可能发生冲突。不过,您可以先读取文件并检查是否存在冲突。
PS。如果您最终进行散列,请确保您预先添加了合理大小的盐。否则 [1:10M] 范围内的 ID 哈希对于暴力破解来说是微不足道的。
我会假设你想做一个单一的传递,一个带有 ID 的 CSV
数字作为输入,另一个带有匿名数字的 CSV 作为输出。我会
还假设唯一 ID 的数量大约为 10
百万或更少。
我认为最好使用一些完全任意的
从一组 ID 号 (N) 到一组的一对一函数
去识别化数字 (D)。这样会更安全。如果你用了一些
某种哈希函数,对手知道了哈希是什么,
N 中的数字可以很容易地恢复
字典攻击。相反,我建议进行简单查找 table: ID 1234567
映射到去识别号码 4672592 等。对应关系是
存储在另一个文件中,没有该文件的对手不会
能做的很多。
在您描述的机器上,有 1000 万条或更少的记录,
这不是什么大问题。伪Python:
中的草图程序
mapping = {}
unused_numbers = list(range(10000000))
while data:
read record
for each ID number N in record:
if N in mapping:
D = mapping[N]
else:
D = choose_random(unused_numbers)
unused_numbers.del(D)
mapping[N] = D
replace N with D in record
write record
write mapping to lookup table file
我有 ~2TB 的 CSV,其中前 2 列 包含两个 ID 号。这些需要匿名,以便数据可以用于学术研究。匿名化可以(但不一定)是不可逆的。这些不是病历,所以我不需要最高级的密码算法。
问题:
标准散列算法会生成很长的字符串,但我必须进行大量 ID 匹配(即 'for subset of rows in data containing ID XXX, do...)' 才能处理匿名数据,所以这并不理想。有更好的方法吗?
例如,如果我知道有大约 1000 万个唯一帐号,是否有使用整数集 [1:1000 万] 作为 replacement/anonymized ID 的标准方法?
计算限制是数据可能会在 32 核 ~500GB 服务器计算机上匿名化。
您似乎并不关心 id 是否可逆,但如果有帮助,您可以尝试 format preserving encryption 中的一种想法。它们几乎是为这个用例设计的。
否则,如果哈希值太大,您可以随时去掉它的末尾。即使您将(原始 ID 的)每个数字替换为十六进制数字(来自哈希),也不太可能发生冲突。不过,您可以先读取文件并检查是否存在冲突。
PS。如果您最终进行散列,请确保您预先添加了合理大小的盐。否则 [1:10M] 范围内的 ID 哈希对于暴力破解来说是微不足道的。
我会假设你想做一个单一的传递,一个带有 ID 的 CSV 数字作为输入,另一个带有匿名数字的 CSV 作为输出。我会 还假设唯一 ID 的数量大约为 10 百万或更少。
我认为最好使用一些完全任意的 从一组 ID 号 (N) 到一组的一对一函数 去识别化数字 (D)。这样会更安全。如果你用了一些 某种哈希函数,对手知道了哈希是什么, N 中的数字可以很容易地恢复 字典攻击。相反,我建议进行简单查找 table: ID 1234567 映射到去识别号码 4672592 等。对应关系是 存储在另一个文件中,没有该文件的对手不会 能做的很多。
在您描述的机器上,有 1000 万条或更少的记录, 这不是什么大问题。伪Python:
中的草图程序mapping = {}
unused_numbers = list(range(10000000))
while data:
read record
for each ID number N in record:
if N in mapping:
D = mapping[N]
else:
D = choose_random(unused_numbers)
unused_numbers.del(D)
mapping[N] = D
replace N with D in record
write record
write mapping to lookup table file