Java Base64 编码
Base64 编码是一种常见的二进制到文本的编码方式,在 Java 中,它常用于加密、数据传输以及存储时的字符转换。Java 8 及以上版本提供了内置的 java.util.Base64 类,使得 Base64 编码和解码更加方便和高效。
目录
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 常见实践
-
避免使用 Base64 进行加密
- Base64 只是编码,不是加密,不能提供安全性。
- 如果需要安全存储或传输数据,请使用 AES、RSA 等加密算法。
-
处理 Base64 编码带来的长度增加
- Base64 会增加 约 33% 的数据大小,可能影响网络带宽和存储效率。
-
在网络传输时,优先使用 URL Base64
- 避免
+和/导致 URL 解析问题。
- 避免
-
处理 Base64 的换行符
Base64.getMimeEncoder()适用于需要换行的情况,如电子邮件和 XML。- 一般情况下,使用
Base64.getEncoder()避免换行问题。
Base64 最佳实践
| 需求 | 适用编码器 |
|---|---|
| 一般数据编码 | Base64.getEncoder() |
| URL 参数、JWT 令牌 | Base64.getUrlEncoder() |
| 电子邮件、XML 数据 | Base64.getMimeEncoder() |
| 处理二进制数据 | 先转换为 byte[],再进行 Base64 |
小结
- Base64 是一种常见的 二进制到文本 编码方式,适用于数据存储、网络传输等场景。
- Java 8 提供了
Base64API,包括 标准编码、URL 安全编码、MIME 编码 三种方式。 - Base64 不是加密方法,不能用于数据安全存储。
- 选择适合的 Base64 编码方式可提高数据传输的可靠性和效率。

浙公网安备 33010602011771号