问题描述: 我正在使用高度敏感的数据集,其中包含人员的电话号码信息作为其中一列。我需要应用(加密/散列函数)将它们转换为某些编码值并进行分析。它可以是单向散列 - 即,在使用加密数据处理后,我们不会将它们转换回原始电话号码。基本上,我正在寻找一个匿名者,它接收电话号码并将它们转换为一些随机值,我可以在其上进行处理。建议这个过程的最佳方法。欢迎使用有关最佳算法的建议。
更新:数据集的大小 我的数据集真的非常庞大,数百GB。
更新:敏感 敏感,我的意思是电话号码不应该是我们分析的一部分。所以,基本上我需要一个单向散列函数但没有冗余 - 每个电话号码应映射到唯一值 - 两个电话号码不应映射到相同的价值。
更新:实施?
感谢您的回答。我正在寻找精心实施。我正在通过python的hashlib库进行散列,它是否必须执行您建议的相同步骤? Here is the link
你能给我一些示例代码来实现这个过程,最好是用Python吗?
答案 0 :(得分:4)
为您的数据集(16或32字节)生成密钥并保密。使用此密钥对您的数据使用Hmac-sha1,并对其进行64位编码,并且每个不可反转的电话号码都有一个随机唯一字符串(没有密钥)。
示例(带有256位密钥的Hmac-Sha1)使用Keyczar:
创建随机密钥:
$> python keyczart.py create --location=path_to_key_set --purpose=sign
$> python keyczart.py addkey --location=path_to_key_set --status=primary
匿名电话号码:
from keyczar import keyczar
def anonymize(phone_num):
signer = keyczar.Signer.Read("path_to_key_set");
return signer.Sign(phone_num)
答案 1 :(得分:1)
如果您要使用加密技术,则需要为每个电话号码应用pseudorandom function并丢弃密钥。诸如SHA-256之类的防碰撞哈希不能提供正确的安全保障。但是,真的,有许多不同的电话号码,你不能只是逐步构建一个代表实际随机函数的地图吗?
答案 2 :(得分:1)
按相应列对数据进行排序并开始计算不同的值...将实际值替换为各自的计数器值...无碰撞...单向...
答案 3 :(得分:-1)
“所以,基本上我需要一个单向散列函数但没有冗余 - 每个电话号码应该映射到唯一值 - 两个电话号码不应该映射到相同的值。”< / p>
这引发了基于加密哈希函数的解决方案。 MD5和SHA-1是最着名的例子,并为此做了很好的工作。你会读到“MD5已被破解”,但为了你的目的无关紧要。