关于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 /

下面来看一个示例

base64--Man解析

第一步,”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 类似这种 (被转成什么 这个和当前的文件编码有关系的)

这些会给存储数据库 解码等造成歧义

所以有些处理就是把 +/ 分别改成了 -_ 来传输

我遇到的就是这种情况 希望大家以后可以注意下这个格式!

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:码咚没 (ID: codingdongmei)
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。