如何存储需要被跨越不同用户共享敏感信息?(How to store sensitive inform

2019-10-18 04:56发布

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

我有一个Client模式,每个客户端都有一堆SocialAccounts特(Twitter,FB等)与URL,客户端和密码。

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

Answer 1:

因此很明显,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

我希望有人认为这是有用的。



Answer 2:

使用可还原的加密存储密码是大约为纯文本一样安全。 使用OAuth或类似的东西,或者严重的麻烦做准备时(不是“如果” - “何时”)会有人砍你的数据库。



Answer 3:

对于一个相对简单的解决方案,你可以利用Django的加密领域 。



Answer 4:

你为什么不尝试将必填字段与盐渍哈希加密技术?

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

你可以做的电子邮件和其他领域一样好。 此外,您不必保留静态salt ,可以说您保留用户的的名字salt或别的东西。

希望这是有帮助的。



文章来源: How to store sensitive information that needs to be shared across different users?