计算机|Java 实现 Base64 加密&解密方法

1. Base64 加密算法 1.1 标准 Base64 算法
【计算机|Java 实现 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 = https://www.it610.com/article/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, 前缀
计算机|Java 实现 Base64 加密&解密方法
文章图片
复制代码

4.2 Base64 字符串转图片
对于标准的 Base64 字符串,还可以直接使用 Base64 解码方法转成图片文件,但是如果是 img 标签中的字符串,需要去掉特定的前缀后再转成图片,否则图片无法打开。
public static void base642Image(String imgData) { // Base64 字符串判空 if (imgData =https://www.it610.com/article/= 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(); } } 复制代码

    推荐阅读