Base64 编码是一种常见的二进制到文本的编码方式,在 Java 中,它常用于加密、数据传输以及存储时的字符转换。Java 8 及以上版本提供了内置的 java.util.Base64
类,使得 Base64 编码和解码更加方便和高效。
目录
- Base64 编码简介
- Java Base64 API
- Base64 编码和解码示例
- 基本 Base64 编码
- URL Base64 编码
- MIME Base64 编码
- 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 提供了
Base64
API,包括 标准编码、URL 安全编码、MIME 编码 三种方式。 - Base64 不是加密方法,不能用于数据安全存储。
- 选择适合的 Base64 编码方式可提高数据传输的可靠性和效率。
参考资料
- Java 官方 Base64 文档
- RFC 4648 - Base64 Data Encodings