安全字符串的 Django 模型字段

Django Model Field for a Secure String

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

上下文: 我正在构建一个使用需要登录名和密码的第三方 API 的应用程序。我想在数据库中存储将用于第 3 方 API 的凭据,因为它们将是许多不同的凭据。我正在查看 django 文档和 Whosebug,但我只找到散列密码的东西。

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

有人对我找到的存储库有其他想法或意见吗?

您应该创建一个自定义模型字段并覆盖 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)

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