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

Python中如何将数据库存储的字节格式字符串转为byte类型避免Fernet解密报错

问题原因

你数据库中存储的不是纯Fernet加密生成的base64字符串,而是Python bytes对象直接转为字符串后的格式,自带b'前缀和'后缀。直接对该字符串执行encode()方法会将前缀后缀也转换为bytes内容,最终得到的b"b'yAe45XvJk...vg='"和Fernet合法token格式不匹配,因此触发cryptography.fernet.InvalidToken报错。

解决方案

有两种常用的修复方案:

方案1:字符串截取(轻量快速)

直接去掉字符串前后的格式包裹字符,提取纯加密字符串后再解密,代码示例如下:

encMessage1 = df['data_value'][4] # 从MYSQL数据库读取字符串
# 去除前后的b'和'包裹符
pure_enc = encMessage1.strip("b'").rstrip("'")
enc_bytes = pure_enc.encode()
cont = fernet.decrypt(enc_bytes).decode()

方案2:ast安全转换(兼容性更好)

使用Python内置的ast.literal_eval方法,直接将字符串格式的bytes对象转换为真实bytes类型,避免字符串切割可能出现的边界错误:

import ast

encMessage1 = df['data_value'][4] # 从MYSQL数据库读取字符串
# 直接转换字符串格式的bytes为真实bytes对象
enc_bytes = ast.literal_eval(encMessage1)
cont = fernet.decrypt(enc_bytes).decode()
长期优化建议
  • 后续数据入库时,不要直接将bytes对象转字符串存储,先调用.decode()方法转为纯base64字符串后再入库,即可避免多余格式包裹的问题
  • 新增入库校验逻辑,确保加密字符串存储时没有额外格式字符

内容的提问来源于stack exchange,提问作者starlord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:57:00