使用Python解密表格列时遭遇InvalidToken错误,求解决方案
解决Fernet解密时的InvalidToken错误
问题根源
加密后的Salary值是bytes类型,写入CSV时会被自动转为带b''前缀的字符串格式(比如b'gAAAAAB...')。读取CSV后直接对这个字符串调用encode(),得到的是b"b'gAAAAAB...'",和原始加密bytes完全不符,导致Fernet无法识别token,触发InvalidToken错误。
解决方法
方法1:加密时转为字符串存储(推荐)
修改加密逻辑,将Fernet生成的bytes类型token直接转为UTF-8字符串存储到CSV:
# 加密Salary列:转为字符串 df['Salary'] = df['Salary'].apply(lambda x: f.encrypt(str(x).encode()).decode('utf-8'))
这样写入CSV的是纯字符串形式的token,读取后直接用f.decrypt(x.encode())即可正常解密,无需额外处理。
方法2:读取时处理带b''前缀的字符串
如果不想修改加密代码,可在读取后去掉字符串的b''前缀再转换为bytes(注意:eval()仅适用于可信CSV文件):
# 解密Salary列 try: df['Salary'] = df['Salary'].apply(lambda x: int(f.decrypt(eval(x)).decode())) except InvalidToken as e: print(f"Error: {e}") print(f"Key: {key}") raise
完整可运行代码(方法1)
import pandas as pd from cryptography.fernet import Fernet, InvalidToken # 创建示例数据 data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Salary': [50000, 70000, 90000]} df = pd.DataFrame(data) # 生成加密密钥 key = Fernet.generate_key() # 初始化Fernet对象 f = Fernet(key) # 加密Salary列并转为字符串存储 df['Salary'] = df['Salary'].apply(lambda x: f.encrypt(str(x).encode()).decode('utf-8')) # 保存加密数据到CSV df.to_csv('encrypted_data.csv', index=False) # 读取加密数据 df = pd.read_csv('encrypted_data.csv') # 解密Salary列 try: df['Salary'] = df['Salary'].apply(lambda x: int(f.decrypt(x.encode()).decode())) except InvalidToken as e: print(f"Error: {e}") print(f"Key: {key}") raise # 打印解密后数据 print(df)
内容的提问来源于stack exchange,提问作者Susy84
相关产品推荐
相关产品推荐

