我需要以唯一的加扰状态存储社会安全号码。

原因:我需要输入社交号码,但我不想将它们公开存储,以防万一数据库受到破坏。

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

然后,当我搜索现有的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被加密并针对一个主键存储,而其他表则引用该键。

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

10-07 13:20
查看更多