2017-01-11 79 views
1

我的主要问题是我想检查一个具有相同SSN的人是否与我们有多个帐户。目前,所有个人身份信息都经过加密,解密花费的时间也不少。如何安全有效地将SSN存储在数据库中?

我最初的想法是添加一个ssn列到数据库中的用户列。然后,我可以简单地做一个查询,我得到的所有用户与ssn或用户A.

我不想在数据库中明文存储ssn。我正在考虑只是腌制并以某种方式对它进行哈希处理。

我的主要问题是,这是安全的(或它有多安全)?有什么简单的方法来盐和哈希或加密和ssn使用python?

编辑:不需要显示SSN。

这是使用MySQL数据库。

+0

http://stackoverflow.com/questions/9594125/salt-and-hash-a-password-in-python也许你在这个问题上找到灵感。 – cdonner

+0

您的数据库引擎可能使您能够在任何数据库列中实施唯一性。太糟糕了,你没有指定它。 –

+0

@DanBracuk我正在使用MySQL。是否有DB在每一列中强制实施唯一性? – Shatnerz

回答

2

当攻击者获取DB,他也将获得加密密钥不加密的核潜艇。

只使用散列函数是不够的,只是添加一个盐没有提高安全性。

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

取而代之的是用一种随机盐对HMAC进行约100ms的持续时间,并用散列表保存盐。使用功能如PBKDF2(又名Rfc2898DeriveBytes),password_hash/password_verify,Bcrypt和类似功能。关键是要让攻击者花费大量时间通过强力查找密码。保护您的用户非常重要,请使用安全的密码方法。

-1

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

+0

加密密钥如何保证安全? – zaph

+1

在笔记本电脑上使用SHA2(攻击者的机器时间更快),可以在<1us内执行散列。所有10^9个SSN都可以在<20分钟内完成,对于攻击者来说更是如此。那里没有安全。 – zaph

+0

只使用散列函数是不够的,只是增加一点盐对提高安全性没有多大作用。取而代之的是用随机盐在HMAC上进行大约100ms的持续时间,然后用散列表保存盐。使用诸如“PBKDF2”(又名'Rfc2898DeriveBytes'),'password_hash' /'password_verify','Bcrypt'和类似函数的函数。关键是要让攻击者花费大量时间通过强力查找密码。保护您的用户非常重要,请使用安全的密码方法。 – zaph

1

根据@ 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) 
相关问题