网站注册页面html,西安到北京,网站建设各个模块的功能,微信网站开发哪家好hi#xff0c;大家好#xff0c;我是开发者FTD。相信很多同学在工作中#xff0c;经常会用到Base64编码#xff0c;那大家知道为什么会有Base64编码吗#xff1f;我们为什么要使用它呢#xff0c;它又是怎么实现的呢#xff1f;下面就让我们来一起深入探究一下Base64编码…hi大家好我是开发者FTD。相信很多同学在工作中经常会用到Base64编码那大家知道为什么会有Base64编码吗我们为什么要使用它呢它又是怎么实现的呢下面就让我们来一起深入探究一下Base64编码吧。
Base 家族
在开始之前我们先给大家介绍一下Base家族。虽然我们在工作中使用最多的是Base64但是Base家族可不止是只有Base64除了Base64之外Base家族还有Base32和Base16。
我们都知道ASCII 编码ASCII 编码是用2562的8次方个字符对二进制数据进行编码的方式同样的 Base64 编码是用642的6次方个字符对二进制数据进行编码的方式 Base32 编码是用322的5次方个字符对二进制数据进行编码的方式 Base16 编码是用162的4次方个字符对二进制数据进行编码的方式
那Base家族有这么多编码形式为什么偏偏使用Base64呢 Base64 编码是用642的6次方个特定的ASCII字符来表示2562的8次方个ASCII字符也就是说三个ASCII字符经过Base64编码后变为四个的ASCII字符显示公约数为24编码后数据长度比原来增加1/3不足3n用“”补足。 Base32 编码就是用322的5次方个特定的ASCII字符来表示2562的8次方个ASCII码也就是说五个ASCII字符经过Base32编码后会变为八个ASCII字符显示公约数为40编码后数据长度比原来增加3/5不足8n用“”补足。 Base16 编码就是用162的4次方个特定的ASCII字符表示2562的8次方个ASCII字符也就是说一个ASCII字符经过Base16编码后会变为两个ASCII字符显示编码后数据长度比原来增加一倍不足2n用“”补足。
从上面可以看出Base64编码后长度增加是最少的这也是我们选用Base64的一个重要原因。
Base64 简介
Base64顾名思义就是基于64个可打印字符来表示二进制数据的一种方法注意它并不是一种加密算法。对于64个打印字符我们只需要6个二进制位就可以完全表示了。那么我们如何利用8个二进制位来表示只需要6个二进制位就可以完全表示的可打印字符呢由于2的6次方等于64所以我们可以将每6个位元为一个单元对应某个可打印字符。三个字节有24个位元对应于4个Base64单元即3个字节需要用4个可打印字符来表示。
Base64是从二进制数据到字符的过程。所以计算机中所有的内容包括文本、图片、音频、视频等等都可以使用Base64编码来表示。
Base64 编码原理
Base64编码就是使用64个字符作为一个基本字符集 小写字母a-z、大写字母A-Z、数字0-9、符号、/再加上作为垫字的实际上是65个字符 然后所有其他符号都根据一定规则转换成这个字符集中的字符。
具体来说Base64编码的转换方式可以分为以下四步
第一步将每三个字节作为一组一共是24个二进制位第二步将这24个二进制位分为四组每个组有6个二进制位第三步在每组前面加两个00扩展成32个二进制位即四个字节第四步根据下表得到扩展后的每个字节的对应符号这就是Base64的编码值
Base64 编码的字符索引表如下所示
数值字符数值字符数值字符数值字符0A16Q32g48w1B17R33h49x2C18S34i50y3D19T35j51z4E20U36k5205F21V37l5316G22W38m5427H23X39n5538I24Y40o5649J25Z41p57510K26a42q58611L27b43r59712M28c44s60813N29d45t61914O30e46u6215P31f47v63/
有了这个字符索引表我们就可以把任意的二进制转换成Base64的编码了下面我们通过几个例子给大家展示一下转换的过程。
1假设现在有字符串 FTD 需要转换成base64的编码格式 第一步“F”、“T”、“D” 字符对应的ASCII码值分别为708468对应的二进制值是01000110、01010100、01000100。如图第二三行所示由此组成一个24位的二进制字符串。第二步将24位二进制按照每6位二进制位一组分成四组。第三步在上面每一组前面补两个0扩展成32个二进制位此时变为四个字节00010001、00100101、00010001、00000100。分别对应的值Base64编码索引为17、37、17、4。第四步用上面的值在Base64 字符索引表中进行查找分别对应R、I、R、E。
因此字符串 “FTD” 经过Base64 编码之后就变为RIRE 。
2上面的例子中的字符正好是三个字节如果字节数不足三个时该如何处理呢下面我们以 F 和 FT 分别举例说明如下 如上表所示由于字符F的二进制为01000110按照每6位进行分组此时只能分成一组第二组缺少4位如果位数不足时用0补齐第三组和第四组完全没有数据则用**补上。因此字符F经过Base64编码后得到的数值为Rg**。
3下面我们再看一下如果只有两个字符的情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BIpbsJ8y-1614862870049)(https://i.loli.net/2021/02/13/SF5zvPMbNTRtsh8.png)]
如上表所示这个也属于位数不足需要补位的情况。第一组和第二组按照正常的分组计算第三组由于不足位数最后两位补0第四组完全没有数据用**补上。因此字符FT经过Base64编码后得到的数值为RlQ**。
关于中文的Base64编码
大家都知道中文编码有很多种例如GB2312、GBK、GB18030不同的汉字使用不同的编码格式进行编码后它的二进制是不同的所以在进行Base64编码后他们的Base64编码的值也是不同的。这就要求我们在解码的时候需要注意原文的字符集格式一定要保持一致才能正确解码。
例如 中文 “【我是开发者FTD】公众号” UTF-8 格式的Base64 编码后的值是44CQ5oiR5piv5byA5YR6ICFRlRE44CR5YWs5LyX5Y3 中文 “【我是开发者FTD】公众号” GB2312 格式的Base64 编码后的值是ob7O0srHv6q3otXfRlREob5q9bausU Base64 是加密算法吗
Base64 主要不是用来加密的它主要的用途是把一些二进制数转成普通字符用于网络传输这是因为一些二进制字符在传输协议中属于控制字符不能直接在网络上传输。另外还有一些系统中只能使用ASCII字符。Base64 编码就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。Base64 并不是安全领域下的加密解密算法虽然有时候也会经常看到所谓的Base64加密解密算法。其实Base64只能算是一个编码算法对数据内容进行编码来适合网络传输。虽然Base64编码过后原文也变成无法直接理解的字符格式但是这种编码方式比较初级很简单很容易就可以被还原成原文所以如果有比较重要的信息需要加密一定要使用我们之前文章中介绍的那些加密算法进行数据的安全保护。
Base64 编码实现
Java语言中有多个库实现了Base64编码不管哪一个库最终的结果都是一样的。
JDK 提供的 Base64 编码实现
public static String encode(String data) {return Base64.getEncoder().encodeToString(data.getBytes());
}public static String decode(String base64Data) {return new String(Base64.getDecoder().decode(base64Data));
}Bouncy Castle 提供的 Base64 编码实现
public static String encode(String data) {return new String(Base64.encode(data.getBytes()));
}public static String decode(String base64Data) {return new String(Base64.decode(base64Data));
}Commons Codec 提供的 Base64 编码实现
public static String encode(String data) {return Base64.encodeBase64String(data.getBytes());
}public static String decode(String base64Data) {return new String(Base64.decodeBase64(base64Data));
}下面让我们用Java语言的实现来验证一下我们第二章节的推理是否正确吧代码如下
public static void main(String[] args) {String ftd FTD;String ft FT;String f F;System.out.println(FTD base64 编码: encode(ftd));System.out.println(FT base64 编码: encode(ft));System.out.println(F base64 编码: encode(f));
}输出结果为
FTD base64 编码:RlRE
FT base64 编码:RlQ
F base64 编码:Rg可以看到和我们分析所得的结果是完全一样的。 查看完整代码请访问 https://github.com/ForTheDevelopers/JavaSecurity 总结
Base64是我们在工作中经常用到但是很少有人会深入研究一下它的实现原理如果理解不当甚至可能还会有人用它当做加解密用到业务系统关键位置可能会引发比较严重的后果相信大家看完上述的内容后应该对Base64编码已经有了深刻的理解了吧。
技术人技术魂每天肝一篇技术文ヾ(◍°∇°◍)哈哈~
关于作者
GitHubhttps://github.com/ForTheDevelopers掘金https://juejin.cn/user/1204720472953022CSDNhttps://blog.csdn.net/ForTheDevelopers知乎https://www.zhihu.com/people/forthedeveloperssegmentfaulthttps://segmentfault.com/u/for_the_developers
联系作者
微信号ForTheDeveloper 公众号ForTheDevelopers