java - java.util.Base64.getMimeDecoder() 接受长度超过 76 个字符的 String 是否正常?

标签 java java-8 base64

我使用java.util.Base64(在Java8中引入)及其rfc2045解码器,可通过Base64.getMimeDecoder()使用。我预计对长度超过 76 个字符的 Base64 编码字符串进行解码会导致异常,但它似乎有效。

String value = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
// encode with rfc4648 to have a String longer than 76 chars 
String encoded = new String(java.util.Base64.getEncoder().encode(value.getBytes()));
System.out.println(encoded.length()); // 84 chars
// decode with rfc2045
String decoded = new String(java.util.Base64.getMimeDecoder().decode(encoded.getBytes()));
System.out.println(decoded.equals(value)); // true

这是 rfc2045 的 java Base64 实现中的错误还是允许输入长度超过 76 个字符的字符串?

最佳答案

检查 RFC2045,这是 Base64 第 6.8 节中唯一提到 76 字符限制状态的地方

The encoded output stream must be represented in lines of no more than 76 characters each.

所以这里只提到编码。

“Quoted-Printable”第 6.7 节中有一个关于解码的部分内容为

(5) Encoded lines must not be longer than 76 characters, not counting the trailing CRLF. If longer lines are found in incoming, encoded data, a robust implementation might nevertheless decode the lines, and might report the erroneous encoding to the user.

所以这里明确允许解码太长的行。由于 6.8 根本没有提到解码,我认为调整上一段的规定是公平的。

顺便说一句,java 的“Mime”解码器比“Basic”解码器更宽松,因为它会忽略非 Base64 字符,而“Basic”解码器将拒绝整个输入。

关于java - java.util.Base64.getMimeDecoder() 接受长度超过 76 个字符的 String 是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38009500/

相关文章:

java - LoggingFilter 在 Jersey 和嵌入式 Jetty 中被忽略

java - 将简单 map 转换为 map 列表的 map

multithreading - 在 FutureTask 中包装 Callable/Runnable 有什么好处?

java - 加密/解密(使用 AES)大文件并通过 HTTP 传输

java - 我可以使用什么符号表来存储约 5000 万个字符串并进行快速查找,而不会耗尽堆空间?

java - setHorizo​​ntalGroup() 的参数

java - 在父类(super class)和子类中实现同名但不同实现的方法

java - Collectors.toMap 在与未用作值的对象不同的属性上编写合并函数

node.js - 如何在nodejs中解码Base64字符串并作为图像上传到amazon s3?

javascript - 如何使用javascript将图像保存在解析云中