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

使用Fernet加密时出现Invalid Token错误的问题求助

Fernet解密抛出Invalid Token错误的修复方案

我用base64和Fernet写了一个加解密程序,但解密时Fernet总是抛出Invalid Token错误,偶尔又能正常运行。代码如下:

from cryptography.fernet import Fernet
import base64 as b64,random as rd
def encryt(data):
    key=Fernet.generate_key()
    data=bytes(data,"utf-8")
    key2=rd.randint(0,5)
    for i in range(key2):
        data=b64.a85encode(data)
        data=b64.b32hexencode(data)
    fernet=Fernet(key)
    encrypted=fernet.encrypt(data)
    for i in range(key2):
        encrypted=b64.b32hexencode(encrypted)
        encrypted=b64.a85encode(encrypted)
    for i in range(key2):
        key=b64.b64encode(key)
        key=b64.a85encode(key)
        key=b64.b32hexencode(key)
    final=b64.b85encode(bytes(str(key2),"utf-8")).decode()+"/?\\"+encrypted.decode()+"~`~"+key.decode()
    return(final)
def decrypt(data):
    a=data.split("/?\\")
    key2=int(b64.b85decode(bytes(a[0],"utf-8")))
    b=a[1].split("~`~")
    encrypted=bytes(b[0],"utf-8")
    key=bytes(b[1],"utf-8")
    for i in range(key2):
        key=b64.b32hexdecode(key)
        key=b64.a85decode(key)
        key=b64.b64decode(key)
    fernet=Fernet(key)
    decrypted=fernet.decrypt(encrypted)
    for i in range(key2):
        decrypted=b64.a85decode(decrypted)
        decrypted=b64.b32hexdecode(decrypted)
    return(decrypted.decode())
q="testtes:1234//te"
w=encryt(q)
print(w)
print(decrypt(w))

报错信息:

Traceback (most recent call last):
  File "c:\Users\teech\projects\Wethgan\pyencrypter.py", line 40, in <module>
    print(decrypt(w))
          ^^^^^^^^^^
  File "c:\Users\teech\projects\Wethgan\pyencrypter.py", line 32, in decrypt
    decrypted=fernet.decrypt(encrypted)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\cryptography\fernet.py", line 84, in decrypt
    timestamp, data = Fernet._get_unverified_token_data(token)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\cryptography\fernet.py", line 118, in _get_unverified_token_data
    raise InvalidToken
cryptography.fernet.InvalidToken

错误原因

  • 核心问题:解密时没有先还原Fernet加密后的原始数据。加密时对Fernet输出的encrypted做了b32hexencode → a85encode的循环编码,但解密时直接把编码后的字符串传给fernet.decrypt(),而Fernet只能识别自己加密输出的原始字节数据,因此抛出Invalid Token。
  • 偶尔正常运行的原因:当key2随机到0时,没有对encrypted和key做额外编码,此时解密流程完全匹配,因此能正常执行。

修复方案

在调用fernet.decrypt()之前,先对encrypted执行逆序的解码操作(和加密时的编码顺序相反),还原出Fernet加密后的原始数据。修正后的decrypt函数如下:

def decrypt(data):
    a=data.split("/?\\")
    key2=int(b64.b85decode(bytes(a[0],"utf-8")))
    b=a[1].split("~`~")
    encrypted=bytes(b[0],"utf-8")
    key=bytes(b[1],"utf-8")
    
    # 先还原encrypted:逆序加密时的编码步骤
    for i in range(key2):
        encrypted = b64.a85decode(encrypted)
        encrypted = b64.b32hexdecode(encrypted)
    
    # 还原key
    for i in range(key2):
        key=b64.b32hexdecode(key)
        key=b64.a85decode(key)
        key=b64.b64decode(key)
    
    fernet=Fernet(key)
    decrypted=fernet.decrypt(encrypted)
    
    # 还原原始数据
    for i in range(key2):
        decrypted=b64.a85decode(decrypted)
        decrypted=b64.b32hexdecode(decrypted)
    
    return(decrypted.decode())

内容的提问来源于stack exchange,提问作者Tee Cheng Jun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:53:18