【Java小工匠聊密码学】--base64编码
1、Base64 概述
1.1 什么是Base64编码
可以将任意的字节数组数据,通过算法,生成只有(大小写英文、数字、+、/)(一共64个字符)内容表示的字符串数据。即将任意的内容转换为可见的字符串形式。
1.2、Base64 编码表
1.3、Base64 算法由来
以前发送邮件只支持可见字符的传送。由此,需要有一个方法将不可见的字符转换为可见的字符,便产生了Base64编码算法。
1.4、Base64 与 加密关系
(1)Base 64不是加密算法,是一种编码解码算法,通过Base64编码的数据,可以解码回来。
(2) 如果把Base64 一定要把Base64 理解为加密算法的话,Base64 是公布密钥的加密算法。加密原则:公布算法,但是不公布密钥
2、Base64 编码算法
2.1 编码规则
(1)将数据按照 3个字节一组的形式进行处理,每三个字节在编码之后被转换为4个字节。(即:如果一个数据有6个字节,可编码后将包含6/3*4=8个字节)
(2)当数据的长度无法满足3的倍数的情况下,最后的数据需要进行填充操作,即补“=” ,这里“=”是填充字符,不要理解为第65个字符
2.2 编码过程
(1) 将原始数据3个一组,按位进行分割为 每6位一个字节的形式,进行转换,形成新的4个字节。这四个字节才通过Base64编码表进行映射,形成最后实际的Base64编码结果。
(2)如果原始数据最后无法凑成3个字节,则补填充,以“=”作为替换,代表没有数据。
3、Base64 算法应用
(1) Base64 JSON 二进制数据
服务器给客户端在JSON中传递二进制数据
(2) Base64 图片编码
部分小图片使用Base64进行保存。
(3)Base64 在URL中的应用
Base64 在URL编码应用时,由于'+' 和 '-' 会被浏览器进行转义,因此使用'-','_' 替换,在common codec的实现用,有将提供相应的方法。
(4)Base64编码字符显示回车换行
Base64编码,内容非常多时,common codec实现中,可以在生成Base64字符串是,长多超过指定字符串(默认76个字符串)在生成的Base64字符串中加入换行符(默认'\r\n')
4、算法实现
4.1 JDK 实现
package lzf.cipher.jdk; import java.util.Base64; /** * @author Java小工匠 */ public class JdkBase64Utils { // base64 编码 public static String base64Encoder(byte[] bytes) { return Base64.getEncoder().encodeToString(bytes); } // base64 解码 public static byte[] base64Decode(byte[] src) { return Base64.getDecoder().decode(src); } // base64 解码 public static String base64DecodeToStr(byte[] src) { return new String(base64Decode(src)); } public static void main(String[] args) { String base64 = base64Encoder("java小工匠".getBytes()); System.out.println("编码:" + base64); String str = base64DecodeToStr(base64.getBytes()); System.out.println("解码:" + str); } }
4.2 CC 实现
package lzf.cipher.cc; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.StringUtils; /** * @author Java小工匠 */ public class CCBase64Utils { // base64 编码 public static String base64Encoder(byte[] bytes) { return Base64.encodeBase64String(bytes); } // base64 解码 public static byte[] base64Decode(byte[] src) { return Base64.decodeBase64(src); } // base64 解码 public static String base64DecodeToStr(byte[] src) { return new String(base64Decode(src)); } // CC base64编码,编码长度超过76个字符,添加\r\n 字符进行换行 public static String base64EncodeToChunkedStr(byte[] data) { byte[] bytes = Base64.encodeBase64(data, true); return StringUtils.newStringUsAscii(bytes); } // 使用'-' 和 '_' 下划线替换Base64 编码中的 '+' 和 '/',解决 URL传输问题 public static String base64EncodeToURLSafeString(byte[] data) { return Base64.encodeBase64URLSafeString(data); } public static void main(String[] args) { String base64 = base64Encoder("java小工匠".getBytes()); System.out.println("编码:" + base64); String str = base64DecodeToStr(base64.getBytes()); System.out.println("解码:" + str); String strNewLine = "如果base64超过76个字符,Base64编码就会产生换行,默认添加\r\n符号!"; String ccBase64Chunked = base64EncodeToChunkedStr(strNewLine.getBytes()); System.out.println(ccBase64Chunked); System.out.println("========================"); String strUrl = "URLBase64编码,使用'-'和'_'替换'+'和'/'"; String ccBBase64Url = base64EncodeToURLSafeString(strUrl.getBytes()); System.out.println(ccBBase64Url); } }
4.3 BC 实现
package lzf.cipher.bc; import org.bouncycastle.util.encoders.Base64; /** * @author Java小工匠 */ public class BCBase64Utils { // base64 编码 public static String base64Encoder(byte[] bytes) { return Base64.toBase64String(bytes); } // base64 解码 public static byte[] base64Decode(byte[] src) { return Base64.decode(src); } // base64 解码 public static String base64DecodeToStr(byte[] src) { return new String(base64Decode(src)); } public static void main(String[] args) { String base64 = base64Encoder("java小工匠".getBytes()); System.out.println("编码:" + base64); String str = base64DecodeToStr(base64.getBytes()); System.out.println("解码:" + str); } }
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】
个人公众号,欢迎关注,查阅更多精彩历史!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
这是专门为测试人员准备的书单集赞有礼
点击链接购书 软件产品和软件系统已经当知无愧地成为很多企业在激烈的市场竞争中取胜的关键因素之一,而由于软件的开发和测试主要还是依赖人的智力活动,如何保障软件产品的质量一直以来都是绕不过的难题。面对越来越大规模的测试组织以及越来越复杂的软件产品,如何保障测试本身以及软件产品质量的稳定性并持续提升企业价值,就成为企业能否以优质的产品胜出竞争的成功关键因素。 今天在第一届TMMi中国峰会现场,小编带来了一波福利,专享于属于测试人员的你。 现场福利 1.如果你有幸在现场,转发本条微信到朋友圈,集赞30个,即可现场领取图书一本,先到先得哦。 2.如果你不在现场,转发本条微信到朋友圈(或者50人以上微信群),即可获得异步社区e读版电子书20元现金券一张,共计50张。 测试类诚意书单 《TMMi精华——目标驱动的测试过程改进》 [荷兰] 埃里克·范·温尼戴尔(Erik Van Veenedaal) 简·雅普·肯尼吉特(Jan Jaap Cannegieter)著 点击链接购买纸书 TMMi是由TMMi基金会开发的非营利的、独立的、测试成熟度模型。通过运用TMMi,组织可以改进测试过程,并且可以在测试...
- 下一篇
Python--(爬虫与数据库的连接)
(每一天都是属于你的!) Python对于初学后巩固基础的人还是更多的来接触python爬虫会更好一些,在Python爬虫中包含很多基础部分知识,并且在项目中会提升你的成功感!加油! 我在工作之余时间,把Python的爬虫基础内容整理了一下,资料因为太多所以都放在QQ群内了,需要的可以来---607021567。 今天整理了一个两个网站的小说阅读平台的爬虫,将两个网站的小说可按自有的格式抓取下来自动生成txt文件。 项目介绍: --Python爬虫 --模块:requests,BeautifulSoup,time --分析:request模块作用于网站的连接与处理,BeautifulSoup作用于源码中的代码分析与抓取,time主要是在我们抓取的过程中加入时间限制(这个主要是应对有网站监控的,这里我们就不需要了) 因为这里没有涉及到数据库相关的操作,所以没有对数据库的相关详细内容,但是我会将Python与mongodb、MySQL、Sqlserver的连接方式的代码会附赠在下面。 一、网页分析: 首先步步分析网页内容:https://www.booktxt.net/6_6453/2...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群