我需要在独特的混乱状态下存储社会安全号码......
原因:我需要社交号码,但我不想将它们保存在打开状态,以防数据库受到损害。
我想将社会安全号码转换为字母数字字符串,我更喜欢这是一个单向过程。(不可逆)
然后,当我搜索现有的SSN号码时,我会再次使用相同的算法进行用户输入,加扰SSN并使用字母数字字符串搜索数据库。
在php中,我可以做类似的事情
function maskSSN($SSN) {
$salt = sha1(md5($SSN));
$SCRAM = md5($SSN . $salt);
return $SCRAM;
}
但我认为这不会产生独特的价值
答案 0 :(得分:4)
使用与SSN一样少的熵,我不建议将它们存储为未加密或散列。如果攻击者窃取您的数据库,那么强行使用SSN是非常可行的。
相反,您应该使用AES-256或更高版本加密SSN。有关正确存储加密密钥的更多信息,请查看此SO问题:Storing encryption keys -- best practices?
答案 1 :(得分:3)
如果您可以存储完整的哈希值(未截断),则不应使用最安全的哈希值与9位SSN发生任何冲突。
为了防止哈希强暴使用带有密钥的HMAC-Sha1或HMac-Sha256。以下是涉及电话号码和匿名数据https://stackoverflow.com/a/15888989/637783
的相关答案AES-256结果将无法在以后解密时使用,因为正确且安全地使用的AES-256会为同一输入产生不同的结果。但是,它可以合理地用在一个关系表中,在该关系表中你的ssn被加密并存储在主键上,而其他表正在引用键。
随着时间的推移,后面的选项可以让你非常简单地旋转你的键。