web安全 (2)-base64

  • Post author:
  • Post category:其他


base64在安全领域主要用于安全文件或数据的传输及存储,如一些专业的证书、密钥、token等,它们并不遵守任何文字编码,如果你用文字工具打开看,会看到很多特殊字符(乱码)。这些乱码在网上传输的时候,可能会被多个网关接收并转发,而有的网关并不一定能识别这些乱码,从而导致你的数据被错误处理或丢失。此时就需要先将乱码转换为大家都能识别的字符,才能正常传输,这种公认的字符就是base64编码。

64个字符

base64编码就是将你的原始数据转换成只包含64种字符的编码格式,这64种字符是大家都支持的,如下:

52个大小写字母,10个数字,2个符号。索引是它的十进制数值,64个数值刚好可以用6位二进制表示。

转换过程

  1. 将原始数据按其原有的编码格式,转换为二进制。
  2. 在计算机中1个字节是8位二进制,每次将3个8位二进制拆分为4个6位二进制。3*8=24=4*6。
  3. 在6位二进制前面补2个0,变成8位二进制,占满一个字节。
  4. 将第3步的8位二进制转换为十进制数字,其中只有尾数6位是有效的,所以数值刚好就是上图中的0-63。
  5. 根据图的数值对应的字符,就是最终的转换结果。

比如:小字字母x,编写以下java代码可看到它的ASCII码值为120

		int x='x';
		System.out.println(x);
  1. 120=64+32+16+8,用8位二进制表示为01111000。
  2. 此时最多只够转换为2个6位二进制:011110   000000   这里尾数不够补了4个0。
  3. 前面补0转8位二进制:00011110  00000000
  4. 转十进制:30  0
  5. 对应上图中字符:e  A

我们用java中的Base64类来验证一下

		String x = Base64.getMimeEncoder().encodeToString("x".getBytes());
		System.out.println(x);

最终输出 eA==,上面说过每4个6位二进制为一组,如果最后不足4个的,后面补=号。也有些编码工具不补等号,因为在解码的时候根据4的倍数就能知道它的总长度。



版权声明:本文为wangb_java原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。