如何在数据库中安全存储社会安全号码?

9
我正在开发一个需要用户提交社会安全号码的Web应用程序。
我希望使用非对称密钥进行加密,以便在Web服务器遭受攻击时私钥仍然是安全的。这个应用程序不会在Web服务器上处理。
但是,该应用程序需要具备以下功能:A.检查SSN是否为重复项,以避免出现重复;B.允许用户返回到他们的应用程序。
这可以实现吗?
类似于密码存储方式,使用单向哈希值是否有意义?这样做是否会危及数据?
由于只有大约100亿个社会安全号码,是否使任何哈希算法容易受到暴力破解攻击? 盐是否有帮助?如果盐已知,则仍然容易受到暴力破解攻击吗?是否可能正确隐藏盐,因为如果某人可以访问数据库,则也可以访问盐?

这是一篇不错的阅读材料 - Drew
也许你会感兴趣?与安全存储和检索社保号码有关?破解混淆-数据中心加密,此外,开放式Web应用程序安全项目(OWASP)专注于提高软件安全性 - Ryan Vincent
2个回答

4

虽然有些晚,但我采用了双管齐下的方法。

我们将社会保险号(SSN)分成两个部分:

  1. XXX-XX
  2. 3847

SSN的第一部分使用某种加密算法(Blowfish?)或其他加密方式进行加密。

数据库:

--------------------------------------------------------
| ID    |   SSN-A    |   SSN-B    | ......   |         |
--------------------------------------------------------
|   1   | N1maA+HCRj |    3847    |    ...   |         |
|   2   | HCRjHQiEx/ |    7254    |    ...   |         |
--------------------------------------------------------

当记录被导出或转储为CSV以供其他实体使用时,您可以逐一解密SSN的第一部分,然后重新组合完整的SSN。
只要密钥存储安全,那么这里就有一个合理的安全感。这样做的附加好处是,虽然您无法进行整个SSN搜索,但可以使用最后4位数字来限制它们。有一整套关于存储SSN的规定,所以无论您选择什么方式,都要小心。
更改:
此外,将列命名为与SSN字段不确定性相关的名称也可能是明智的。

2

不要加密你的社会安全号码,而应该把它们哈希

听起来你应该把社会安全号码哈希化而不是加密。两者的区别在于,哈希是单向的,而加密不是。但由于你不需要验证数据的值,只需要验证完整性,所以我绝对会使用哈希。

  1. 哈希比加密更安全,因为哈希化的社会安全号码无法解密
  2. 哈希仍然可以让你验证数据的完整性,并在数据库中检查重复的社会安全号码。

如何进行哈希

如果您使用的是PHP 5 >= 5.5.0 ,我强烈建议使用PHP的内置密码哈希函数。它经过了战斗测试,并为此创建。它甚至自动生成其自己的安全盐(但还提供您自己提供选项)。

请确保您仔细阅读密码哈希函数的文档,但以下是简短的示例(取自文档的示例):

<?php
// To create the password hash:
$ssn = password_hash($ssn, PASSWORD_DEFAULT);
// To verify the integrity of what the user is entering
// In this example, $hash is the hashed password generated from password_hash
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'SSN is valid!';
} else {
    echo 'Invalid SSN.';
}
?>

请注意查看密码哈希函数的文档,以便正确使用它们:

5
我需要检索数据的值,因此需要进行加密。 - harlyd
3
由于只有约100亿个SSN,即使使用salt,暴力破解信息也不应该超过几个小时。我是否遗漏了什么? - harlyd
3
“一个被哈希的社会安全号码无法被还原”这个说法是不正确的。一旦无效的组合被移除(例如,没有以9开头的SSN),允许使用的SSN的数量少于9亿。这相当于不到30位的熵值;暴力攻击是非常可行的。 - drf
1
(请参见ErikE在此问题下的出色回答,标题为SSN哈希的不安全性 - drf
1
MD5加密的社会安全号码可以被解密;SHA2也将很快被破解。"哈希是单向的"这个短语应该从软件工程师的词汇表中删除,因为尚未证明对于每个函数f(x) = x都不存在一个反函数g(f(x)),它也等于x。上帝不掷骰子。可以说当前的哈希算法还有未被发现的解决方案,并且对于暴力破解来说效率低下;但不能说任何哈希算法都是单向的。哈希算法的位移创建了"蝴蝶图案",可以被破解(就像折叠带墨水的纸张,然后展开一样)。 - user2607743
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接