情景:获取 ID 时进行加密后,放在url中进行传参,传回时,进行解密,在解密环节出现报错:Incorrect padding   排查发现,报错的原因有两个

原因一:

有可能是python base64库编码规则不太统一导致的;解决办法就是对base64解码的string补齐等号就可以了; python中base64串的长度需为4的整数倍,故对长度不为4整数倍的base64串需要用"='补足

解决办法:   python binascii.Error: Incorrect padding

原因二:

由于标准的Base64编码后可能出现字符+/,在URL中就不能直接作为参数,

所以又有一种"url safe"的base64编码,其实就是把字符+/分别变成-_

解决办法:

在补全位数的基础上:

base64.encodebytes(encrypt_aes)     换成      base64.urlsafe_b64encode(encrypt_aes)

base64.decodebytes(encrypt_aes)     换成      base64.urlsafe_b64decode(encrypt_aes)


参考:

base64转码过程

先说一下转换过程,详细的可以参考阮一峰、廖雪峰博客:

所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

具体来说,转换方式可以分为四步。

第一步,将每三个字节作为一组,一共是24个二进制位。

第二步,将这24个二进制位分为四组,每个组有6个二进制位。

第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。

第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。

  0 A  17 R   34 i   51 z

  1 B  18 S   35 j   52 0

  2 C  19 T   36 k   53 1

  3 D  20 U   37 l   54 2

  4 E  21 V   38 m   55 3

  5 F  22 W   39 n   56 4

  6 G  23 X   40 o   57 5

  7 H  24 Y   41 p   58 6

  8 I   25 Z   42 q   59 7

  9 J  26 a   43 r   60 8

  10 K  27 b   44 s   61 9

  11 L  28 c   45 t   62 +

  12 M  29 d   46 u   63 /

  13 N  30 e   47 v

  14 O  31 f   48 w   

  15 P  32 g   49 x

  16 Q  33 h   50 y

因为,Base64将三个字节转化成四个字节,因此Base64编码后的文本,会比原文本大出三分之一左右。

Base64笔记 - 阮一峰的网络日志

如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

base64 - 廖雪峰的官方网站

Incorrect padding错误

谷歌找到答案 ,说是有可能去掉了编码后的等号,可以手动加上,解决方式如下:

def decode_base64(data):"""Decode base64, padding being optional.:param data: Base64 data as an ASCII byte string:returns: The decoded byte string."""missing_padding = len(data) % 4if missing_padding != 0:data += b'='* (4 - missing_padding)return base64.decodestring(data)

我试了试,其实还是同样的错误,看来并不是等号的问题。

继续尝试,又有人说可能是末尾多了字符,可尝试去掉,方法如下:

lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:result = base64.decodestring(strg[:lenx])
except etc

我又试了试,还是不行~看来也不是这个问题

再往下看,看到了这个

Update 2: It is possible that the encoding has been done in an url-safe manner. If this is the case, you will be able to see minus and underscore characters in your data, and you should be able to decode it by using base64.b64decode(strg, '-_')

意思是如果你解码的是url(咦,我就是处理url),可以这么尝试

base64.b64decode(strg, '-_')

试了一下,然也。

那么为什么会出现这种情况呢?继续查看原因,终于找到了:

由于标准的Base64编码后可能出现字符+/

在URL中就不能直接作为参数,

所以又有一种"url safe"的base64编码,其实就是把字符+/分别变成-_

base64 - 廖雪峰的官方网站

然后,我们这个问题又有另外一个解决方式了:

base64.urlsafe_b64decode(base64_url)

【Python】base64解码报错 Incorrect padding相关推荐

  1. python3 base64.b64decode Base64解码报错: Incorrect padding

    根据Base64加密的原理,base64编码后的字符长度为4的倍数,如果不足4位,用=来补位.如果没有补位,就会报错:Incorrect padding.解决方法就是把缺少的=补上. import b ...

  2. base64解码报错Illegal base64 character

    起因:原有的代码model使用String类型来接收前端的base64密码,而使用String类型接收存储密码会有安全隐患(因为String对象不可改变,因此只能等待垃圾收集器来清理内存中的数据,但是 ...

  3. python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call

    python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call ...

  4. python导入openpyxl报错问题,终于解决啦

    python导入openpyxl报错问题,终于解决啦 参考文章: (1)python导入openpyxl报错问题,终于解决啦 (2)https://www.cnblogs.com/guotang/p/ ...

  5. Python 中文注释报错解决方法

    Python 中文注释报错解决方法 参考文章: (1)Python 中文注释报错解决方法 (2)https://www.cnblogs.com/cjiong/p/5881983.html 备忘一下.

  6. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

  7. vivado 综合报错 “ incorrect freePtr. Call out of sequence? “

    vivado 综合报错 " incorrect freePtr. Call out of sequence? " 很多FPGA的初学者或者第一次使用Viado作为开发工具的同学经常 ...

  8. python安装报错类型_解决Python安装cryptography报错问题

    解决Python安装cryptography报错问题 错误一: gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wst ...

  9. 神奇的python(五)之python强制退出报错(异常)解决方法

    简介:python程序在执行时,有时候由于某些模块冲突或者是定时器冲突,会出现很多奇怪的错误,为此我们需要让python程序在退出时免受这些问题的干扰. (1) 常用的信号类型: SIGINT 终止进 ...

  10. python打开文件报错无效序列_解决Python 写文件报错TypeError的问题

    处理上传的文件: f1 = request.FILES['pic'] fname = '%s/%s' % (settings.MEDIA_ROOT, f1.name) with open(fname, ...

最新文章

  1. 详解亚马逊:物流为何是电商命脉
  2. 查找谁在使用文件系统
  3. 华为p20可以用云闪付吗_华为hcIE有多难?零基础可以通过华为hcie认证吗?
  4. android垂直公告,【Android之垂直翻页公告】
  5. Google使用机器学习助力数据中心节能
  6. python的.arsort()函数的用法
  7. matlab迭代次数,怎么知道程序中的迭代次数呢
  8. InputStream和Reader,FileInputStream和 FileReader的区别
  9. ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法
  10. 图像识别pytorch入门1
  11. 5月上旬香港域名总量动态:大幅度下降 净减6466个
  12. CentOS 6系统FreeSwitch和RTMP服务 安装及演示(一)
  13. oracle PS/SQL DEVELOPER
  14. 8款流行前沿的HTML5文本编辑器
  15. 在Chrome浏览器添加IDM插件——顽强版
  16. 数据包络分析例题解析(含MATLAB代码)
  17. 2.7 汽车之家口碑爬虫
  18. ps 抠图 修改背景颜色
  19. 【C语言基础学习笔记】一、初始C语言(总结篇)
  20. booster 框架学习(一)

热门文章

  1. excel 复选框 制作动态表格
  2. 【清华大学】操作系统 陈渝 Part2 —— 中断、异常和系统调用
  3. 炒鞋风潮下的“真鞋”鉴定生意
  4. 用飞桨,为少数民族濒危语言生成一本词典
  5. Android App 安全登录认证解决方案
  6. 表单提交时报错:No result defined for action com.ylj.action.BbsAction and result input
  7. 2018这类程序员工资最高!年薪50万只能算一般
  8. 迷失逃脱小程序_恐怖游戏大全:奇幻夜之迷失!密室逃脱解谜恐怖小程序
  9. 无线局域网和蜂窝移动网络_干货!无线AP覆盖系统解决方案
  10. html5制作人物动作,炫酷的科技代码人物特效PS动作插件