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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:57:57