关于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 )
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

每人讨论技术 你说这是怎么了 社会性死亡 :joy: :see_no_evil:

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!