如何解决django-fernet-fields解密时的Fernet密钥格式错误?
解决Django Fernet Fields解密时的密钥格式错误问题
错误原因
Django自动生成的SECRET_KEY是随机的50位左右字符串,不符合Fernet要求的32字节URL安全base64编码格式,直接传入Fernet()初始化会触发格式校验错误。
解决方案
方案一:使用django-fernet-fields内置工具(推荐)
django-fernet-fields已经封装了基于SECRET_KEY生成合法Fernet密钥的逻辑,直接调用内置函数即可:
from fernet_fields import get_fernet from django.conf import settings # 自动基于SECRET_KEY生成合法的Fernet实例 fernet = get_fernet(settings.SECRET_KEY) # 执行解密 decrypted_data = fernet.decrypt(b"gAAAAABfIrFwizr11ppteAXE3MOMItPDNfNkr5a4HcS3oiT7ih4Ln7y6TeCC5uXWPS3Yup_0s7whK3T44ndNlJRgc0Ii4_s3_A==") print(decrypted_data)
方案二:手动模拟密钥派生逻辑
如果不想依赖库的内置函数,可以手动实现django-fernet-fields的密钥生成逻辑:
import hmac import base64 from cryptography.fernet import Fernet from django.conf import settings def get_fernet_key_from_secret(secret_key): # 用HMAC-SHA256从SECRET_KEY派生32字节密钥 hmac_digest = hmac.new(secret_key.encode(), b'', digestmod='sha256').digest() # 转换为URL安全的base64编码 return base64.urlsafe_b64encode(hmac_digest) # 生成合法密钥并初始化Fernet fernet_key = get_fernet_key_from_secret(settings.SECRET_KEY) fernet = Fernet(fernet_key) # 解密数据 decrypted_data = fernet.decrypt(b"gAAAAABfIrFwizr11ppteAXE3MOMItPDNfNkr5a4HcS3oiT7ih4Ln7y6TeCC5uXWPS3Yup_0s7whK3T44ndNlJRgc0Ii4_s3_A==") print(decrypted_data)
内容的提问来源于stack exchange,提问作者Elvin Jafarov
相关产品推荐
相关产品推荐

