Was ist Base64-Kodierung? Ein Leitfaden in einfacher Sprache (und warum es sich nicht um Verschlüsselung handelt)
Sie haben es gesehen: eine lange Folge von Buchstaben und Zahlen, die möglicherweise mit einem oder zwei Gleichheitszeichen endet und in einem JWT, einer E-Mail-Quelle oder einem Bild-Tag liegt. Dabei handelt es sich um Base64, eine der gebräuchlichsten Codierungen im Computerbereich, und eine, die überraschend viele Entwickler jeden Tag verwenden, ohne zu wissen, was sie tatsächlich tut, oder schlimmer noch, zu glauben, dass sie etwas tut, was sie nicht tut. Dieser Leitfaden erklärt Base64 im Klartext: Was es ist, warum es existiert, wo Sie es finden und welches gefährliche Missverständnis zu echten Sicherheitsvorfällen führt.
Was Base64 eigentlich ist
Base64 ist eine Möglichkeit, Binärdaten, beliebige Bytes überhaupt, mit nur 64 druckbaren Textzeichen darzustellen: den 26 Großbuchstaben, den 26 Kleinbuchstaben, den 10 Ziffern und zwei Symbolen, Plus (+) und Schrägstrich (/). Das Gleichheitszeichen (=) dient als Füller am Ende. Das ist das ganze Alphabet, und daher kommt auch der Name. Jedes Zeichen in der Base64-Ausgabe ist ein sicheres, druckbares Zeichen ohne Steuercodes oder mehrdeutige Leerzeichen, und genau darum geht es.
Der Grund für seine Existenz ist historisch und immer noch relevant. Die Kernprotokolle des Internets, E-Mail über SMTP, HTTP-Header und andere, wurden für Klartext entwickelt. Geben Sie ihnen rohe Binärdaten wie ein Bild oder einen verschlüsselten Blob, und bestimmte Bytewerte werden als Steuerzeichen fehlinterpretiert und beschädigen die Daten. Base64 löst dieses Problem, indem es Binärdateien in eine Textteilmenge umwandelt, die jeden textbasierten Kanal intakt übersteht. Es ist ein Übersetzer zwischen der binären Welt und der Textwelt.
Wie es funktioniert, kurz
Der Algorithmus nimmt Ihre Eingabe jeweils drei Bytes entgegen. Drei Bytes sind 24 Bits, die in vier Gruppen zu je 6 Bits aufgeteilt werden, und jede 6-Bit-Gruppe wird einem der 64 Zeichen zugeordnet. So werden alle 3 Bytes Eingabe zu genau 4 Zeichen Ausgabe. Wenn Ihre Eingabe kein reines Vielfaches von 3 Bytes ist, füllt Base64 die Ausgabe mit Gleichheitszeichen auf, eins =, wenn die letzte Gruppe 2 Bytes hatte, zwei ==, wenn sie nur 1 Byte hatte, sodass das Ergebnis immer ein Vielfaches von 4 Zeichen ist. Das ist die Bedeutung dieser Gleichheitszeichen am Ende: Sie teilen dem Decoder mit, wie viele echte Bytes sich in der letzten Gruppe befanden.
Dieses Verhältnis von 3 zu 4 hat eine direkte Konsequenz: Die Base64-Ausgabe ist etwa 33 % größer als die Originaldaten. Ein 1-MB-Bild wird in etwa 1,37 MB kodiert. Dieser Mehraufwand ist der Preis, den Sie für die Textsicherheit zahlen, und deshalb eignet sich Base64 hervorragend für kleine Dinge und ist eine schlechte Wahl für große.
Hier treffen Sie Base64
Base64 ist überall, wenn Sie erst einmal suchen müssen. Daten-URLs betten eine Datei direkt in HTML oder CSS ein, die data:image/png;base64,..., die Sie manchmal in einem Bild-Tag oder Hintergrundstil sehen, sodass ein kleines Symbol mit der Seite geladen wird und nicht als separate Anfrage. E-Mail-Anhänge sind Base64-kodiert, sodass Binärdateien den textbasierten E-Mail-Transport überleben; Jeder Anhang, den Sie jemals gesendet haben, wurde über diesen Weg transportiert, weshalb eine Roh-E-Mail-Datei größer ist als die Datei, die sie enthält.
JSON Web Tokens (JWTs) kodieren ihren Header und ihre Nutzlast in einer URL-sicheren Variante von Base64. Die HTTP-Basisauthentifizierung sendet Ihren Benutzernamen und Ihr Passwort als Base64 in einem Header. APIs, die Datei-Uploads innerhalb eines JSON-Bodys akzeptieren, kodieren die Datei mit Base64, da JSON Text ist und keine Rohbytes enthalten kann. Und PEM-Dateien, SSL-Zertifikate und SSH-Schlüssel sind Base64-codierte Binärdateien, die zwischen den Headerzeilen BEGIN und END eingeschlossen sind. Allem liegt die gleiche einfache Kodierung zugrunde.
Der gefährliche Mythos: Base64 ist keine Verschlüsselung
Das ist das Wichtigste, was man verstehen muss, denn Fehler führen zu echten Sicherheitslücken. Base64 bietet null Sicherheit. Es handelt sich nicht um eine Verschlüsselung. Jeder, der über die codierte Zeichenfolge verfügt, kann sie sofort und ohne Schlüssel in einer Zeile in jeder Browserkonsole entschlüsseln. Die Zeichenfolge c2VjcmV0 wird in etwa einer Sekunde in „geheim“ dekodiert.
Die Gefahr ergibt sich aus dem Aussehen von Base64. Eine Base64-Zeichenfolge erscheint verschlüsselt und zufällig und ähnelt optisch verschlüsselten Daten, was Menschen zu der Annahme verleitet, sie seien geschützt. Dies führt zu echten Vorfällen: Ein Entwickler übergibt eine Konfigurationsdatei mit Base64-codierten Datenbankanmeldeinformationen an die Versionskontrolle und glaubt, dass die Codierung sie verbirgt, was aber nicht der Fall ist. Eine API protokolliert den Authorization-Header und ein Prüfer „kann“ das Base64-Passwort „nicht lesen“, sodass es praktisch als einfacher Text in den Protokollen verbleibt, bis es jemand innerhalb von fünf Sekunden entschlüsselt. Das Speichern eines API-Schlüssels als Base64 in einer Datenbank sieht undurchsichtig aus, schützt aber nichts.
URL-sicheres Base64 (Base64url)
Standard Base64 verwendet + und /, aber beide haben in URLs eine besondere Bedeutung, + kann ein Leerzeichen in einer Abfragezeichenfolge bedeuten und / trennt Pfadsegmente. Daher ersetzt eine URL-sichere Variante namens Base64url + durch - (Minus) und / durch _ (Unterstrich) und lässt normalerweise die =-Auffüllung weg, die andernfalls eine Prozentcodierung in einer URL erfordern würde. Dies ist die Variante, die JWTs, OAuth-Tokens und URL-sichere Cookies verwenden. Wenn Sie jemals ein JWT-Segment in einen strikten Standard-Base64-Decoder einspeisen und eine Fehlermeldung oder Müll erhalten, ist dies normalerweise der Grund: Sie müssen die URL-sicheren Zeichen zurückkonvertieren und zuerst die Auffüllung wiederherstellen.
Das Unicode-Problem
Ein subtiler Fehler befällt Entwickler, die nicht-englischen Text mit Base64 kodieren. Die klassische Browserfunktion btoa() geht davon aus, dass jedes Zeichen ein einzelnes Byte ist, das bei Buchstaben mit Akzent, Emojis oder anderen nicht-lateinischen Schriftzeichen umbricht. Die Lösung besteht darin, den Text zuerst als UTF-8 zu kodieren und dann die resultierenden Bytes mit Base64 zu kodieren, andernfalls wird „café“ oder „こんにちは“ beschädigt ausgegeben. Ein guter Encoder übernimmt diesen UTF-8-Schritt für Sie, sodass akzentuierter Text und Emojis sauber verarbeitet werden.
Wann sollte man es verwenden, wann sollte man es vermeiden?
Greifen Sie zu Base64, wenn Sie kleine Binärdaten über einen Nur-Text-Kanal verschieben müssen: ein kleines Inline-Symbol, ein Token, eine kleine Datei in einer JSON-Nutzlast, eine Anmeldeinformation, die Sie debuggen. Vermeiden Sie dies bei großen Binärdateien in leistungsempfindlichen Pfaden. Der Größenverlust von 33 % und der Verlust des separaten Cachings machen eine echte Datei oder einen mehrteiligen Upload zur besseren Wahl. Und verwenden Sie es niemals als Sicherheitsschicht. Behalten Sie die Kontrolle, Darstellung und Transport, und Base64 ist ein zuverlässiges, universelles Werkzeug.