Python代码触发‘Fernet key must be 32 url-safe base64-encoded bytes’报错求排查
问题排查与解决
核心原因
Fernet对密钥有严格要求:必须是对应32字节原始数据的URL安全base64编码结果(编码后通常是44个字符的字节串/字符串)。你的代码里的密钥完全不满足这个条件:
key = b'toto'只有4字节,远小于要求的32字节,直接用它初始化Fernet(第8行)必然报错。- 对4字节的key做base64编码后得到的
safeKey长度只有8字节(比如b'dG90bw=='),同样不达标,所以第7、9行也会报错。
正确的解决方法
方法1:直接用Fernet自带的密钥生成工具(推荐)
Fernet提供了现成的密钥生成方法,直接生成符合要求的密钥:
from cryptography.fernet import Fernet # 生成符合标准的Fernet密钥 key = Fernet.generate_key() f = Fernet(key)
方法2:手动生成合规密钥
如果需要自己控制密钥生成逻辑,要先生成32字节的原始随机数据,再做URL安全的base64编码:
from cryptography.fernet import Fernet import base64 import os # 生成32字节的随机原始密钥 raw_key = os.urandom(32) # 转成URL安全的base64编码 safe_key = base64.urlsafe_b64encode(raw_key) # 初始化Fernet f = Fernet(safe_key)
内容的提问来源于stack exchange,提问作者Stéphane
相关产品推荐
相关产品推荐

