【问题标题】:How to securely and efficiently store SSN in a database?如何安全有效地将 SSN 存储在数据库中?
【发布时间】:2017-05-26 17:46:01
【问题描述】:

我的主要问题是我想检查具有相同 SSN 的人是否在我们有多个帐户。目前,所有个人身份信息都已加密,解密需要很长时间。

我最初的想法是在数据库的用户列中添加一个 ssn 列。然后我可以简单地做一个查询,在其中获取所有具有 ssn 或用户 A 的用户。

我不想将 ssn 以明文形式存储在数据库中。我正在考虑以某种方式对其进行加盐和散列。

我的主要问题是,这是否安全(或安全程度如何)?有什么简单的方法可以使用 python 加盐和散列或加密和 ssn?

编辑:不需要显示 SSN。

这是使用 MySQL 数据库。

【问题讨论】:

  • stackoverflow.com/questions/9594125/…也许你在这个问题中找到了灵感。
  • 您的数据库引擎可以让您在任何数据库列中强制执行唯一性。可惜你没有指定它。
  • @DanBracuk 我正在使用 MySQL。是否有在每一列中强制唯一性的数据库?

标签: python sql security hash


【解决方案1】:

如果您需要显示这些 SSN,您的问题并不清楚。我会假设你没有。将 SSN 存储在 SHA2 哈希中。然后,您可以执行 SQL 查询来搜索这些散列值。仅存储加密显示的最后 4 位数字。

【讨论】:

  • 如何保证加密密钥的安全?
  • 在笔记本电脑上使用 SHA2(攻击者的机器会快几个数量级),可以在
  • 仅使用散列函数是不够的,仅添加盐对提高安全性无济于事。相反,iIterate over an HMAC with a random salt for about 100ms duration and save the salt with the hash.使用PBKDF2(又名Rfc2898DeriveBytes)、password_hash/password_verifyBcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。保护您的用户很重要,请使用安全的密码方法。
  • @zaph 我刚刚在您发布 cmets 时得出了这个结论。我可以用 python 的 hashlib 很容易地做到这一点。如果您发布解决方案,我会接受它
  • 我认为您将 SHA2 与 SHA1 混淆了,这很容易被破坏。使用随机盐意味着您无法比较两个值。使用 SSN 作为密码是个坏主意,而且这个问题没有体现出来。
【解决方案2】:

根据@zaph 的建议。我决定使用 PBKDF2。然后我可以创建一个 BIT 列并为其编制索引。

我的简单哈希看起来像

import os
import hashlib


def hash_function(input_str):
    """Run pbkdf2_hmac with a 20byte salt, and 120,000 round on the input."""
    salt = os.urandom(20)
    return hashlib.pbkdf2_hmac('sha256', input_str, salt, 120000)

【讨论】:

    【解决方案3】:

    不要加密 SSN,当攻击者获得数据库时,他也会获得加密密钥。

    仅使用哈希函数是不够的,仅添加盐对提高安全性无济于事。

    基本上以与密码相同的方式处理 SSN。

    取而代之的是 iIterate over an HMAC with a random salt for about 100ms duration and save the salt with the hash.使用PBKDF2(又名Rfc2898DeriveBytes)、password_hash/password_verifyBcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。保护您的用户很重要,请使用安全的密码方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2014-07-14
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多