1

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

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

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

4

4 回答 4

6

因此,显然 django-extensions 有两个字段用于此目的

  • 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)将目录添加到您的 settings.py 中 ENCRYPTED_FIELD_KEYS_DIR 下。

最后(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

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

于 2013-05-28T16:39:30.207 回答
2

使用可逆加密存储密码与纯文本一样安全。使用 OAuth 或类似的东西,或者在(不是“如果”-“何时”)有人入侵您的数据库时为严重的麻烦做好准备。

于 2013-05-28T15:28:43.907 回答
1

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

于 2013-05-28T17:50:44.613 回答
0

您为什么不尝试使用加盐散列技术加密必填字段?

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

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

希望这会有所帮助。

于 2013-05-28T15:43:42.667 回答