Security 储存混乱的社会安全号码
我需要在唯一的混乱状态下储存一个社会保险号码 原因是:我需要社会号码,但我不想把它们打开存储,以防数据库被破坏 我想把社会保险号转换成字母数字串,我更喜欢这是一个单向过程。(不可逆) 然后,当我搜索现有的SSN号码时,我会再次使用相同的算法进行用户输入,对SSN进行置乱,并使用字母数字字符串搜索数据库 在php中,我可以做类似的事情Security 储存混乱的社会安全号码,security,encryption,encoding,scramble,Security,Encryption,Encoding,Scramble,我需要在唯一的混乱状态下储存一个社会保险号码 原因是:我需要社会号码,但我不想把它们打开存储,以防数据库被破坏 我想把社会保险号转换成字母数字串,我更喜欢这是一个单向过程。(不可逆) 然后,当我搜索现有的SSN号码时,我会再次使用相同的算法进行用户输入,对SSN进行置乱,并使用字母数字字符串搜索数据库 在php中,我可以做类似的事情 function maskSSN($SSN) { $salt = sha1(md5($SSN)); $SCRAM = md5($SSN . $sal
function maskSSN($SSN) {
$salt = sha1(md5($SSN));
$SCRAM = md5($SSN . $salt);
return $SCRAM;
}
但我不认为这会产生像SSN一样熵很小的唯一值,我不建议将它们不加密或散列存储。如果攻击者窃取了您的数据库,那么暴力使用SSN是非常可行的
相反,您应该使用AES-256或更好的加密SSN。查看此SO问题,了解有关加密密钥正确存储的更多信息:如果您可以存储完整哈希(而不是截断),则使用最安全的哈希,您不应该与9位SSN发生任何冲突 为了防止散列被强制使用,请使用HMAC-Sha1或HMAC-Sha256以及密钥。下面是一个相关的答案,涉及电话号码和匿名数据 如果不进行解密,AES-256结果将无法在以后使用,因为正确且安全地使用AES-256会为同一输入生成不同的结果。但是,它可以合理地用于一个关系表中,在该关系表中,您的ssn是根据主键加密和存储的,而其他表则引用该键
后一个选项也允许您随着时间的推移非常简单地旋转键。任何哈希函数都有冲突。SSN编号的格式是什么?每个SSN编号都是唯一的,并且有9个数字。当您知道哈希函数时,很容易以任何形式强制执行。在9位SSN上不太可能发生碰撞。您可以强制执行所有SSN编号并检查结果是否为唯一,但如果数据库被盗怎么办?那么HMAC对暴力强迫是无用的。请注意,HMAC的设计只是为了保持完整性和身份验证,而不是保密性。使用HMAC,数据库被盗,除非您也获得了密钥,否则您无法使用暴力,就像使用AES一样,如果您也拥有密钥,那么您只拥有数据。但是,我认为这是一个无关紧要的区别,因为强制SSN比aes解密稍微简单一些。此外,Hmac被设计为一个,所以它实际上被设计为专门不泄露有关明文的信息。此外,OP主要关注搜索,而AES(impl.security)在这方面的效率要低很多。