我需要以唯一的加扰状态存储社会安全号码。
原因:我需要输入社交号码,但我不想将它们公开存储,以防万一数据库受到破坏。
我想将社会保险号转换为字母数字字符串,并且我希望这是一个单向过程。(不可逆)
然后,当我搜索现有的SSN编号时,我将再次使用相同的算法进行用户输入,对SSN进行加密,然后使用字母数字字符串搜索数据库。
在PHP中,我可以做这样的事情
function maskSSN($SSN) {
$salt = sha1(md5($SSN));
$SCRAM = md5($SSN . $salt);
return $SCRAM;
}
但我认为这不会产生独特的价值
最佳答案
如果您可以存储完整的散列(不被截断),则使用最安全的散列不应该与9位SSN发生冲突。
为了防止哈希值被强行使用,请使用带有密钥的HMAC-Sha1或HMac-Sha256。这是一个涉及电话号码和匿名数据https://stackoverflow.com/a/15888989/637783的相关答案
AES-256结果将无法在没有解密的情况下使用,因为正确安全地使用AES-256对于相同的输入会产生不同的结果。但是,它可以合理地用在关系表中,在该关系表中,您的ssn被加密并针对一个主键存储,而其他表则引用该键。
后面的选项将允许您随着时间的推移非常简单地旋转键。