Base64的基本编码方式

base64编码是一种常见的编码方式,主要用于对8bit的字节进行编码。具体的编码方式是:

  1. 把三个字节作为一组,转化为二进制的形式,一共3*8=24个二进制位。
    例如: abc 三个字符用ASCII编码,转换为二进制:
    01100001 01100010 01100011
  2. 把24个二进制数字每6个一组,分为4组:
    01100001 01100010 01100011 被分为
    011000 010110 001001 100011
  3. 按照表格,把每组二进制串转为对应字符:

表格来源于百度百科

011000 010110 001001 100011 先转为十进制数字:
24 22 9 35 对照表格,转化为字符串:
YWJj
这个字符串就是最终的Base64编码,与网络上在线编码器生成的一致:

字节数不能被三整除时的特殊处理

如果需要编码的字节不能被3整除怎么办?比如最后剩下一个单字节a,或者双字节ab。这时候我们需要特殊处理:

  1. 不足6个二进制位的补0
  2. 不足4组的,最后补字符串=

单字节a:
a => 01100001 => 011000 01 => 补0 =>
011000 010000 => 24 16 => YQ => 补=符号 => YQ==
双字节ab:
ab => 01100001 01100010 => 011000 010110 0010 => 补0 =>
011000 010110 001000 => 24 22 8 => YWI => 补=符号 => YWI=

安全的Base64编码概念

通过上面的对照表可以看到,除了大小写字母和数字之外,Base64编码后的字符串中可能包含"+/="之类的字符,而"/","="等是URL的保留字符或不安全字符,因此如果直接在URL中传输Base64编码,保留字符和不安全字符会被替换为%XX的形式,对后端来说解码不方便。如果不替换,就会造成URL注入漏洞。
因此,有一种URL安全的Base64编码,可以解决这个问题。 URL安全的Base64编码特点:

  1. 不能被3整除时,不补=符号。
  2. 生成Base64编码中,"+"和"/"被替换成其他非URL保留字符,使其可以直接放入URL中传输。
    比如"+"和"/"被替换成"-"和"_"。

安全的Base64编码也有好多种,有些编码不会去掉等号,有些编码替换的符号不同。

注意示项和示例

注意,是编码后的"+"和"/"被替换,而不是编码前的原始字符被替换,而这种情况并不常见。在没有遇到补齐和编码后出现"+"和"/"的场景下,安全和不安全的Base64编码输出是一致的。
这里看几个例子:

  1. 原字符串 abcdef
    原始Base编码: YWJjZGVm
    安全Base编码: YWJjZGVm
  2. 原字符串 +/=
    原始Base编码: Ky89
    安全Base编码: Ky89
  3. 原字符串 06?
    原始Base编码: MDY/
    安全Base编码: MDY_

可以看到,即使原字符串中包含+/等特殊字符,也与Base编码是否安全无关。只有在生成后的编码中包含+/等特殊字符时,才会出现安全的Base64编码与原始Base编码不同而情况。

Web前端中的使用

Web前端中有几种常见的Base64编码的函数和库,这几种库是安全的还是不安全的?我进行了测试:

import { Base64 } from "js-base64";
import { btoau, atobu } from "b2a";
const item = '06?';
// 方法1
const encode1 = Base64.encode(item);
const decode1 = Base64.decode(encode1);
// 方法2
const encode2 = btoau(item);
const decode2 = atobu(encode2);
// 方法3
const encode3 = window.btoa(item);
const decode3 = window.atob(encode3);

这是三种web前端常用的Base64编码方法。方法1使用了js-base64库,方法2使用了b2a库,方法3是window对象自带的编码方法。我用几个字符串进行了测试:
  

总结:三个Base64编码函数,方法1是原始的,方法2和3是安全的。但是三个方法都没有去掉最后的"="符号。实际开发中使用时,需要和后端的解码方法保持一致即可,如果不一致,可能会遇到特殊数据时后端无法正常解码。另外,目前网络上常用的在线Base64编解码,一般都是原始的Base64编码形式,并不是安全的。

Base64编码详解与URL安全的Base64编码相关推荐

  1. Base64编码详解及其变种(解决加号在URL变空格问题)

    Base64编码详解及其变种(解决加号在URL变空格问题) 参考文章: (1)Base64编码详解及其变种(解决加号在URL变空格问题) (2)https://www.cnblogs.com/life ...

  2. kali中steghide命令工具教程;7z命令详解;kali中base64命令详解

    目录 kali中steghide命令工具教程 7z命令详解 kali中base64命令详解 例:解码文本里的base64编码 kali中steghide命令工具教程 根据此博客学习(12条消息) 隐写 ...

  3. Python字符编码详解

    Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...

  4. cookie与session详解、url地址重写

    cookie与session详解.url地址重写:https://www.cnblogs.com/l199616j/p/11195667.html

  5. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. 字符、字符集和字符编码详解(一文扫清疑惑)

    前言 字符.字符集和字符编码时常看见,之前也看过一些博文,看得迷迷糊糊地,看过即忘,今天有幸碰到一篇能让我醍醐灌顶的文章,整理一下相关知识点与大家分享! 原博文地址:字符集编码详解(学习,看一篇就够了 ...

  7. 字符编码详解及由来(UNICODE,UTF-8,GBK)

    字符编码详解及由来(UNICODE,UTF-8,GBK) 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK) - 2009-01-29 09:53     一直对 ...

  8. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...

    文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...

  9. Python2.7字符编码详解

    Python2.7字符编码详解 目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3. ...

  10. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

最新文章

  1. Eclipse 中maven插件坏死解决办法
  2. SpringBoot中使用hikariCP
  3. form中onsubmit的使用
  4. [HOW TO]-从github拉取optee代码拉不下来怎么办?
  5. rosserial_java_ros系统下通过pyserial模块实现串口通讯(Python)
  6. 汇编jnl_汇编指令集
  7. plsql大字段保存类型_大揭秘,学习python,为什么数据类型有这么重要
  8. 新型APT组织正在攻击全球的政府实体
  9. windows java路径问题_java 文件路径问题
  10. etcd-java使用
  11. python怎么使用-如何使用 Python 开始建立
  12. 安装realmedia多路分配器
  13. c语言常用数学函数6,C语言入门(6)——C语言常用数学函数
  14. linux命令行中的大括号,linux命令行学习(19):花括号扩展(brace expansion)
  15. 使运行的窗口不在任务栏显示
  16. 爬虫 第二讲 urllib模块和requests模块
  17. Linux性能调优,从优化思路说起
  18. cocos2dx ipv6处理
  19. 虚拟机配置可用的DNS服务器
  20. 利用JWT安全验证(前后端分离,单点登录,分布式微服务)

热门文章

  1. grunt_从Grunt测试Grunt插件
  2. docker port is already allocated 的解决方案
  3. 阿里云服务器续费坑啊早知道不买了
  4. vue单文件组件中引用其他组件
  5. 大猫谈JNCIE实验考试备战
  6. awwwards环形动画_我在参加awwwards设计事宜和figma配置时学到的东西
  7. mysql relay log.info_技术分享 | slave_relay_log_info 表认知的一些展开
  8. 控制天象,世间的最强者!
  9. python fun函数输入某年某月_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
  10. Java编程题之某年某月某日