安全字符串的Django模型字段

时间:2020-07-16 20:21:30

标签: python-3.x django django-models django-2.2

简而言之: 我想将加密的字符串存储在数据库中,并在需要时将其解密。最佳做法是什么?

上下文: 我正在构建一个使用需要登录名和密码的第三方API的应用程序。我想将用于第三方API的凭据存储在数据库中,因为它们将有许多不同的凭据。我一直在查看django文档和stackoverflow,但我只发现会散乱密码的内容。

编辑:我做了更多搜索,我真的很喜欢这个: https://github.com/georgemarshall/django-cryptography

在我发现的存储库中还有其他想法或意见吗?

1 个答案:

答案 0 :(得分:1)

您应该创建一个自定义模型字段,并覆盖from_db_value()get_prep_value来加密和解密字符串。您可以使用许多软件包来执行加密算法。

使用密码学,您可以执行以下操作:

from django.db.models import CharField
from cryptography.fernet import Fernet
from django.conf import settings
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

class SecureString(CharField):
    """Custom Encrypted Field"""

    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), 
                     length=32, 
                     salt=salt, 
                     iterations=100000, 
                     backend=default_backend())

    key = base64.urlsafe_b64encode(kdf.derive(settings.SECRET_KEY))

    f = Fernet(key)

    def from_db_value(self, value, expression, connection):
        return f.decrypt(value)

    def get_prep_value(self, value):
        return f.encrypt(value)

注意:您应该抽象出加密逻辑,以获得更理想的解决方案。