1.Base64编码

Base64一种把二进制数据用文本表示的编码算法。例如

中有3个字节{\xe4, \xb8, \xad},一共是24位,每6位分组,变成4个字节{39, 0b, 22, 2d},最终结果位5Lit。

如果长度不是3的整数倍:

  • 末尾补0x00或0x00 0x00

    * 编码后加=表示补充了1个字节

    * 编码后加==表示补充了2个字节

Base64编码:

  • 一种用文本(A-Z, a-z, 0-9, +/=)表示二进制内容的方式
  • 适于用文本协议
  • 效率下降。原因是2进制文件经过Base64编码,长度会增加1/3。

应用

  • 电子邮件协议。如在电子邮件中上传文件,就可以使用Base64编码,然后以文本的方式传送。

2.示例代码

2.1Base64编码

public class SplitString {
public static void main(String[] args) throws Exception {
String original = "Hello\u00ff编码测试";
byte[] bs = original.getBytes("UTF-8");
//1.8以后不推荐使用
String b64_1 = java.util.Base64.getEncoder().encodeToString(bs);
System.out.println("java.util.Base64编码:"+b64_1);
String ori_1 = new String(java.util.Base64.getDecoder().decode(b64_1),"UTF-8");
System.out.println("java.util.Base64解码:"+ori_1);
System.out.println(); String b64_2=com.sun.org.apache.xml.internal.security.utils.Base64.encode(bs);
System.out.println("com.sun.org.apache.xml.internal.security.utils.Base64编码:"+b64_2);
String ori_2 = new String(com.sun.org.apache.xml.internal.security.utils.Base64.decode(b64_2),"UTF-8");
System.out.println("com.sun.org.apache.xml.internal.security.utils.Base64解码:"+ori_2);
System.out.println(); String b64_3 = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(bs);
System.out.println("com.sun.org.apache.xerces.internal.impl.dv.util.Base64编码:"+b64_3);
String ori_3 = new String(com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(b64_3),"UTF-8");
System.out.println("com.sun.org.apache.xerces.internal.impl.dv.util.Base64解码:"+ori_3);
}
}


### 2.2去除末尾的=号
```#java
public class SplitString {
public static void main(String[] args) throws Exception {
String original = "Hello\u00ff编码测试";
byte[] bs = original.getBytes("UTF-8");
//1.8以后不推荐使用
String b64_1 = java.util.Base64.getEncoder().withoutPadding().encodeToString(bs);
System.out.println("java.util.Base64编码:"+b64_1);
String ori_1 = new String(java.util.Base64.getDecoder().decode(b64_1),"UTF-8");
System.out.println("java.util.Base64解码:"+ori_1);
System.out.println();

}

}

<img src="https://img2018.cnblogs.com/blog/1418970/201905/1418970-20190507210306883-1767357485.png" width="500" />
### 2.3Base6的URL编码
标准的Base64编码在URL中会引起冲突。如+,/。通过Base64的URL编码可以将+替换为-,将/替换为_来避免冲突
```#java
public class SplitString {
public static void main(String[] args) throws Exception {
String original = "Hello\u00ff编码测试";
byte[] bs = original.getBytes("UTF-8");
//1.8以后不推荐使用
String b64_1 = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(bs);
System.out.println("java.util.Base64编码:"+b64_1);
String ori_1 = new String(java.util.Base64.getUrlDecoder().decode(b64_1),"UTF-8");
System.out.println("java.util.Base64解码:"+ori_1);
System.out.println();
}
}

3.总结:

  • Base64是编码算法,不是加密算法
  • Base64编码的目的是把任意二进制数据编码为文本(代价是长度增加1/3)
  • 其他编码:Base32,Base48,Base58

廖雪峰Java10加密与安全-2加密算法-2Base64编码的更多相关文章

  1. 廖雪峰Java10加密与安全-2加密算法-1URL编码

    1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...

  2. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法

    1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...

  3. 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法

    1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...

  4. 廖雪峰Java10加密与安全-4加密算法-2口令加密算法

    对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...

  5. 廖雪峰Java10加密与安全-4加密算法-1对称加密算法

    1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...

  6. 廖雪峰Java10加密与安全-6数字证书-1数字证书

    数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改

  7. 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念

    数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...

  8. 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法

    1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...

  9. 廖雪峰Java10加密与安全-3摘要算法-5Hmac

    1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...

随机推荐

  1. MVC到底是设计模式还是一种框架还是一种架构? https://www.zhihu.com/question/31079945

    具体知乎讨论内容:https://www.zhihu.com/question/31079945 MVC到底是设计模式还是一种框架还是一种架构? 我认为它是3种设计模式的演变和组合:观察者模式(Obs ...

  2. 第二十一篇:spring怎么做缓存

     项目背景:你可能遇情景:1.一个做统计的页面,每次刷新需要调接口做查询 ,是联表查询,查出来的数据还需要做一些计算或者加工,不算页面上的图表插件,刷新一次,延迟个几秒钟才出的来2. 一个统计接口如此 ...

  3. 测试环境添加spark parcel 2.1步骤

    1.先到http://archive.cloudera.com/spark2/parcels/2.1.0.cloudera1/ 下载需要的文件比如我linux版本需要是6的 hadoop6需要下载这些 ...

  4. LINUX挂接Windows文件共享

    Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包.现在流行的linux发行版绝大多数已经包含了samba软 ...

  5. windows 内核下获取进程路径

    windows 内核下获取进程路径 思路:1):在EPROCESS结构中获取.此时要用到一个导出函数:PsGetProcessImageFileName,申明如下: NTSYSAPI UCHAR *  ...

  6. vc 识别移动硬盘 U盘,本地硬盘

    说明:有时候我们在做设备监控的时候,要识别一些链接设备,在使用函数GetDriveType的时候,U盘可以返回DRIVE_REMOVABLE,而本地硬盘硬盘和移动硬盘DRIVE_FIXED,因此还需要 ...

  7. Cutting Game

    Cutting Game 刚开始有一\(n\times m\)的矩形网格纸,双方轮流操作,剪网格纸,对于任意一个局面而言,你可以选择其中一张网格纸,把它剪成两个长宽都是整数的网格纸,剪出\(1\tim ...

  8. CF596D Wilbur and Trees

    题意:有一些高度为h的树在数轴上.每次选择剩下的树中最左边或是最右边的树推倒(各50%概率),往左倒有p的概率,往右倒1-p. 一棵树倒了,如果挨到的另一棵树与该数的距离严格小于h,那么它也会往同方向 ...

  9. (转)第02节:在Canvas上画简单的图形

    我们现在已经可以在HTML中使用Fabric.js库了,那这节我们就详细的学习一下如何在canvas上画出简单的图形. 在画东西之前我们需要了解画任何东西的基本三个步骤: 声明画布(canvas),用 ...

  10. 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)

    网络工程师课程---3.IP与路由器(ip地址的主要作用是什么) 一.总结 一句话总结: 用来标识一个节点的网络地址 划分网段 1.如何得到ip地址的网段号? ip和子网掩码  化成二进制后取 与运算 ...