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

har*_*lyd 9 mysql encryption-asymmetric public-key-encryption

我正在开发一个网络应用程序,用户需要提交他们的社会安全号码。

我想使用非对称密钥进行加密,这样即使网络服务器遭到破坏,私钥仍然是安全的。该应用程序不会在网络服务器上处理。

但是,应用程序需要能够知道 SSN 是否重复,A 不允许重复,B 允许用户返回其应用程序。

这可以做到吗?

使用类似于密码存储方式的单向哈希是否有意义,或者会损害数据吗?

因为只有大约。100 亿个 SSN。这是否会产生任何哈希算法。容易受到暴力攻击。盐在这里有用吗?如果盐是已知的,是不是仍然容易受到暴力破解的影响?是否可以正确隐藏盐,因为如果有人可以访问数据库,他们也可以访问盐?

Tim*_*Tim 2

不要加密您的 SSN,而是对其进行哈希处理

听起来您应该对SSN进行哈希处理,而不是对其进行加密。两者之间的区别在于散列是单向的,而加密则不是。但由于您不需要验证数据的值,只需验证完整性,我肯定会使用哈希,因为

  1. 散列比加密更安全,因为散列 SSN 无法取消散列
  2. 散列仍然允许您验证数据的完整性并检查数据库中是否存在重复的 SSN。

如何散列

如果您使用 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.';
}
?>
Run Code Online (Sandbox Code Playgroud)

请记住检查有关密码哈希函数的文档,以便正确使用它们:

  • 我确实需要检索数据的值。所以加密是必要的。 (5认同)
  • 因为只有大约。100 亿个 SSN,即使使用了 salt,暴力破解信息也不会超过几个小时。我是不是错过了什么。 (3认同)
  • “哈希 SSN 无法取消哈希”的说法是不正确的。一旦删除无效组合(例如,没有以 9 开​​头的 SSN),允许的 SSN 总数将少于 9 亿。这小于 30 位的熵;暴力攻击是非常可行的。 (3认同)