You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:30