我使用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个字符作为输入?
答案 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编码,仍会生成换行符。解码不需要这样的人为限制。人们不应该怀疑是否进行了更宽松的解码。它不会降低质量。