Java Base64 Encoding und Decoding

Java Base64-Codierung und -Decodierung

1. Überblick

In diesem Tutorial werden wir die verschiedenen Dienstprogramme untersuchen, die Base64-Codierungs- und -Decodierungsfunktionen in Java bereitstellen.

Wir werden hauptsächlich die neuen Java 8-APIs sowie die aus Apache Commons stammenden Dienstprogramm-APIs veranschaulichen.

Weitere Lektüre:

Anleitung zur Java-URL-Codierung / -Decodierung

Der Artikel beschreibt die URL-Codierung in Java, einige Fallstricke und deren Vermeidung.

Read more

SHA-256 und SHA3-256 Hashing in Java

Eine schnelle und praktische Anleitung zum SHA-256-Hashing in Java

Read more

Neue Passwortspeicherung im Frühjahr Sicherheit 5

Eine Kurzanleitung zum Verständnis der Kennwortverschlüsselung in Spring Security 5 und zum Migrieren zu besseren Verschlüsselungsalgorithmen.

Read more

2. Java 8 für Base 64

Java 8 has finally added Base64 capabilities an die Standard-API überjava.util.Base64 utility class.

Beginnen wir mit einem grundlegenden Encoder-Prozess.

2.1. Java 8 Basic Base64

Der Basis-Encoder hält die Dinge einfach und codiert den Eingang wie er ist - ohne Zeilentrennung.

Die Ausgabe wird einem Satz von Zeichen im Zeichensatz vonA-Za-z0-9+/zugeordnet, und der Decoder lehnt alle Zeichen außerhalb dieses Satzes ab.

Lassen Sie uns zuerstencode a simple String:

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

Beachten Sie, wie wir die vollständige Encoder-API über die einfache DienstprogrammmethodegetEncoder()abrufen.

Lassen Sie uns diesen String nun wieder in die ursprüngliche Form dekodieren:

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

2.2. Java 8 Base64-Codierung ohne Auffüllen

Bei der Base64-Codierung muss die Länge der ausgegebenen codierten Zeichenfolge ein Vielfaches von 3 sein. Ist dies nicht der Fall, wird die Ausgabe mit zusätzlichen Pad-Zeichen (=) aufgefüllt.

Beim Dekodieren werden diese zusätzlichen Füllzeichen verworfen. Schauen Sie sichthis detailed answer over on StackOverflow an, um mehr über das Auffüllen in Base64 zu erfahren.

Wenn Sieskip the padding of the output benötigen - vielleicht weil der resultierende String niemals zurück dekodiert wird - können Sie einfachencode without padding wählen:

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

2.3. Java 8 URL-Codierung

Die URL-Codierung ist der oben beschriebenen Basiscodierung sehr ähnlich. Es verwendet das sichere Base64-Alphabet für URL und Dateinamen und fügt keine Zeilentrennung hinzu:

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

Die Dekodierung erfolgt auf die gleiche Weise: Die DienstprogrammmethodegetUrlDecoder()gibtjava.util.Base64.Decoder zurück, die dann zum Dekodieren der URL verwendet wird:

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

2.4. Java 8 MIME-Codierung

Beginnen wir mit der Generierung einiger grundlegender MIME-Eingaben zum Codieren:

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

Der MIME-Encoder generiert eine Base64-codierte Ausgabe unter Verwendung des Basisalphabets, jedoch in einem MIME-freundlichen Format: Jede Zeile der Ausgabe darf nicht länger als 76 Zeichen sein und endet mit einem Wagenrücklauf, gefolgt von einem Zeilenvorschub ( ):

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

Die DienstprogrammmethodegetMimeDecoder() gibtjava.util.Base64.Decoder zurück, die dann im Decodierungsprozess verwendet werden:

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

3. Encoding/Decoding Using Apache Commons Code

Zuerst müssen wir die Commons-Codec-Abhängigkeit inpom.xml definieren:


    commons-codec
    commons-codec
    1.10

Beachten Sie, dass Sie überprüfen können, ob neuere Versionen der Bibliothek überMaven central veröffentlicht wurden.

Die Haupt-API ist die Klasseorg.apache.commons.codec.binary.Base64, die mit verschiedenen Konstruktoren parametrisiert werden kann:

  • Base64(boolean urlSafe) - Erstellt die Base64-API durch Steuern des URL-sicheren Modus - Ein oder Aus

  • Base64 (int lineLength) - Erstellt die Base64-API in einem unsicheren URL-Modus und steuert die Länge der Zeile (default ist 76).

  • ”)

Bei der Erstellung der Base64-API ist sowohl die Codierung als auch die Decodierung recht einfach:

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

Die Methodedecode()der KlasseBase64gibt die decodierte Zeichenfolge zurück:

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

Eine andere einfache Option istusing the static API of Base64, anstatt eine Instanz zu erstellen:

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

4. Konvertieren einesString in einbyte Array

Manchmal müssen wir einString in einbyte[] konvertieren. Der einfachste Weg, dies zu tun, ist die Verwendung der MethodeStringgetBytes():

String originalInput = "test input";
byte[] result = originalInput.getBytes();

assertEquals(originalInput.length(), result.length);

Es ist besser, auch eine Codierung bereitzustellen und nicht von der Standardcodierung abhängig zu sein, da diese systemabhängig ist:

String originalInput = "test input";
byte[] result = originalInput.getBytes(StandardCharsets.UTF_16);

assertTrue(originalInput.length() < result.length);

Wenn unser String mitBase64codiert ist, können wir den Decoder vonthe Base64verwenden:

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = Base64.getDecoder().decode(originalInput);

assertEquals("test input", new String(result));

Wir können auch die Methode vonDatatypeConverter parseBase64Binary()verwenden:

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = DatatypeConverter.parseBase64Binary(originalInput);

assertEquals("test input", new String(result));

Schließlich können wir ein hexadezimalesString in einbyte[] konvertieren, indem wir die MethodeDatatypeConverter verwenden:

String originalInput = "7465737420696E707574";
byte[] result = DatatypeConverter.parseHexBinary(originalInput);

assertEquals("test input", new String(result));

5. Fazit

In diesem Artikel werden die Grundlagen der Base64-Codierung und -Decodierung in Java unter Verwendung der in Java 8 eingeführten neuen APIs sowie von Apache Commons erläutert.

Schließlich gibt es einige andere APIs, die für die Bereitstellung ähnlicher Funktionen erwähnenswert sind - zum Beispieljava.xml.bind.DataTypeConverter mitprintHexBinary undparseBase64Binary.

Code-Schnipsel könnenover on GitHub. gefunden werden