严格的讲Base64并不是一种加密方法,他只是按照一定的规律,将字符串转为密文。Base64在最初被设计时,是用来对电子邮件进行处理的——在早期的电子邮件系统当中,传输协议仅支持ASCII码字符,当传输的内容非ASCII的字符时,就会发生问题。基于此,科学家和工程师发明了Base64算法,使得任意文字,都能转为ASCII码进行处理。
Base64的基本算法,可以用以下几个步骤来描述:
1.将给定的字符串以字符为单位转换为对应的字符编码(如ASCII码)。
2.将获得的字符编码转换为二进制码。
3.对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是 一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3×8=4×6=24)。
4.对获得的4个6位二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。
5.将获得的4个位二进制码转换为十进制码。
6.将获得的十进制码转换为Base64字符表中对应的字符。
由此可见,Base64加密,更像是一种字义转换,并且,他是可逆的,所以,Base64并不是主流的加密措施,它应用范围仅限于某些领域。例如,SSL/TLS证书信息,或是对URL信息进行编码,以便于传输特殊字符。
Base64这个加密方法,JDK8本身是不提供的,通常我们需要使用第三方组件,我们这里以Apache Commons Codes 1.11为例,废话不多,直接送上代码。
import org.apache.commons.codec.binary.Base64;
public class Base64Utils {
// 字符 编码
public final static String ENCODING = "utf-8";
/**
* Base64 编码
*
* @param plaintext 明文
* @return String 密文
* @throws Exception
*/
public static String encode(String plaintext) throws Exception {
// 执行 编码
byte[] b = Base64.encodeBase64(plaintext.getBytes(ENCODING));
return new String(b, ENCODING);
}
/**
* Base64 安全 编码 遵循 RFC 2045 实现 RFC 2045标准:Base64编码,每76行,增加一个换行符 \r\n
* ,常见场景是SSL/TLS证书内容,即是Base64编码
*
* @param plaintext 明文
* @return String 密文
* @throws Exception
*/
public static String encodeSafe(String plaintext) throws Exception {
// 执行 编码
byte[] b = Base64.encodeBase64(plaintext.getBytes(ENCODING), true);
return new String(b, ENCODING);
}
/**
* Base64 解码
*
* @param ciphertext 密文
* @return String 明文
* @throws Exception
*/
public static String decode(String data) throws Exception {
// 执行 解码
byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
}