昨天对接一个客户的接口, 踩了一些坑, 和 base64 有关, 顺便补了下 有关 Base64 的一些知识
事件起因
最近对接了一个客户的平台
中间有接受异步通知验证签名的一个环节
结果拿到对方的签名后 怎么都校验不通过
无奈请求对方协助
最终发现是对方发来的 签名有问题 正常签名都会进行 base64 转码后再发送出去
但是对方 将标准Base64中的 + 和 / 分别改成了 - 和 _
文档上也没有明确声明处理过了这些东西 真的坑爹!
而我拿到签名后也没有注意过签名的格式是否正确 直接进行了 base64_decode (毕竟之前对接那些大厂的签名都是直接解析的)
所以导致最终怎么验证签名都不正确
Base64 编码
Base64编码是一种可以将任意二进制数据转到文本字符串的编码方法
由于 2^{6}=64},所以每6个比特为一个单元,对应某个可打印字符。
3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
常用在传输少量的二进制数据 比如 邮件, URL, Cookie, 网页 中
在Base64中可打印的字符 包括 A-Z, a-z, 0-9, 这样共有62个字符
在MIME格式的电子邮件中,Base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。
使用时,在传输编码方式中指定Base64, 使用的字符包括大小写拉丁字母各26个、数字10个、加号 + 和斜杠 / ,共64个字符, 等号 = 用来作为后缀用途
这种也是我们现在常用的了
另外 Base64 转码后的长度会比原文增加 33% 左右 不太适合太长数据的传输
Base64 索引表
| 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w | |||
| 0 | A | 16 | Q | 32 | g | 48 | w | |||
| 1 | B | 17 | R | 33 | h | 49 | x | |||
| 2 | C | 18 | S | 34 | i | 50 | y | |||
| 3 | D | 19 | T | 35 | j | 51 | z | |||
| 4 | E | 20 | U | 36 | k | 52 | 0 | |||
| 5 | F | 21 | V | 37 | l | 53 | 1 | |||
| 6 | G | 22 | W | 38 | m | 54 | 2 | |||
| 7 | H | 23 | X | 39 | n | 55 | 3 | |||
| 8 | I | 24 | Y | 40 | o | 56 | 4 | |||
| 9 | J | 25 | Z | 41 | p | 57 | 5 | |||
| 10 | K | 26 | a | 42 | q | 58 | 6 | |||
| 11 | L | 27 | b | 43 | r | 59 | 7 | |||
| 12 | M | 28 | c | 44 | s | 60 | 8 | |||
| 13 | N | 29 | d | 45 | t | 61 | 9 | |||
| 14 | O | 30 | e | 46 | u | 62 | + | |||
| 15 | P | 31 | f | 47 | v | 63 | / |
下面来看一个示例

第一步,”M”、”a”、”n”的ASCII值分别是77、97、110,对应的二进制值是01001101、01100001、01101110,将它们连成一个24位的二进制字符串010011010110000101101110。
第二步,将这个24位的二进制字符串分成4组,每组6个二进制位:010011、010110、000101、101110。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节:00010011、00010110、00000101、00101110。它们的十进制值分别是19、22、5、46。
第四步,根据上表,得到每个值对应Base64编码,即T、W、F、u。
因此,Man的Base64编码就是TWFu。
Base64 - URL
有时候我们可能需要在 URL 传递信息 如果使用 Base64 转码的话
其中的 + 和 / 会被转换成 %2b 和 %2f 类似这种(被转成什么 这个和当前的文件编码有关系的)
这些会给存储数据库 解码等造成歧义
所以有些处理就是把 + 和 / 分别改成了 - 和 _ 来传输
我遇到的就是这种情况 希望大家以后可以注意下这个格式!
致谢
https://zh.wikipedia.org/wiki/Base64
http://www.ruanyifeng.com/blog/2008/06/base64.html
https://segmentfault.com/a/1190000004533485
https://blog.csdn.net/m0_37661961/article/details/78825129