我必须使用Django在我的数据库中存储一些敏感信息。
我有一个Client
模型,每个客户端都有一堆SocialAccounts
(twitter,fb等),其中包含URL,客户端和密码。
考虑属于“管理员”组的所有用户应该能够看到密码。将这些密码存储在数据库中的安全方法是什么?
答案 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
或其他内容。
希望这有用。