2016-06-24 6 views
2

Ich benutze java.util.Base64 (vorstellen in Java8) und seine rfc2045 Decoder mit Base64.getMimeDecoder(). Ich erwartete, dass die Decodierung eines Base64-codierten Strings, der länger als 76 Zeichen ist, zu einer Ausnahme führen würde, aber es scheint zu funktionieren.Ist es normal, dass java.util.Base64.getMimeDecoder() akzeptiert String länger als 76 Zeichen?

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 

Ist es ein Fehler in der Java-Base64 Implementierung von RFC2045 oder ist es erlaubt, Strings zu haben mehr als 76 Zeichen als Eingabe?

+1

Ich würde denken, dass die Decodierung liberal sein sollte, längere Strings zu akzeptieren, aber der Encoder sollte versuchen, dem Standard so genau wie möglich zu folgen. –

Antwort

2

Inspizieren dem RFC2045 die einzige Stelle in dem Base64-Abschnitt 6.8, der das 76-Zeichen-limit erwähnt heißt

Der codierte Ausgangsstrom in Zeilen von jeweils nicht mehr als 76 Zeichen dargestellt werden muß.

So erwähnt dies nur Codierung.

Es gibt einen Abschnitt zur Decodierung in dem „Zitat-printable“ -Abschnitt, der 6.7

liest

(5) Codierte Linien nicht mehr als 76 Zeichen lang sein, nicht die nachlauf CRLF zählen. Wenn in eingehenden, codierten Daten längere Zeilen gefunden werden, kann eine stabile Implementierung die Zeilen dennoch decodieren, und meldet möglicherweise die fehlerhafte Codierung an den Benutzer.

Also hier ist die Dekodierung von zu langen Zeilen explizit erlaubt. Da 6.8 überhaupt keine Entschlüsselung erwähnt, halte ich es für angemessen, die Vorschrift aus dem vorherigen Absatz zu übernehmen.

Als Nebenbemerkung, dass Java "Mime" -Decoder ist noch nachsichtiger als der "Basic" -Decoder, da es Nicht-Base64-Zeichen ignoriert, während der "Basic" -Decoder die gesamte Eingabe ablehnt.

1

Base64 wird an mehreren Stellen verwendet, und bevor java.util.Base64 eingeführt wurde, gab es mehrere Quellen. Die Beschränkung auf 76 Zeichen ergibt sich aus Zeilengrößen von 80 Zeichen von Lochkarten und alten monochromen Monitoren. Das Problem, das zu dieser Einschränkung führte, war, dass man in C Zeilen in einem Puffer fester Größe liest.

Wie aus dem obigen javadoc-Link ersichtlich, wird für die MIME-Codierung ein Zeilenumbruch generiert. Die Decodierung benötigt keine solche künstliche Beschränkung. Und man sollte sich nicht wundern, dass eine mildere Decodierung getan wird. Es reduziert nicht die Qualität.

Verwandte Themen