杰瑞科技汇

Java中Base64加密解密如何实现?

Base64 并不是一种加密算法,而是一种编码方式,它的主要目的是将二进制数据(如图片、文件等)转换为一串由 64 个可打印字符(A-Z, a-z, 0-9, +, /)组成的文本字符串,这使得二进制数据可以在只支持文本的协议(如 HTTP、SMTP)中安全地传输。

Java中Base64加密解密如何实现?-图1
(图片来源网络,侵删)

Java 8 及更高版本 (推荐)

从 Java 8 开始,Java 标准库中正式引入了 java.util.Base64 类,这是官方推荐、也是最简单、最高效的方式。

核心类

  • java.util.Base64: 提供了静态方法来获取编码器和解码器。
  • java.util.Base64.Encoder: 负责将字节数组或字符串编码为 Base64 字符串。
  • java.util.Base64.Decoder: 负责将 Base64 字符串解码为原始的字节数组。

示例:字符串的编码与解码

这是最常见的使用场景,需要注意的是,Java 的 Base64 编码器直接操作的是字节数组,而不是字符串,你需要先将字符串转换为字节数组(通常使用 UTF-8 编码),解码后再将字节数组转换回字符串。

import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Java8Base64Example {
    public static void main(String[] args) {
        // 原始字符串
        String originalString = "Hello, Base64 in Java 8!";
        // --- 1. 编码 ---
        // 获取 Base64 编码器
        Base64.Encoder encoder = Base64.getEncoder();
        // 将字符串转换为字节数组 (使用 UTF-8 编码)
        byte[] bytesToEncode = originalString.getBytes(StandardCharsets.UTF_8);
        // 进行编码
        byte[] encodedBytes = encoder.encode(bytesToEncode);
        // 将编码后的字节数组转换为字符串
        String encodedString = new String(encodedBytes, StandardCharsets.UTF_8);
        System.out.println("原始字符串: " + originalString);
        System.out.println("编码后字符串: " + encodedString);
        System.out.println("---------------------------------");
        // --- 2. 解码 ---
        // 获取 Base64 解码器
        Base64.Decoder decoder = Base64.getDecoder();
        // 将 Base64 字符串转换回字节数组
        byte[] bytesToDecode = encodedString.getBytes(StandardCharsets.UTF_8);
        // 进行解码
        byte[] decodedBytes = decoder.decode(bytesToDecode);
        // 将解码后的字节数组转换回字符串
        String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
        System.out.println("待解码字符串: " + encodedString);
        System.out.println("解码后字符串: " + decodedString);
        // 验证
        System.out.println("解码是否成功: " + originalString.equals(decodedString));
    }
}

输出结果:

原始字符串: Hello, Base64 in Java 8!
编码后字符串: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIDgh
---------------------------------
待解码字符串: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIDgh
解码后字符串: Hello, Base64 in Java 8!
解码是否成功: true

示例:字节数组的直接编码与解码

你处理的是二进制数据(如图片、文件),而不是字符串,这时可以直接操作字节数组。

Java中Base64加密解密如何实现?-图2
(图片来源网络,侵删)
import java.util.Base64;
public class Base64BytesExample {
    public static void main(String[] args) {
        // 原始字节数组
        byte[] originalBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        // --- 编码 ---
        Base64.Encoder encoder = Base64.getEncoder();
        byte[] encodedBytes = encoder.encode(originalBytes);
        System.out.println("原始字节数组: " + bytesToHex(originalBytes));
        System.out.println("编码后字节数组: " + new String(encodedBytes)); // Base64 字符串
        System.out.println("---------------------------------");
        // --- 解码 ---
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedBytes = decoder.decode(encodedBytes);
        System.out.println("解码后字节数组: " + bytesToHex(decodedBytes));
        // 验证
        boolean isSame = true;
        for (int i = 0; i < originalBytes.length; i++) {
            if (originalBytes[i] != decodedBytes[i]) {
                isSame = false;
                break;
            }
        }
        System.out.println("解码是否成功: " + isSame);
    }
    // 一个辅助方法,用于将字节数组转换为十六进制字符串,方便打印
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b));
        }
        return sb.toString();
    }
}

输出结果:

原始字节数组: 01 02 03 04 05 06 07 08 09 0A 
编码后字节数组: AQIDBAUGBwgJAA==
---------------------------------
解码后字节数组: 01 02 03 04 05 06 07 08 09 0A 
解码是否成功: true

示例:URL 安全编码

标准的 Base64 编码中包含 和 这两个字符,在 URL 中, 会被解释为空格, 是路径分隔符,这可能会导致问题。java.util.Base64 提供了一个 URL 安全的编码器。

import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Base64UrlExample {
    public static void main(String[] args) {
        String originalString = "Hello, Base64 URL Safe!";
        // 获取 URL 安全的编码器
        Base64.Encoder urlEncoder = Base64.getUrlEncoder();
        byte[] urlEncodedBytes = urlEncoder.encode(originalString.getBytes(StandardCharsets.UTF_8));
        String urlEncodedString = new String(urlEncodedBytes, StandardCharsets.UTF_8);
        System.out.println("原始字符串: " + originalString);
        System.out.println("URL 安全编码后字符串: " + urlEncodedString);
        // 获取 URL 安全的解码器
        Base64.Decoder urlDecoder = Base64.getUrlDecoder();
        byte[] urlDecodedBytes = urlDecoder.decode(urlEncodedBytes);
        String urlDecodedString = new String(urlDecodedBytes, StandardCharsets.UTF_8);
        System.out.println("URL 安全解码后字符串: " + urlDecodedString);
    }
}

输出结果:

原始字符串: Hello, Base64 URL Safe!
URL 安全编码后字符串: SGVsbG8sIEJhc2U2NCBVUkwgU2FmZSE=
URL 安全解码后字符串: Hello, Base64 URL Safe!

注意:URL 安全编码会使用 替代 ,使用 _ 替代 。

Java中Base64加密解密如何实现?-图3
(图片来源网络,侵删)

Java 8 之前版本

如果你在使用 Java 7 或更早的版本,你需要使用第三方库,最常用的是 Apache Commons Codec

添加依赖

你需要在你的项目中添加 commons-codec 库的依赖。

Maven (pom.xml):

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version> <!-- 使用最新版本 -->
</dependency>

Gradle (build.gradle):

implementation 'commons-codec:commons-codec:1.15' // 使用最新版本

使用示例

API 非常简洁,org.apache.commons.codec.binary.Base64 类提供了静态方法。

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
public CommonsCodecExample {
    public static void main(String[] args) {
        String originalString = "Hello, Base64 with Commons Codec!";
        // --- 1. 编码 ---
        // 使用 StringUtils 简化字符串和字节数组的转换
        byte[] encodedBytes = Base64.encodeBase64(originalString.getBytes(StandardCharsets.UTF_8));
        String encodedString = StringUtils.newStringUtf8(encodedBytes);
        System.out.println("原始字符串: " + originalString);
        System.out.println("编码后字符串: " + encodedString);
        System.out.println("---------------------------------");
        // --- 2. 解码 ---
        byte[] decodedBytes = Base64.decodeBase64(encodedString);
        String decodedString = StringUtils.newStringUtf8(decodedBytes);
        System.out.println("待解码字符串: " + encodedString);
        System.out.println("解码后字符串: " + decodedString);
        // 验证
        System.out.println("解码是否成功: " + originalString.equals(decodedString));
    }
}

总结与对比

特性 Java 8+ (java.util.Base64) Java 8- (Apache Commons Codec)
官方性 官方标准库,无需额外依赖 第三方库,需要添加依赖
推荐度 强烈推荐,是现代 Java 开发的标准 旧项目或无法升级 Java 版本时使用
API 风格 Encoder / Decoder 对象,方法链式调用 Base64.encodeBase64() 等静态方法,非常直接
功能 提供标准、URL 安全、MIME 等多种编码器 功能强大,同样支持标准、URL 安全等
性能 通常性能更好,因为是 JVM 内部实现 性能也很好,是业界广泛验证的库
  • 如果你使用的是 Java 8 或更高版本,请毫不犹豫地使用 java.util.Base64
  • 如果你维护的是一个旧项目,并且无法升级 Java 版本,Apache Commons Codec 是一个非常可靠和成熟的选择。
分享:
扫描分享到社交APP
上一篇
下一篇