我正在尝试使用 Fernet 创建一个 django 自定义加密字段。我发现自动执行此操作的库似乎已过时/与 Django>3.0 不兼容
在这个线程中,我发现了以下代码:
import base64
from django.db.models import CharField
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from core import settings
class SecureString(CharField):
salt = bytes(settings.SECURE_STRING_SALT, encoding="raw_unicode_escape")
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=100000,
backend=default_backend())
key = base64.urlsafe_b64encode(kdf.derive(settings.SECRET_KEY.encode('utf-8')))
f = Fernet(key)
def from_db_value(self, value, expression, connection):
return str(self.f.decrypt(value), encoding="raw_unicode_escape")
def get_prep_value(self, value):
return self.f.encrypt(bytes(value, encoding="raw_unicode_escape"))
它似乎适用于编码部分(如果我使用管理器程序检查数据库字段,内容显示为一种汉字),但不适用于解码。
每次我在 Admin 中保存记录时,都会触发此错误(尽管保存在数据库中):
raise TypeError("{} must be bytes".format(name)) TypeError: token must be bytes
由于get_prep_value代码,不应该已经是数据库记录中的字节吗?尝试在管理员中列出记录(访问读取功能)时会发生相同的错误。
我该如何解决这个问题?我使用 SQL Server 作为数据库(以防它可能相关)。