欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Base64 加密与解密

程序员文章站 2024-03-14 13:24:46
...

Java Base64 加密与解密

本文我们探讨不同方式实现java中Base4加密和解密功能。主要是java 8 api为主,同时也学习来自Apache Commons 的API。

Java 8 中 Base 64

java 8 在标准API中增加Base64功能,通过 java.util.Base64工具类。首先我们看基本的加密过程:

Java 8 基本 Base64

基本的加密尽量保持简单,加密输入字符串没有增加任何换行符。输出被映射到“A-Za-z0-9+/”字符集中,解密从该字符集中解析为任意字符。

首先加密一个简单字符串:

String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());

我们通过简单Base64.getEncoder()工具方法获得完整的加密API,现在我们来解密并返回原始字符串:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

java 8 Base64编码没有填充

如果Base64编码的二进制数据不是3的倍数,输出结果使用“=”号进行填充,所以结果会有一个或两个“=”号。
解密是填充的“=”号会被丢弃。如果你省略填充“=”,结果字符串可能不能被正确解密,可以简单使用解密没有填充方法:

String encodedString = 
  Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

Java 8 URL 加密

URL加密和上述基本加密类似,它使用URL和文件名安全Base64字母表(没有‘+’和‘/’,增加‘-’和‘_’),不添加任何换行隔:

String originalUrl = "https://www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java";
String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes());

解密方式一致——getUrlDecoder() 工具方法返回java.util.Base64.Decoder ,然后解密URL:

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);

Java 8 MIME 加密

MIME 英文全称为:Multipurpose Internet Mail Extensions。
首先生成一些基本MIME输入数据用于加密:

private static StringBuilder getMimeBuffer() {
    StringBuilder buffer = new StringBuilder();
    for (int count = 0; count < 10; ++count) {
        buffer.append(UUID.randomUUID().toString());
    }
    return buffer;
}

MIME加密工具生成Base64加密输出,输出被映射到“A-Za-z0-9+/”字符集中,编码输出必须以每行不超过76个字符的形式表示,并使用后面跟着的回车符’\r’和换行符’\n’为分隔符。

StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

getMimeDecoder() 工具方法返回java.util.Base64.Decoder 用于解密过程:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);

使用Apache Commons Code实现加密和解密

首先引入maven依赖:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

其主要API是org.apache.commons.codec.binary.Base64类,其重构了带有不同参数的构造函数。

  • Base64(boolean urlSafe) – 通过控制URL安全模式创建 Base64 API
  • Base64(int lineLength) – 创建URL非安全模式的 Base64 API ,并控制行的长度(缺省为 76)
  • Base64(int lineLength, byte[] lineSeparator) – 接收额外换行符参数创建 Base64 API去,缺省为 CRLF (“\r\n”)

Base64 API创建之后,加密、解密则非常简单:

String originalInput = "test input";
Base64 base64 = new Base64();
String encodedString = new String(base64.encode(originalInput.getBytes()));

Base64的decode() 方法返回解密字符串:

String decodedString = new String(base64.decode(encodedString.getBytes()));

另外也可以使用Base64静态API,代替创建实例:

String originalInput = "test input";
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

总结

本文介绍了java中Base64加密和解密的基本用法,使用java 8 新引入的API和Apache Commons。
另外还有其他库实现类似功能——java.xml.bind.DataTypeConverter 提供的 printHexBinary 和 parseBase64Binary。