1. Base64 加密算法
1.1 标准 Base64 算法
Base64 编码是程序开发中比较常用的一种编码算法,是常用来存储或传输一些二进制数据的方法,也是 MIME(多用途互联网邮件扩展)中的一种编码方法 。
Base64 可以实现将任何数据转换为可打印字符表示的字符串,避免数据在传输过程中失真,Base64 最开始用来在邮件发送中将非 ASCLL 字符内容转换为 ASCLL字符。
标准 Base64 是一种用于传输 8Bit 字节码的编码方式之一,基于 64 个可打印字符来表示二进制数据,使用的可打印字符包括有:A-Z、a-z、0-9、+、/ 共 64 个。
1.2 非标准 Base64 算法
UrlBase64
标准 Base64 算法中使用了 + 和 / 字符,这与 URL 以及文件系统中存在冲突,因此延伸出了一种 UrlBase64 算法,该算法中将标准 Base64 的 + 和 / 替换成为了 - 和 _ 字符。
MIME Base64
MIME Base64 算法是一种更加友好的编码格式,其定义了每行只能输出 76 个字符,如果长度超出 76,会进行换行并在行末尾增加换行符号 \r\n
, 最后一行字符长度即时不足 76,也同样会增加回车换行符号。
3. Java 实现 Base64 加解密
3.1 apache.commons-codex 包
apache.commons-codex 包中提供了的 Base64 等许多编码格式转换,可以通过其进行实现。
import org.apache.commons.codec.binary.Base64; public class Base64Util { //base64 编码 public static String encode(byte[] bytes) { return new String(Base64.encodeBase64(bytes)); } //base64 解码 public static String decode(byte[] bytes) { return new String(Base64.decodeBase64(bytes)); } public static void main(String[] args) { String string = "test1234"; //编码 String encode = encode(string.getBytes()); System.out.println(string + "\t编码后的字符串为:" + encode); //解码 String decode = decode(encode.getBytes()); System.out.println(encode + "\t字符串解码后为:" + decode); } } 复制代码
3.2 Java8 中的 Base64
Java8 之后,JDK 工具包中提供了 Base64 特性,可以直接使用来完成编码和解码操作。
import java.nio.charset.StandardCharsets; import java.util.Base64; public class Base64Util { final static Base64.Encoder encoder = Base64.getEncoder(); final static Base64.Decoder decoder = Base64.getDecoder(); public static String encode(String text) { return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8)); } public static String decode(String encodedText) { return new String(decoder.decode(encodedText), StandardCharsets.UTF_8); } public static void main(String[] args) { String str = "test1234"; System.out.println("编码后的字符串为:"); System.out.println(Base64Util.encode(str)); System.out.println("解码后的字符串为:"); System.out.println(Base64Util.decode(Base64Util.encode(str))); } } 复制代码
-
使用 UTF-8 指定编码和解码格式,保证操作过程中不会出现中文乱码问题,如果不指定编码格式 Base64 会使用环境默认编码格式。
-
windows 下默认为 GBK 编码,而 Linux 下默认为 utf-8 编码,因此在编码和解码时指定统一的编码格式是良好的编程习惯。
3.3 非标准 Base64 编码实现
Java8 的 Base64 包中同时提供了非标准 Base64 的编码方法
UrlBase64
-
Base64.getUrlEncoder()
-
Base64.getUrlDecoder()
MimBease64
-
Base64.getMimeEncoder()
-
Base64.getMimeDecoder()
4. 图片的 Base64 编码
4.1 图片转字符串
Java 对图片编码得到 Base64 字符串
public static String GetImageStr(String imgFilePath) { // 将图片文件转化为字节数组字符串,并进行 Base64 编码处理 byte[] data = null; // 读取图片字节数组 try { InputStream in = new FileInputStream(imgFilePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // 对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); // 返回字节数组的 Base64 编码字符串 return encoder.encode(data); } 复制代码
- 如果需要将得到的 base64 字符串展示在 html 的 img 标签中,需要在字符串中添加
data:image/jpg;base64,
前缀
<img src="data:image/jpg;base64,..." /> 复制代码
4.2 Base64 字符串转图片
对于标准的 Base64 字符串,还可以直接使用 Base64 解码方法转成图片文件,但是如果是 img 标签中的字符串,需要去掉特定的前缀后再转成图片,否则图片无法打开。
public static void base642Image(String imgData) { // Base64 字符串判空 if (imgData == null) { return ; } String imgFilePath = "C:\\Desktop\\temp\\test.jpeg"; BASE64Decoder decoder = new BASE64Decoder(); OutputStream out = null; try { out = new FileOutputStream(imgFilePath); byte[] bytes = decoder.decodeBuffer(imgData); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) { bytes[i] += 256; } } out.write(bytes); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 复制代码