热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java中Base64编码原理实例讲解

这篇文章主要介绍了java中Base64编码原理实例讲解,文章讲解的很清晰,有对于这方面不太懂的同学可以研究下

什么是 Base64 编码

Base64 编码是最常见的编码方式,基于 64 个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程。

使用场景

数据加密或签名通过 Base64 转换为字符串存储或传输。
不能传输文件的网络环境可以转换 Base64 进行网络传输。
在文本资源(如 HTML 和 CSS文件)中嵌入图片文件或其他二进制资源。
在 URL、网页中传输少量二进制数据等等。

Base64 编码原理

原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重新划为 4 组(每组为 6位,高位补两个 0 为 8 位后作为一个新字节,划分后的每个字节数值的范围是 00000000 - 00111111 即十进制的 0 - 63),然后将划分后的字节的数值作为索引查编码表,获得相应的字符,从而得到编码后的字符串。通过 64 个字符来对任意数据进行编码,因此称为 Base64。

Base64 标准编码表:

以字符串 “NEW” 为例,对其 Base64 编码:

如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 有效的字节。将这样处理,将其用 0 补充至 6 的最小倍数位后,剩余的空位将使用 “=” 填充处理。例如:


经过 Base64 编码后数据会增大,数据经过 Base64 处理后,由原来每 3 个字节,变为为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。

对于字符内容,相同字符串不同的字符编码(如 utf-8 与 gbk)的 Base64 编码结果会不一样。Base64 是一种通过查表的编码方法,不能用于加密,即使是自定义编码表也不行。

JDK 内置的 Base64 API

在 JDK 7 之前可以使用 sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder 来 Base64 编码解码,但 com.sun 开头的包不是公开的,属于 sun 的内部方法,不建议使用。所以可以使用 Apache 提供的工具包(commons-codec-1.11.jar)来进行 Base64 编码解码。

从 JDK 7 开始 Oracle 发表了声明,不希望 Java 程序调用 JDK 系统包中以 sun 开头的类(www.oracle.com/technetwork/java/faq-sun-packages-142232.html)。

从 JKD 8 开始,Oracle 已经把 Base64 进行优化并放到 JDK 的 java.util 包,所以推荐直接使用 java.util.Base64 进行 Base64 编码和解码。

// Base64 编码
String encoder = Base64.getEncoder().encodeToString("但愿人长久 千里共婵娟".getBytes());
System.err.println(encoder);		

// Base64 解码
String decoder = new String(Base64.getDecoder().decode(encoder));
System.err.println(decoder);

// 结果
// 5L2G5oS/5Lq66ZW/5LmFIOWNg+mHjOWFseWpteWOnw==
// 但愿人长久 千里共婵娟

标准的 Base64 编码中可能出现字符 + 和 / 字符,不能直接用在 URL 中,需要对其进行处理,把字符 + 和 / 分别变成 - 和 _ ,JDK 也提供了对应的方法。

// URL安全的 Base64 编码
String safeEncoder = Base64.getUrlEncoder().encodeToString("但愿人长久 千里共婵娟".getBytes());
System.err.println(safeEncoder);	

// URL安全的 Base64 解码
String safeDecoder = new String(Base64.getUrlDecoder().decode(safeEncoder));
System.err.println(safeDecoder);

// 结果
// 5L2G5oS_5Lq66ZW_5LmFIOWNg-mHjOWFseWpteWOnw==
// 但愿人长久 千里共婵娟

小结

Base64 是基于 64 个可打印字符来表示任意二进制数据的方法。

Base64 通常用于数据加密或签名后转换为可见字符串,文本资源(如 HTML 和 CSS 中)中嵌入图片文件等等。

原理是把二进制数据每 3 个字节重新划为 4 组(每三个 8 位字节,即总共24位,可以由四个 6 位 Base64 数值表示),然后作为索引查编码表,获得相应的字符,从而得到编码后的字符串。

经过 Base64 编码后数据会增大,因为每 3 个字节,重新划分为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。

Base64 是一种通过索引查表的编码方法,不能用于加密。

参考:
https://en.wikipedia.org/wiki/Base64
https://www.ietf.org/rfc/rfc4648.txt
https://www.liaoxuefeng.com/wiki/897692888725344/949441536192576

到此这篇关于java中Base64编码原理实例讲解的文章就介绍到这了,更多相关java中base64编码原理内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
author-avatar
益林代表_610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有