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

