我必须存储使用Django我的数据库中的一些敏感信息。
我有一个Client
模式,每个客户端都有一堆SocialAccounts
特(Twitter,FB等)与URL,客户端和密码。
考虑到属于组“管理员”所有用户都应该能够看到密码。 什么是存储在数据库中的那些密码安全的方式?
我必须存储使用Django我的数据库中的一些敏感信息。
我有一个Client
模式,每个客户端都有一堆SocialAccounts
特(Twitter,FB等)与URL,客户端和密码。
考虑到属于组“管理员”所有用户都应该能够看到密码。 什么是存储在数据库中的那些密码安全的方式?
因此很明显,Django的扩展已经为了这个目标,两个字段 :
- EncryptedCharField - CharField,因为它去进出数据库的透明地加密它的价值。 加密是通过Keyczar处理。 要使用此字段,您必须安装Keyczar,已经产生了主要的加密密钥,并有settings.KEYS_DIR设置为你的钥匙目录的完整路径。
- EncryptedTextField - CharField,因为它去进出数据库的透明地加密它的价值。 加密是通过Keyczar处理。 要使用此字段,您必须安装Keyczar,已经产生了主要的加密密钥,并有settings.KEYS_DIR设置为你的钥匙目录的完整路径。
所以基本上我只好装(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)的目录添加到您的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的加密领域 。
你为什么不尝试将必填字段与盐渍哈希加密技术?
from hashlib import sha512
salt = "thisissecret"
password = sha512("client password" + salt).hexdigest()
你可以做的电子邮件和其他领域一样好。 此外,您不必保留静态salt
,可以说您保留用户的的名字salt
或别的东西。
希望这是有帮助的。