2013-05-28 58 views
0

我必须在我的数据库中使用Django存储一些敏感信息。如何存储需要在不同用户之间共享的敏感信息?

我有一个Client模型,每个客户端都有一串SocialAccounts(twitter,fb等),带有一个URL,客户端和密码。

考虑到属于组“管理员”的所有用户应该能够看到密码。将这些密码存储在数据库中的安全方法是什么?

+2

看看:https://github.com/felixsan/django-encrypted-fields – Brandon

+1

@Brandon做出答案。这是一个很好的方法 – karthikr

回答

2

使用可逆加密存储密码与纯文本一样安全。使用OAuth或类似的东西,或准备严重麻烦时(而不是“如果” - “何时”)有人会破解你的数据库。

+0

我认为OAuth只是为了管理用户的注册/登录......您如何使用它来存储您实际想要与用户分享的信息? –

+0

如果你需要的是存储敏感信息的方式,你可以将它们呈现为清晰(未加密)的形式,那么oauth将无助于事实。但之后就没有防弹解决方案... –

0

为什么不尝试用salted hash技术加密所需的字段?

from hashlib import sha512 
salt = "thisissecret" 
password = sha512("client password" + salt).hexdigest() 

您也可以对电子邮件和其他字段进行同样的操作。 另外,您不必保留静态salt,假设您保留用户的名字为salt或其他名称。

希望这是有帮助的。

+0

,因为我希望所有用户都能看到未加密的密码。如果我以某种方式将盐与某些用户的信息绑定,那么下一个用户将无法破译该通行证。如果我在settings.py中使用了一些静态盐,那么有权访问源代码的人就能够解密它。 –

+0

我会做一些这样的技巧,创建一个不同的用户组,并使用组名作为盐,然后获取用户组名称,如果该用户在该特定用户组中,那么应该有一个选项来查看密码(就像在铬保存的密码)..它会有点混乱,但应该为你做的工作。 – abhishekgarg

6

因此很明显,Django的扩展有two fields for this very purpose

  • EncryptedCharField - CharField,因为它去进出数据库的透明地加密它的价值。加密由Keyczar公司处理。要使用此字段,您必须安装Keyczar,请让 生成主加密密钥,并将settings.KEYS_DIR设置为 您的keys目录的完整路径。
  • EncryptedTextField - CharField在进出数据库时透明地加密其值。加密由Keyczar公司处理。要使用此字段,您必须安装Keyczar,请让 生成主加密密钥,并将settings.KEYS_DIR设置为 您的keys目录的完整路径。

所以基本上我必须安装(1) keyczar及其对蟒蛇的依赖:

pip install https://keyczar.googlecode.com/files/python-keyczar-0.71c.tar.gz 
pip install pycrypto 
pip install pyasn1 

(如果你没有它,但...安装Django的扩展太)

(2)创建一个目录,你将存储你的钥匙,并创建你的钥匙:

mkdir keys 
python path/to/keyczart.py create --location='keys' --purpose='crypt' --name='whatever_name' 
python path/to/keyczart.py addkey --location='keys' --status='primary' 

(3)将目录添加到ENCRYPTED_FIELD_KEYS_DIR下的settings.py。

最后(4)的EncryptedCharField或EncrytedTextField添加到模型:

from django_extensions.db.fields.encrypted import EncryptedCharField 

class SocialAccount(models.Model): 
    platform = models.ForeignKey(SocialPlatformType, 
           related_name='platforms') 
    url = models.URLField('Account url', unique=True, 
          null=True, blank=True) 
    password = EncryptedCharField(null=True, blank=True, max_length=255) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    def __unicode__(self): 
     return self.url 

我希望有人认为这是有用的。

+0

截至2017年9月,'keyczar'库不支持Python3。我已经放弃了为此迅速修复它的岔路口。 – baldr

相关问题