使用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
相关产品推荐
相关产品推荐

