4

I need to store a social security number in the unique scrambled state...

The reason: I would require social numbers, but I do not want to store them open in case if database gets compromised.

I want to convert Social Security number into string of alphanumerics and I prefer this to be a one-way process.(not reversible)

Then, when I search for existing SSN numbers, I would use the same algorithm again for user-input, scramble the SSN and will search the database using alphanumeric string.

In php, I could do something like that

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

But I do not think that would produce unique values

4

2 回答 2

4

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

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

于 2013-05-10T02:16:56.827 回答
3

如果您可以存储完整的散列(未截断),则不应与使用最安全散列的 9 位 SSN 发生任何冲突。

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

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

随着时间的推移,后一个选项也允许您非常简单地旋转您的密钥。

于 2013-05-10T13:54:12.077 回答