【问题标题】:Django Model Field for a Secure String安全字符串的 Django 模型字段
【发布时间】:2020-07-16 20:21:30
【问题描述】:
简而言之:
我想将加密的字符串存储在数据库中,并在需要时对其进行解密。这方面的最佳做法是什么?
背景:
我正在构建一个使用需要登录名和密码的 3rd 方 API 的应用程序。我想将用于 3rd 方 API 的凭据存储在数据库中,因为它们将是许多不同的凭据。我正在查看 django 文档和 stackoverflow,但我只找到了散列密码的东西。
编辑:我做了更多搜索,我真的很喜欢这个:
https://github.com/georgemarshall/django-cryptography
任何人对我发现的存储库有其他想法或意见?
【问题讨论】:
标签:
python-3.x
django
django-models
django-2.2
【解决方案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)
注意:您应该抽象加密逻辑以获得更优化的解决方案。