Base64 ist eines dieser Kodierungsverfahren, auf die jeder Entwickler immer wieder stößt, die aber nur wenige vollständig verstehen. Sie begegnen ihm in JWT-Tokens, Daten-URLs für Bilder, E-Mail-Anhängen, API-Authentifizierungs-Headern und sogar eingebettet in XRechnung-Anhänge. Dieser Leitfaden erklärt, was Base64 tatsächlich ist, wie der Kodierungsalgorithmus funktioniert, wann Sie es verwenden sollten und wie es sich zu anderen Kodierungsverfahren verhält.
Welches Problem löst Base64?
Viele textbasierte Protokolle – E-Mail (SMTP), HTTP-Header, JSON, XML und HTML – wurden entwickelt, um Sequenzen druckbarer ASCII-Zeichen zu verarbeiten. Diese Protokolle versagen, wenn sie auf rohe Binärdaten stoßen (Bilder, PDFs, Audiodateien, verschlüsselte Bytes), weil Binärdaten Bytewerte enthalten, die keine gültigen ASCII-Zeichen sind oder als Steuerzeichen (Null-Bytes, Zeilenumbrüche, Wagenrückläufe) interpretiert werden, die das Protokoll beschädigen.
Base64 löst dies, indem beliebige Binärdaten als Sequenz von 64 sicheren, druckbaren ASCII-Zeichen kodiert werden. Das Ergebnis ist stets ein gültiger Textstring, der in jedes textbasierte Protokoll eingebettet werden kann, ohne beschädigt zu werden.
Wie Base64-Kodierung funktioniert
Das Standard-Base64-Alphabet besteht aus 64 Zeichen: A-Z (26), a-z (26), 0-9 (10), + (1), / (1). Da 64 = 26 ist, kodiert jedes Base64-Zeichen genau 6 Bit Binärdaten.
Der Kodierungsalgorithmus arbeitet jeweils in Gruppen von 3 Bytes (24 Bit):
- Nehmen Sie 3 Bytes (24 Bit) der Eingabedaten.
- Aufteilen in vier 6-Bit-Gruppen.
- Ordnen Sie jeden 6-Bit-Wert dem entsprechenden Base64-Zeichen aus der Alphabet-Tabelle zu.
- Wenn die Eingabe kein Vielfaches von 3 Bytes ist, auffüllen mit =-Zeichen: ein = wenn 2 Bytes übrig bleiben, zwei = wenn 1 Byte übrig bleibt.
Beispiel: Das Wort "Man" in ASCII ist 77, 97, 110. In Binär: 01001101 01100001 01101110. Aufgeteilt in 6-Bit-Gruppen: 010011, 010110, 000101, 101110. Auf Base64 gemappt: T, W, F, u. Ergebnis: "TWFu".
Base64 vs. URL-sicheres Base64
Standard-Base64 verwendet die Zeichen + und /, die in URLs besondere Bedeutungen haben. URL-sicheres Base64 (auch Base64url genannt) ersetzt + durch - und / durch _, wodurch die Ausgabe sicher in URLs verwendet werden kann, ohne Prozent-Kodierung. URL-sicheres Base64 wird verwendet in:
- JWT (JSON Web Tokens): Alle drei Teile eines JWT sind Base64url-kodiert.
- OAuth 2.0 PKCE code_challenge-Werte.
- URL-sichere Daten-URIs und API-Parameter.
- WebAuthn / FIDO2-Credential-Identifier.
JWT-Tokens dekodieren
Ein JWT besteht aus drei Base64url-kodierten Teilen, getrennt durch Punkte: header.payload.signature. Header und Payload sind Base64url-kodierte JSON-Objekte; die Signatur ist eine kryptografische HMAC- oder RSA-Signatur über die ersten beiden Teile.
Um einen JWT-Payload manuell zu inspizieren: Nehmen Sie das zweite Segment (zwischen dem ersten und zweiten Punkt), ersetzen Sie - durch + und _ durch /, fügen Sie bei Bedarf Padding (=-Zeichen) hinzu, um die Länge zu einem Vielfachen von 4 zu machen, und dekodieren Sie dann Base64. Das Ergebnis ist der JSON-Payload mit Claims wie sub, exp und iat.
Wichtig: Base64-Kodierung ist KEINE Verschlüsselung. Der Payload eines JWT ist für jeden sichtbar, der das Token abfängt. Speichern Sie niemals sensible Daten (Passwörter, Kreditkartennummern) in einem JWT-Payload, ohne diese separat zu verschlüsseln.
Daten-URLs
Daten-URLs (RFC 2397) ermöglichen es, Binärdaten direkt in HTML, CSS oder überall dort einzubetten, wo eine URL erwartet wird. Das Format ist: data:[mediatype];base64,[base64-kodierte-daten]. Zum Beispiel würde ein kleines PNG-Symbol, das direkt in ein HTML-img-Tag eingebettet ist, so aussehen: <img src="data:image/png;base64,iVBORw0KGgo...">.
Daten-URLs eliminieren den Bedarf an separaten HTTP-Anfragen für kleine Assets, erhöhen aber die Größe der HTML- oder CSS-Datei. Sie eignen sich ideal für Icons, Schriften und andere kleine Assets, die sonst einen separaten Netzwerk-Round-Trip erfordern würden.
Base64 in E-Mail: MIME-Kodierung
MIME (Multipurpose Internet Mail Extensions) verwendet Base64 zur Kodierung von E-Mail-Anhängen. Wenn Sie eine PDF-Rechnung per E-Mail senden, kodiert der E-Mail-Client die PDF-Bytes in Base64 und bettet sie als Text in den E-Mail-Body ein. Der empfangende Client dekodiert Base64 zurück in Binärdaten und präsentiert es als herunterladbaren Anhang. Deshalb sind E-Mail-Dateien (.eml) viel größer als die Summe ihrer Anhänge – Base64-Kodierung fügt etwa 33 % Overhead hinzu.
Base64 in XRechnung und ZUGFeRD
XRechnung unterstützt eingebettete Anhänge über das AdditionalDocumentReference-Element. Binäre Anhänge (PDFs, Bilder, andere Dokumente) müssen Base64-kodiert werden, wenn sie in das XML eingebettet werden. Ein Anhang könnte so aussehen: <cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="delivery-note.pdf">[base64-Daten]</cbc:EmbeddedDocumentBinaryObject>.
Leistung und Größenüberlegungen
Base64-Kodierung erhöht die Datengröße um exakt 4/3 (ca. 33 %). Ein 1-MB-PDF wird nach der Base64-Kodierung etwa 1,37 MB groß. Bei kleinen Nutzdaten ist dies in der Regel vernachlässigbar. Bei großen Dateien, die über das Netzwerk übertragen werden, sollten Sie abwägen, ob das Base64-Einbetten angemessen ist oder ob eine separate Binärdateiübertragung (Multipart-HTTP, vorsignierte S3-URL) effizienter ist.
Häufige Base64-Fehler
- Padding vergessen: Base64-Strings müssen eine Länge haben, die ein Vielfaches von 4 ist. Fehlendes =-Padding verursacht Dekodierungsfehler in strikten Parsern.
- Base64 mit Verschlüsselung verwechseln: Base64 ist kein Sicherheitsmechanismus. Es bietet keine Vertraulichkeit.
- Standard-Base64 in URLs verwenden: Verwenden Sie immer URL-sicheres Base64 (Base64url) für in URLs oder URL-Abfrageparametern eingebettete Daten.
- Zeilenumbrüche in Base64: Manche Base64-Encoder fügen alle 76 Zeichen Zeilenumbrüche ein (MIME-Standard). Entfernen Sie Zeilenumbrüche vor dem Dekodieren, wenn Ihr Decoder sie nicht verarbeiten kann.
- Falsche Zeichenkodierung: Stellen Sie sicher, dass Ihr Eingabe-String UTF-8-kodiert ist, bevor Sie ihn Base64-kodieren, besonders bei Nicht-ASCII-Zeichen.
Häufig gestellte Fragen
Ist Base64 dasselbe wie Verschlüsselung?
Nein. Base64 ist ein Kodierungsverfahren, kein Verschlüsselungsalgorithmus. Jeder kann einen Base64-String sofort ohne Schlüssel dekodieren. Es bietet absolut keine Sicherheit, ermöglicht aber die sichere Übertragung von Binärdaten in textbasierten Systemen.
Warum endet Base64 manchmal mit ==?
Die =-Padding-Zeichen geben an, dass die Eingabe kein Vielfaches von 3 Bytes war. Ein = bedeutet, dass ein Byte Padding hinzugefügt wurde; zwei == bedeuten, dass zwei Bytes hinzugefügt wurden, um die letzte 3-Byte-Gruppe zu vervollständigen. Einige Systeme (wie JWT) lassen das Padding weg und verlangen, dass es aus der Stringlänge abgeleitet wird.
Kann ich Base64 in CSS verwenden?
Ja. Sie können Daten-URLs mit Base64-kodierten Bildern direkt in CSS-background-image-Eigenschaften verwenden. Dies wird häufig für kleine Icons und Muster verwendet, um HTTP-Anfragen zu reduzieren, obwohl es die CSS-Dateigröße erhöht.