Java 实现 Base64 加密&解密方法

2年前 (2022) 程序员胖胖胖虎阿
280 0 0

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();
    }
}
复制代码

版权声明:程序员胖胖胖虎阿 发表于 2022年9月20日 下午1:56。
转载请注明:Java 实现 Base64 加密&解密方法 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...