如何存储需要在不同用户之间共享的敏感信息?

时间:2013-05-28 14:46:18

标签: python django django-models security

我必须使用Django在我的数据库中存储一些敏感信息。

我有一个Client模型,每个客户端都有一堆SocialAccounts(twitter,fb等),其中包含URL,客户端和密码。

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

4 个答案:

答案 0 :(得分:6)

显然django-extensions有two fields for this very purpose

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

所以基本上我必须为python安装(1) keyczar及其依赖项:

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

(如果你还没有,...也安装django-extensions。)

(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

我希望有人觉得这很有用。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

对于相对简单的解决方案,您可以使用django-encrypted-fields

答案 3 :(得分:0)

为什么不尝试使用salted哈希技术加密必填字段?

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

您也可以对电子邮件和其他字段执行相同操作。 此外,您不必保持静态salt,假设您将用户的名字保留为salt或其他内容。

希望这有用。