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

时间:2016-06-24 09:05:07

标签: java java-8 base64

我使用java.util.Base64(在Java8中引入)及其Base64.getMimeDecoder()提供的rfc2045解码器。我期望解码超过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个字符作为输入?

2 个答案:

答案 0 :(得分:2)

检查RFC2045是Base64第6.8节中提到76个字符限制状态的唯一位置

  

编码的输出流必须以不再行的方式表示      每个超过76个字符。

所以这只提到编码。

在“Quoted-Printable”第6.7节中有一节涉及解码,其中包括

  

(5)编码行不得超过76个字符,             不计算尾随CRLF。如果更长的线             在传入的编码数据中发现,一个强大的             然而,实现可能会对行进行解码             可能会向用户报告错误的编码。

因此,明确允许解码太长的行。由于6.8根本没有提及解码,我认为适应前一段的规则是公平的。

另外请注意,java的“Mime” - 解码器比“Basic”解码器更宽松,因为它会忽略非Base64字符,而“Basic”解码器将拒绝整个输入。

答案 1 :(得分:1)

Base64在几个地方使用,在引入java.util.Base64之前有几个来源。 76个字符的限制源于打孔卡和旧单色显示器的80个字符的行号。 导致这种限制的问题是在C中,在固定大小的缓冲区中读取一行。

从上面的javadoc链接可以看出,对于mime编码,仍会生成换行符。解码不需要这样的人为限制。人们不应该怀疑是否进行了更宽松的解码。它不会降低质量。