Die 64 Zeichen
Base64 liest die Eingabe in Gruppen zu 3 Bytes (24 Bit) und teilt jede Gruppe in vier 6-Bit-Zahlen. Jede Zahl von 0 bis 63 ist ein Index in diese Tabelle. Die Reihenfolge legt RFC 4648 fest: Großbuchstaben für 0 bis 25, Kleinbuchstaben für 26 bis 51, Ziffern für 52 bis 61, dann + und /. Die letzte Spalte ist der ASCII-Code des Zeichens, also das, was tatsächlich gespeichert oder übertragen wird.
| Index | 6 Bit | Base64 | Base64URL | ASCII-Code |
|---|---|---|---|---|
| 0 | 000000 | A | A | 0x41 |
| 1 | 000001 | B | B | 0x42 |
| 2 | 000010 | C | C | 0x43 |
| 3 | 000011 | D | D | 0x44 |
| 4 | 000100 | E | E | 0x45 |
| 5 | 000101 | F | F | 0x46 |
| 6 | 000110 | G | G | 0x47 |
| 7 | 000111 | H | H | 0x48 |
| 8 | 001000 | I | I | 0x49 |
| 9 | 001001 | J | J | 0x4A |
| 10 | 001010 | K | K | 0x4B |
| 11 | 001011 | L | L | 0x4C |
| 12 | 001100 | M | M | 0x4D |
| 13 | 001101 | N | N | 0x4E |
| 14 | 001110 | O | O | 0x4F |
| 15 | 001111 | P | P | 0x50 |
| 16 | 010000 | Q | Q | 0x51 |
| 17 | 010001 | R | R | 0x52 |
| 18 | 010010 | S | S | 0x53 |
| 19 | 010011 | T | T | 0x54 |
| 20 | 010100 | U | U | 0x55 |
| 21 | 010101 | V | V | 0x56 |
| 22 | 010110 | W | W | 0x57 |
| 23 | 010111 | X | X | 0x58 |
| 24 | 011000 | Y | Y | 0x59 |
| 25 | 011001 | Z | Z | 0x5A |
| 26 | 011010 | a | a | 0x61 |
| 27 | 011011 | b | b | 0x62 |
| 28 | 011100 | c | c | 0x63 |
| 29 | 011101 | d | d | 0x64 |
| 30 | 011110 | e | e | 0x65 |
| 31 | 011111 | f | f | 0x66 |
| 32 | 100000 | g | g | 0x67 |
| 33 | 100001 | h | h | 0x68 |
| 34 | 100010 | i | i | 0x69 |
| 35 | 100011 | j | j | 0x6A |
| 36 | 100100 | k | k | 0x6B |
| 37 | 100101 | l | l | 0x6C |
| 38 | 100110 | m | m | 0x6D |
| 39 | 100111 | n | n | 0x6E |
| 40 | 101000 | o | o | 0x6F |
| 41 | 101001 | p | p | 0x70 |
| 42 | 101010 | q | q | 0x71 |
| 43 | 101011 | r | r | 0x72 |
| 44 | 101100 | s | s | 0x73 |
| 45 | 101101 | t | t | 0x74 |
| 46 | 101110 | u | u | 0x75 |
| 47 | 101111 | v | v | 0x76 |
| 48 | 110000 | w | w | 0x77 |
| 49 | 110001 | x | x | 0x78 |
| 50 | 110010 | y | y | 0x79 |
| 51 | 110011 | z | z | 0x7A |
| 52 | 110100 | 0 | 0 | 0x30 |
| 53 | 110101 | 1 | 1 | 0x31 |
| 54 | 110110 | 2 | 2 | 0x32 |
| 55 | 110111 | 3 | 3 | 0x33 |
| 56 | 111000 | 4 | 4 | 0x34 |
| 57 | 111001 | 5 | 5 | 0x35 |
| 58 | 111010 | 6 | 6 | 0x36 |
| 59 | 111011 | 7 | 7 | 0x37 |
| 60 | 111100 | 8 | 8 | 0x38 |
| 61 | 111101 | 9 | 9 | 0x39 |
| 62 | 111110 | + | - | 0x2B |
| 63 | 111111 | / | _ | 0x2F |
| Padding | – | = | meist weggelassen | 0x3D |
Zwei Bereiche lohnt es sich zu merken. Jedes Zeichen von A bis P (0 bis 15) beginnt mit den Bits 00, und jedes Zeichen von w bis / (48 bis 63) beginnt mit 11. Das reicht, um ein Zeichen im Kopf zu dekodieren, wenn Sie ein Präfix von Hand prüfen. Ein durchgerechnetes Beispiel für die Bit-Aufteilung steht in So funktioniert Base64.
Die Reihenfolge des Alphabets ist nicht die ASCII-Reihenfolge. In ASCII kommen + und / zuerst, dann Ziffern, dann Groß-, dann Kleinbuchstaben. Sortiert man Base64-Zeichenketten, sortiert man deshalb nicht die zugrunde liegenden Bytes: +A== (das Byte F8) steht vor AA== (dem Byte 00). Wenn kodierte Werte wie die Rohbytes sortiert werden sollen, nehmen Sie base32hex aus RFC 4648 oder einfach Hex.
Das URL-sichere Alphabet
+ und / haben in URLs beide eine besondere Bedeutung. + wird in Query-Strings und Formulardaten zu einem Leerzeichen dekodiert, und / trennt Pfadsegmente. Base64URL, definiert in Abschnitt 5 von RFC 4648, behält die Indizes 0 bis 61 und tauscht die letzten beiden aus:
| Index | Base64 | Base64URL |
|---|---|---|
| 62 | + | - |
| 63 | / | _ |
Alles andere, einschließlich der Bit-Anordnung, ist identisch. Die Umwandlung zwischen beiden besteht also aus einer Zeichenersetzung und dem Ergänzen oder Entfernen des Paddings. JWTs, viele API-Tokens und dateinamensichere Kennungen verwenden Base64URL, meist ohne =. Der Base64URL-Encoder erzeugt es direkt. Den vollständigen Vergleich finden Sie unter Base64 vs. Base64URL.
Das Padding-Zeichen
= (ASCII 0x3D) gehört nicht zum 64-Zeichen-Alphabet und kodiert nie Daten. Es füllt nur die letzte 4-Zeichen-Gruppe auf, wenn die Eingabelänge kein Vielfaches von 3 ist:
- 1 Byte übrig: 2 Datenzeichen plus
==. - 2 Bytes übrig: 3 Datenzeichen plus
=. - Kein Byte übrig: kein Padding.
Eine Zeichenkette mit Padding hat also immer eine durch 4 teilbare Länge, und === kommt nie vor. Ohne Padding lässt die Länge bei Division durch 4 den Rest 0, 2 oder 3, nie 1. Die Anleitung zum Padding erklärt, wann = wegfallen darf und wie Sie es wiederherstellen.
Welche Zeichen wo auftauchen
Einige Muster ergeben sich direkt aus der Bit-Anordnung. Sie wurden per Brute Force über alle relevanten Bytewerte geprüft.
Vor == stehen nur A, Q, g oder w. Bleibt ein Byte übrig, trägt das zweite Zeichen 2 Datenbits, gefolgt von 4 Nullbits, sein Index ist also 0, 16, 32 oder 48. Vor einem einzelnen = hat das dritte Zeichen am Ende 2 Nullbits und ist damit eines von 16 Zeichen: A E I M Q U Y c g k o s w 0 4 8. Alles andere an dieser Stelle bedeutet eine nicht kanonische Kodierung, die strenge Decoder ablehnen.
Zufällige Bytes nutzen alle 64 Zeichen gleich häufig. Jede 6-Bit-Gruppe aus Zufallsdaten ist gleichverteilt, daher erzeugen verschlüsselte Daten, Schlüssel und komprimierte Dateien eine flache Zeichenverteilung. Eine schiefe Verteilung deutet darauf hin, dass die Daten Text sind oder eine Struktur haben.
ASCII-Text beginnt eine Gruppe nie mit kleinem g bis z, Ziffern, + oder /. Das erste Zeichen jeder 4-Zeichen-Gruppe enthält die oberen 6 Bits eines Bytes. Bei 7-Bit-ASCII ist das oberste Bit 0, also liegt dieses Zeichen immer zwischen A und f (Index 0 bis 31). In SGVsbG8gd29ybGQh (Hello world!) beginnen die Gruppen mit S, b, d und b.
In Base64 von ASCII-Text sind + und / selten. Bei Bytes unter 0x80 kann + nur als viertes Zeichen einer Gruppe vorkommen, wenn das dritte Byte > oder ~ ist. / kann dort nur stehen, wenn dieses Byte ? oder das Steuerzeichen DEL ist. Deshalb wird Hi?> zu SGk/Pg== und <b> zu PGI+.
Folgen von A sind Nullbytes, Folgen von / sind 0xFF. AAAA sind drei 00-Bytes, //// sind drei FF-Bytes. Lange Strecken aus A sind typisch für dünn besetzte Binärformate, UTF-16-Text (Hello ist SABlAGwAbABvAA==) und die Längenfelder am Anfang von SSH-Schlüsseln. Weitere erkennbare Muster stehen unter Häufige Base64-Präfixe.
Andere Base64-Alphabete
Mehrere Systeme haben die Idee von 64 Zeichen für je 6 Bit übernommen, aber andere Zeichen gewählt:
| Variante | Alphabet in Index-Reihenfolge | Wo |
|---|---|---|
| Standard | A-Z a-z 0-9 + / | RFC 4648, MIME, PEM, die meisten APIs |
| URL-sicher | A-Z a-z 0-9 - _ | RFC 4648 Abschnitt 5, JWT |
| IMAP-Postfachnamen | A-Z a-z 0-9 + , | Modifiziertes UTF-7 aus RFC 3501 |
| bcrypt | . / A-Z a-z 0-9 | Passwort-Hashes $2a$, $2b$, $2y$ |
| crypt(3) | . / 0-9 A-Z a-z | MD5-crypt $1$, SHA-crypt $5$ und $6$, DES-crypt |
| xxencode | + - 0-9 A-Z a-z | Alte Unix-Mail und Usenet |
| uuencode | ASCII 32 bis 95 (Leerzeichen bis _), oft mit ` für 0 | Alte Unix-Mail und Usenet |
- IMAP ersetzt
/durch,, weil/in Postfachnamen oft als Hierarchietrenner dient. Ein Ordner namensEntwürfewird alsEntw&APw-rfegespeichert. - bcrypt stellt
.und/an den Anfang und setzt Buchstaben vor Ziffern. Salts und Hashes sind Base64 in diesem Alphabet ohne Padding, weshalb ein Standard-Decoder dafür die falschen Bytes liefert. - crypt(3) verwendet
./0-9A-Za-z, also die ASCII-Reihenfolge. Außerdem packt es die Bits vom niederwertigsten Ende her, sodass ein Standard-Decoder selbst mit übersetztem Alphabet die Hash-Bytes nicht reproduziert. - uuencode und xxencode sind älter als MIME. Die Tools uuencode und xxencode lesen und schreiben beide.
Kodierungen mit anderer Alphabetgröße wie Base32, Base58 und Base85 behandelt Base64 vs. Hex, Base32, Base58 und Base85. Definitionen der hier verwendeten Begriffe stehen im Glossar.
Häufige Fragen
Wie viele Zeichen hat das Base64-Alphabet?
64 Zeichen für Daten: 26 Großbuchstaben, 26 Kleinbuchstaben, 10 Ziffern, + und /. Das Padding-Zeichen = ist ein 65. Symbol, das nie Daten trägt.
Welchen Base64-Wert hat der Buchstabe A?
A steht für Index 0, binär 000000. B ist 1, Z ist 25, a ist 26, z ist 51, 0 ist 52, 9 ist 61, + ist 62 und / ist 63.
Welche Zeichen ändert Base64URL?
Nur zwei: + (Index 62) wird zu - und / (Index 63) wird zu _. Meist entfällt außerdem das Padding. Umwandeln können Sie mit Base64 in Base64URL.