Java Base64 编码

Base64 编码是一种常见的二进制到文本的编码方式,在 Java 中,它常用于加密、数据传输以及存储时的字符转换。Java 8 及以上版本提供了内置的 java.util.Base64 类,使得 Base64 编码和解码更加方便和高效。


目录

  1. Base64 编码简介
  2. Java Base64 API
  3. Base64 编码和解码示例
  4. Base64 常见实践
  5. Base64 最佳实践
  6. 小结
  7. 参考资料

Base64 编码简介

Base64 是一种用于表示二进制数据的编码方式,常用于:

  • 将二进制数据(如图片、文件)转换为文本格式,以便通过 JSON、XML、HTML 进行传输或存储。
  • 在 URL、Cookie、JWT 令牌等环境下使用。
  • 对数据进行简单的加密(但 Base64 不是加密算法,仅用于编码)。

Base64 将 3 个字节(24 位)的数据编码成 4 个 ASCII 字符,因此最终的 Base64 编码长度是原数据的 1.33 倍


Java Base64 API

Java 8 及以上版本提供了 java.util.Base64 类,该类包含 3 种基本编码器:

编码类型 说明
Base64.getEncoder() 标准 Base64 编码,适用于一般数据
Base64.getUrlEncoder() URL 安全的 Base64 编码,避免 +/ 在 URL 传输时的特殊含义
Base64.getMimeEncoder() 适用于 MIME 格式的编码,通常用于邮件和 XML 数据

此外,每个编码器都有对应的解码器,例如 Base64.getDecoder()Base64.getUrlDecoder()Base64.getMimeDecoder()


Base64 编码和解码示例

基本 Base64 编码

import java.util.Base64;

public class Base64Example {
    public static void main(String[] args) {
        String original = "Hello, Base64 in Java!";
        
        // 编码
        String encoded = Base64.getEncoder().encodeToString(original.getBytes());
        System.out.println("Base64 编码: " + encoded);

        // 解码
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes);
        System.out.println("Base64 解码: " + decoded);
    }
}

输出

Base64 编码: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIQ==
Base64 解码: Hello, Base64 in Java!

URL Base64 编码

场景:用于 URL 参数、JWT 令牌等,避免 +/ 在 URL 传输时的特殊含义。

import java.util.Base64;

public class UrlBase64Example {
    public static void main(String[] args) {
        String url = "https://example.com/?query=hello+world";
        
        // 编码
        String encodedUrl = Base64.getUrlEncoder().encodeToString(url.getBytes());
        System.out.println("URL 安全 Base64 编码: " + encodedUrl);

        // 解码
        byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
        String decodedUrl = new String(decodedBytes);
        System.out.println("URL 安全 Base64 解码: " + decodedUrl);
    }
}

输出

URL 安全 Base64 编码: aHR0cHM6Ly9leGFtcGxlLmNvbS8_cXVlcnk9aGVsbG8rd29ybGQ=
URL 安全 Base64 解码: https://example.com/?query=hello+world

MIME Base64 编码

场景:适用于电子邮件、XML 数据,支持每 76 个字符换行。

import java.util.Base64;

public class MimeBase64Example {
    public static void main(String[] args) {
        String longText = "This is a long text that should be split into multiple lines when encoded using MIME Base64.";
        
        // 编码
        String encodedMime = Base64.getMimeEncoder().encodeToString(longText.getBytes());
        System.out.println("MIME Base64 编码: \n" + encodedMime);

        // 解码
        byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
        String decodedMime = new String(decodedBytes);
        System.out.println("MIME Base64 解码: " + decodedMime);
    }
}

输出

MIME Base64 编码:
VGhpcyBpcyBhIGxvbmcgdGV4dCB0aGF0IHNob3VsZCBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIGxpbmVzIHdoZW4gZW5jb2RlZCB1c2luZyBNSU1FIEJhc2U2NC4=

MIME Base64 解码: This is a long text that should be split into multiple lines when encoded using MIME Base64.

Base64 常见实践

  1. 避免使用 Base64 进行加密

    • Base64 只是编码,不是加密,不能提供安全性。
    • 如果需要安全存储或传输数据,请使用 AES、RSA 等加密算法。
  2. 处理 Base64 编码带来的长度增加

    • Base64 会增加 约 33% 的数据大小,可能影响网络带宽和存储效率。
  3. 在网络传输时,优先使用 URL Base64

    • 避免 +/ 导致 URL 解析问题。
  4. 处理 Base64 的换行符

    • Base64.getMimeEncoder() 适用于需要换行的情况,如电子邮件和 XML。
    • 一般情况下,使用 Base64.getEncoder() 避免换行问题。

Base64 最佳实践

需求 适用编码器
一般数据编码 Base64.getEncoder()
URL 参数、JWT 令牌 Base64.getUrlEncoder()
电子邮件、XML 数据 Base64.getMimeEncoder()
处理二进制数据 先转换为 byte[],再进行 Base64

小结

  • Base64 是一种常见的 二进制到文本 编码方式,适用于数据存储、网络传输等场景。
  • Java 8 提供了 Base64 API,包括 标准编码、URL 安全编码、MIME 编码 三种方式。
  • Base64 不是加密方法,不能用于数据安全存储。
  • 选择适合的 Base64 编码方式可提高数据传输的可靠性和效率。

参考资料

posted @ 2025-03-07 04:17  hyzz123  阅读(541)  评论(0)    收藏  举报