存储混乱的社会安全号码



我需要以唯一的加密状态存储一个社会保险号…

原因:我需要社会号码,但我不想把它们存储在万一数据库被破坏。

我想将社会安全号码转换为字母数字字符串,我希望这是一个单向过程。(不可逆转)

然后,当我搜索现有的SSN号码时,我将再次对用户输入使用相同的算法,打乱SSN并将使用字母数字字符串搜索数据库。

在php中,我可以这样做

function maskSSN($SSN) {
    $salt = sha1(md5($SSN));
    $SCRAM = md5($SSN . $salt);
    return $SCRAM;
}

但我不认为这会产生独特的值

对于像ssn这样熵很小的东西,我不建议不加密或散列存储它们。如果攻击者窃取了您的数据库,那么暴力破解ssn是非常可行的。

相反,您应该使用AES-256或更好的方式加密ssn。关于正确存储加密密钥的更多信息,请查看这个问题:存储加密密钥——最佳实践?

如果您可以存储完整的哈希(而不是截断的),那么使用最安全的哈希,您应该不会与9位数的SSN发生任何冲突。

为了防止哈希被暴力破解,使用HMAC-Sha1或HMac-Sha256带秘钥。下面是一个涉及电话号码和匿名数据的相关答案https://stackoverflow.com/a/15888989/637783

如果没有解密,AES-256的结果将无法使用,因为正确且安全地使用AES-256,对于相同的输入会产生不同的结果。但是,它可以合理地用于关系表中,其中您的ssn被加密并存储在其他表引用的主键上。

后一个选项将允许您非常简单地旋转您的键,随着时间的推移

最新更新