我必须使用 Django 在我的数据库中存储一些敏感信息。
我有一个Client
模型,每个客户端都有一堆SocialAccounts
(twitter、fb 等),带有 URL、客户端和密码。
考虑到属于“管理员”组的所有用户都应该能够看到密码。将这些密码存储在数据库中的安全方法是什么?
我必须使用 Django 在我的数据库中存储一些敏感信息。
我有一个Client
模型,每个客户端都有一堆SocialAccounts
(twitter、fb 等),带有 URL、客户端和密码。
考虑到属于“管理员”组的所有用户都应该能够看到密码。将这些密码存储在数据库中的安全方法是什么?
因此,显然 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
我希望有人觉得这很有用。
使用可逆加密存储密码与纯文本一样安全。使用 OAuth 或类似的东西,或者在(不是“如果”-“何时”)有人入侵您的数据库时为严重的麻烦做好准备。
对于一个相对简单的解决方案,您可以利用django-encrypted-fields。
您为什么不尝试使用加盐散列技术加密必填字段?
from hashlib import sha512
salt = "thisissecret"
password = sha512("client password" + salt).hexdigest()
您也可以对电子邮件和其他字段执行相同操作。此外,您不必保留 static salt
,假设您将用户的名字保留为 thesalt
或其他名称。
希望这会有所帮助。