格式转换 - Base64算法

简介

  • Base64算法的作用:将二进制数据转换成可见字符串。

由来

  • 一些场景下使用二进制数据非常不方便,如下:
  1. 一些字符协议(http协议等),协议内容都是字符串,数据接收处理也是按照字符串形式,如需传输二进制数据比较困难,强制按字符串形式处理,由于不可见字符以及控制字符的存在,容易出现问题。
  2. 一些特殊应用,例如:配置存储,用户需要查看/编辑数据,如需存储二进制数据(秘钥等)非常不方便。
  • 因此需要一种算法将二进制数据转换成可见字符。

算法处理

  1. 编码,将二进制数据转换成可见字符串
  2. 解码,将可见字符串转换成二进制数据

实现原理

  • ASCII码表中可见字符数量多于2的6次方,少于2的7次方,因此Base64算法选取64(2的6次方)个可见字符,组成数据转换表,采用查表法,将二进制数据的每6 bits转换为一个可见字符(8 bits)。

填充(padding)

  • Base64算法的操作单元是6 bits,1个字节有8 bits,因此如果原始数据bit 数量是24(8和6的公倍数)的倍数,即3个字节,则不需要padding,否则就需要填充字节0,直至是3的倍数,填充了几个字节,转换后的字符就加几个‘=’,因此编码后输出的文本末尾可能会出现1或2个’='。
  • 例子:
1. 字节数组: ABCDEFG   
按3字节分组:[ABC] [DEF] [G] (需要填充两个字节0)
结果将是: [QUJD] [REVG] [Rw==] (编码结果加两个=符号)
2. 字节数组: ABCDEFGH   
按3字节分组:[ABC] [DEF] [GH] (需要填充一个字节0)
结果将是:[QUJD] [REVG] [R0g=] (编码结果加一个=符号)
  • 注意:填充的处理规则需要注意,补充缺少的位后的多余填充数据不做编码。

标准码表

  • 标准码表的大小为2^6=64,这也是Base64名称的由来。
码值 字符 码值 字符 码值 字符 码值 字符
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具有一定的安全性,但是由于标准码表是公开的,其安全性是非常低的。
  • 自定义转换表是增强Base64算法安全性的常见做法。

自定义转换表

  • 常见做法如下:
  1. 打乱标准表中字符顺序
  2. 使用其它可见字符替换标准表中部分字符

你可能感兴趣的:(算法,Base64)