Datei hochladen
  1. base64hub
  2. Base64 verstehen
  3. So funktioniert Base64
Erklärung

So funktioniert Base64, Byte für Byte

Base64 schreibt beliebige Bytes mit 64 unbedenklichen Zeichen neu. Drei Bytes gehen hinein, vier Zeichen kommen heraus, der Rest ist Buchhaltung.

Was Base64 ist und wozu es dient

Base64 ist eine Methode, beliebige Binärdaten nur mit 64 druckbaren ASCII-Zeichen zu schreiben: A–Z, a–z, 0–9, + und /, dazu = als Padding. Es ist eine Kodierung, das heißt, jeder kann sie ohne Schlüssel umkehren. Es verbirgt nichts (mehr dazu unter Kodierung vs. Verschlüsselung).

Das Ziel ist, Bytes unversehrt durch Kanäle zu bringen, die nur Text transportieren. Eine PNG-Datei enthält Bytes wie 0x00, 0x1A und 0x89, die ein Textkanal entfernen, umwandeln oder als Steuerzeichen behandeln kann. Als Base64 geschrieben wird dieselbe Datei zu iVBORw0KGgo... und übersteht E-Mail, JSON, XML, URLs (mit der URL-sicheren Variante), Terminals sowie Kopieren und Einfügen unverändert.

Die aktuelle Definition ist RFC 4648. Ältere Spezifikationen für MIME-E-Mails (RFC 2045) und PEM-Zertifikate beschreiben dasselbe Alphabet mit zusätzlichen Regeln zur Zeilenlänge. Eine Übersicht der Varianten finden Sie auf der Seite Base64-Standards.

Warum E-Mail Base64 brauchte

Die frühe E-Mail war auf 7-Bit-ASCII-Text ausgelegt. Mail-Relays jener Zeit konnten das höchste Bit jedes Bytes entfernen, lange Zeilen umbrechen und Zeilenenden umschreiben, was für einen Brief harmlos und für eine ZIP-Datei fatal ist. MIME brauchte einen Weg, beliebige Anhänge über diese Strecke zu schicken, und ein Alphabet, das jedes System unterwegs übersteht.

Daraus erklärt sich die Wahl der 64 Zeichen. Buchstaben und Ziffern sind in ASCII und in fast jedem alten Zeichensatz identisch, + und / sind beinahe ebenso unbedenklich, und keines davon ist ein Steuerzeichen oder Leerraum. 64 ist außerdem die größte Zweierpotenz, die sich aus diesem sicheren Vorrat füllen lässt, und eine Zweierpotenz hält die Bitarithmetik einfach. Der Preis ist die Größe: 6 nutzbare Bit pro 8-Bit-Zeichen bedeuten, dass die Ausgabe 4/3 der Eingabe beträgt, plus Padding.

Das 8-Bit-Problem ist aus modernen Mailservern weitgehend verschwunden, aber dieselbe Einschränkung taucht überall auf, wo Binärdaten in einem Textformat stehen müssen. JSON hat keinen Binärtyp, und HTML-Attribute, CSS und HTTP-Header sind alle Text, daher ist Base64 immer noch der übliche Weg, Bytes darin unterzubringen.

Der Algorithmus: 3 Bytes rein, 4 Zeichen raus

Base64 arbeitet mit Blöcken aus 24 Bit. Das ist die kleinste Zahl, die sowohl durch 8 (ein Byte) als auch durch 6 (ein Base64-Zeichen) teilbar ist, 3 Bytes lassen sich also genau auf 4 Zeichen abbilden.

Für jeden Block:

  1. 3 Bytes nehmen und als 24 Bit hintereinander schreiben.
  2. Diese 24 Bit in vier Gruppen zu 6 Bit zerschneiden.
  3. Jede Gruppe als Zahl von 0 bis 63 lesen.
  4. Die Zahl im Alphabet nachschlagen und das Zeichen ausgeben.

Das Alphabet ist eine feste Tabelle. Index 0 ist A, 25 ist Z, 26 ist a, 51 ist z, 52 ist 0, 61 ist 9, 62 ist + und 63 ist /. Die vollständige Tabelle steht auf der Seite Base64-Alphabet.

BereichZeichenBeispiel
0–25A–Z19 → T
26–51a–z46 → u
52–610–952 → 0
62+
63/

Beim Dekodieren laufen dieselben Schritte rückwärts ab: Jedes Zeichen nachschlagen, um 6 Bit zu erhalten, vier davon zu 24 Bit verbinden und diese in 3 Bytes teilen.

Durchgerechnetes Beispiel: aus „Man“ wird TWFu

Das klassische Beispiel verwendet den ASCII-Text Man. In ASCII ist M 77, a 97 und n 110.

Man
Dezimal7797110
Binär010011010110000101101110

Die Bits aneinanderreihen: 010011010110000101101110. Jetzt alle 6 Bit statt alle 8 Bit schneiden:

6-Bit-Gruppe010011010110000101101110
Wert1922546
ZeichenTWFu

Man wird also zu TWFu kodiert. Beachten Sie, dass kein Ausgabezeichen mit einem Eingabebuchstaben übereinstimmt. Das W besteht aus den letzten 4 Bit von M und den ersten 2 Bit von a. Deshalb wirkt sich die Änderung eines einzigen Eingabebytes auf zwei Ausgabezeichen aus, und deshalb kann man Base64 nicht mit bloßem Auge lesen, selbst wenn die Eingabe schlichtes Englisch ist.

Sie können das in jeder Shell nachprüfen:

echo -n Man | base64
# TWFu

Ohne -n hängt echo ein Zeilenumbruch-Byte an, und Man\n wird zu TWFuCg== kodiert.

Wenn die Eingabe kein Vielfaches von 3 ist: Padding

Echte Daten haben selten eine durch 3 teilbare Länge. Der letzte Block hat dann 1 oder 2 Bytes, und Base64 füllt ihn mit Nullbits und =-Zeichen auf.

Zwei Bytes übrig, „Ma“ → TWE=. Zwei Bytes sind 16 Bit. Zwei Nullbits ergänzen, um auf 18 zu kommen, also drei 6-Bit-Gruppen:

6-Bit-Gruppe010011010110000100(keine)
Wert19224
ZeichenTWE=

Die dritte Gruppe ist 0001 aus a, gefolgt von den beiden ergänzten Nullen, das ergibt 4, also E. Ein = steht für das fehlende vierte Zeichen.

Ein Byte übrig, „M“ → TQ==. Ein Byte sind 8 Bit. Vier Nullbits ergänzen, um auf 12 zu kommen, also zwei Gruppen: 010011 (19, T) und 010000 (16, Q). Zwei = füllen den Block.

Die Anzahl der = verrät also, wie viele Bytes der letzte Block enthielt: keines bedeutet 3, eines bedeutet 2, zwei bedeuten 1. Ein drittes = gibt es nie, denn einen Block ohne übrig gebliebene Bytes gibt es nicht. Die Anleitung zum Padding behandelt, wann = entfallen darf und wie man es wiederherstellt.

import base64
for s in [b"Man", b"Ma", b"M"]:
    print(s, base64.b64encode(s))
# b'Man' b'TWFu'
# b'Ma' b'TWE='
# b'M' b'TQ=='

Text muss zuerst zu Bytes werden

Base64 kodiert Bytes. Text wird erst zu Bytes, wenn Sie eine Zeichenkodierung wählen, und diese Wahl verändert das Ergebnis. Das Wort café hat in UTF-8 5 Bytes (é braucht zwei) und wird zu Y2Fmw6k= kodiert. In Latin-1 hat es 4 Bytes und wird zu Y2Fm6Q== kodiert.

Das ist die Ursache einer bekannten JavaScript-Falle. Die Browserfunktion btoa() behandelt jedes Zeichen einer Zeichenkette als ein Byte, was dem Verhalten von Latin-1 entspricht:

btoa("café");        // "Y2Fm6Q==" (Latin-1, not UTF-8)
btoa("café ✓");      // throws InvalidCharacterError

Um in JavaScript UTF-8-Base64 zu erhalten, wandeln Sie zuerst mit TextEncoder in Bytes um oder nutzen in Node.js Buffer. Die JavaScript-Code-Seite zeigt die funktionierenden Muster, und Uint8Array.toBase64() behandelt die neuere eingebaute Methode. Der Base64-Encoder auf dieser Website verwendet standardmäßig UTF-8 und lässt Sie einen anderen Zeichensatz wählen.

Wo Ihnen Base64 begegnet

  • E-Mail-Anhänge. Jeder Anhang in einer rohen .eml-Datei ist ein Base64-Block mit Umbruch bei 76 Zeichen. Siehe Base64 in E-Mails.
  • Data-URIs. data:image/png;base64,iVBORw0KGgo... bettet ein Bild direkt in HTML oder CSS ein. Ob das eine gute Idee ist, behandelt Performance von Data-URIs.
  • HTTP Basic Auth. Der Header Authorization: Basic dXNlcjpwYXNz ist einfach user:pass in Base64.
  • JWTs. Die drei durch Punkte getrennten Teile eines JSON Web Token sind Base64URL. Siehe Base64 in JWT.
  • PEM-Dateien. Zertifikate und Schlüssel zwischen den Zeilen -----BEGIN ...----- sind Base64 binärer DER-Daten.
  • APIs und Konfiguration. Kubernetes Secrets, Cloud-Metadaten, Webhook-Nutzdaten und viele JSON-APIs transportieren Dateien oder Binärdaten als Base64-Zeichenketten.

Mit der Zeit erkennen Sie Blobs an ihren ersten Zeichen: iVBORw0KGgo ist ein PNG, JVBERi0 ein PDF, /9j/ ein JPEG und eyJ JSON, das mit {" beginnt. Die Seite Häufige Base64-Präfixe listet weitere auf. Um zu sehen, was ein Blob enthält, erkennt das Tool Base64 in Datei das Format und zeigt eine Vorschau in Ihrem Browser.

Jetzt eine Zeichenkette dekodieren

Fügen Sie Base64 ein und sehen Sie den enthaltenen Text oder die Bytes. Läuft lokal in Ihrem Browser.

Base64-Decoder

Häufige Fragen

Ist Base64 eine Form der Kompression?

Nein. Es macht Daten immer größer: Je 3 Eingabebytes werden zu 4 Ausgabezeichen, etwa 33 % mehr. Die genaue Formel steht unter Der Größen-Overhead von Base64.

Warum heißt es Base64?

Jedes Ausgabezeichen trägt einen von 64 möglichen Werten, also 6 Bit Information. Der Name ist die Größe des Alphabets, so wie Hex die Basis 16 ist.

Lassen sich beliebige Daten in Base64 kodieren?

Ja. Der Algorithmus arbeitet mit Bytes und kümmert sich nicht darum, was sie bedeuten, daher werden Text, Bilder, PDFs, Schlüssel und komprimierte Archive alle gleich kodiert. Text muss zuerst mit einer Zeichenkodierung in Bytes umgewandelt werden, meist UTF-8.

Enthält die Base64-Ausgabe jemals Leerzeichen oder Zeilenumbrüche?

Reines Base64 nach RFC 4648 nicht. Manche Formate brechen es in Zeilen um, zum Beispiel MIME-E-Mails bei 76 Zeichen und PEM-Dateien bei 64, und die meisten Decoder überspringen diesen Leerraum.

Weiterlesen