Base64编码 - Java加密与安全

Base64编码 - Java加密与安全_第1张图片

BASE64编码

什么是Base64编码?

它是一种把二进制的数据用文本表示的编码算法.

String base64Encoder(byte[] data)

byte[]{0xe4,0xb8,0xad} -> "5Lit"

0xe4,0xb8,0xad通过base64编码,表示出来的字符串,就是"5Lit"


我们看一下如何使用Base进行编码,假如我们把中用UTF8表示的字节表示出来,他正好是三个字节,0xe4,0xb8,0xad,

utf8bytes("中") = {0xe4,0xb8,0xad};我们紧接着把这是三个字节一共是24位,按照每6位分组,分成4个字节,

这4个字节对应的16进制,正好是39,0b,22,2d,然后我们通过查表,就可以查到39对应的是5,0b对应的字母是大写L,

22对应的字母是i,2d对应的字母是t,所以最终编码出来的字符串,是5Lit

Base64编码 - Java加密与安全_第2张图片

Base64编码表是从索引0一直到索引63,0对应的编码是A,1对应的编码是B,依次类推

Base64编码 - Java加密与安全_第3张图片

那么使用Base64编码的目的是什么呢?

1. 它是一种使用文本表示二进制内容的方式

2. 它适用于文本协议

3. 但是他的效率会下降


例如电子邮件协议,他就是一个文本协议,如果我们要在电子邮件中添加一个二进制的文件,我们就可以用base64编码,

然后以文本的形式传送,他的缺点是传输的效率会降低,因为二进制经过base64编码,长度会增加三分之一,如果长度

不是3的整数倍,那么我们就需要在末尾补充一个0x00字节,或者是两个0x00字节,编码后我们加上一个等号就补充了

一个字节,加上两个等号就是补充了两个字节,这样写法的时候我们就可以去掉
package com.learn.securl;

import java.util.Base64;

/**
 * 我们看一下如何使用Base64编码
 * @author Leon.Sun
 *
 */
public class SecBase64Demo {
	public static void main(String[] args) throws Exception {
		String original = "Hello\u00ff编码测试";
		/**
		 * 首先我们通过getBytes把一个字符串转换为一个字节数组
		 * 然后我们通过Base64.getEncoder.encodeToString把一个字节数组表示为一个字符串表示的Base64
		 * 
		 * 在JAVA中使用Base64编码的时候,
		 * 我们还可以使用withoutPadding,
		 * 这样我们就可以把末尾的等号去掉
		 * SGVsbG/Dv+e8lueggea1i+ivlQ
		 * 可以看到末尾的等号已经没有了
		 * 实际上有没有等号对于解码来说是没有影响的
		 * 
		 */
		// String b64 = Base64.getEncoder().encodeToString(original.getBytes("UTF-8"));
		// String b64 = Base64.getEncoder().withoutPadding().encodeToString(original.getBytes("UTF-8"));
		/**
		 * 这样我们就可以实现Base64的URL编码,
		 * SGVsbG_Dv-e8lueggea1i-ivlQ
		 * 在java中base64的url编码
		 * 它会把加号变成减号,把斜杠变成下划线
		 * 这样我们在传递URL参数的时候,
		 * 就不会引起冲突
		 * 
		 */
		String b64 = Base64.getUrlEncoder().withoutPadding().encodeToString(original.getBytes("UTF-8"));
		/**
		 * 我们打印一下base64编码
		 * 
		 * SGVsbG/Dv+e8lueggea1i+ivlQ==
		 * 第一行就是通过base64编码编码出的字符串
		 * 最后两个等号就是我们添加的两个字节
		 */
		System.out.println(b64);
		/**
		 * 如果我们要解码base64,
		 * 我们用Base64.getDecoder().decode就可以还原出原始的byte数组,
		 * 然后我们通过new String传入UTF-8,
		 * 把这个byte数组还原成String
		 */
		// String ori = new String(Base64.getDecoder().decode(b64), "UTF-8");
		String ori = new String(Base64.getUrlDecoder().decode(b64), "UTF-8");
		System.out.println(ori);
	}
}
最后我们总结一下:

1. Base64编码它是一种编码算法,不是一种加密算法

2. Base64编码的目的是把任意二进制数据编码为文本,他的代价是长度增加了三分之一

3. 还有一些类似于Base64的编码,例如Base32,Base48,Base58等

 

你可能感兴趣的:(Base64编码 - Java加密与安全)