Base64 erklärt: Wie es funktioniert, wann man es benutzt und wann nicht
Eine klare Erklärung der Base64-Codierung: Algorithmus, Polsterung, URL-sichere Base64, Daten-URLs, Größenüberschüsse, Unicode-Fallen und Sicherheitsfehlverständnisse.
· 5 Min. Lesezeit
Base64 erscheint in E-Mail-Anhängen, JSON-Web-Token, Daten-URLs, Kubernetes-Geheimnissen, HTTP-Basic-Authentifizierung und unzähligen APIs, die binäre Daten durch Text-kanäle bewegen müssen. Es ist einfach, wenn man einmal sieht, wie es funktioniert, aber es wird oft missbraucht vor allem, als wäre es Verschlüsselung. In diesem Artikel wird der Algorithmus Schritt für Schritt, die gängigen Varianten und praktische Anleitungen erläutert, wann Base64 das richtige Tool ist.
Das Problem, das Base64 löst
Viele Systeme wurden entworfen, um Text zu tragen, nicht willkürliche Bytes. E-Mail (SMTP) unterstützt historisch nur 7-Bit-ASCII. JSON-Strings können keine Roh-Binärdateien enthalten. URLs und HTTP-Header haben beschränkte Zeichenmengen. Wenn Sie die Rohbyte eines Bildes in eines dieser Bytes einfügen, werden einige Bytes als Kontrollzeichen, Zeilenendungen oder Abgrenzungen interpretiert, und die Daten werden beschädigt.
Base64 bildet beliebige Bytes auf 64 sichere, druckbare Zeichen ab: A–Z, a–z, 0–9, + und /. Jedes System, das einfachen Text tragen kann, kann dann die Daten intakt tragen.
Wie die Kodierung funktioniert
Base64 verarbeitet Eingaben in Gruppen von 3 Bytes (24 Bits) und liefert 4 Zeichen von jeweils 6 Bits aus. Da 2^6 = 64 ist, wählt jeder 6-Bit-Wert ein Zeichen aus dem Alphabet aus.
Nehmen Sie das Wort Man:
- ASCII-Bytes:
M= 77,a= 97,n= 110. - In Binär:
01001101 01100001 01101110. - In vier 6-Bit-Gruppen aufgeteilt:
010011 010110 000101 101110. - Als Zahlen: 19, 22, 5, 46.
- Schauen Sie im Alphabet nach:
T,W,F,u.
Also wird Man zu TWFu. Die Decodierung kehrt den Prozess um.
Verkleidung mit =
Wenn die Eingabelänge nicht ein Vielfaches von 3 ist, ist die letzte Gruppe unvollständig. Base64 füllt es ein:
- 1 übrig gebliebenes Byte erzeugt 2 Zeichen plus
==. - 2 übriggebliebene Bytes ergeben 3 Zeichen plus
=.
Ma kodiert für TWE= und M für TQ==. Das Padding macht die Ausgabelänge zu einem Vielfachen von vier, was einige Decoder erfordern. Andere, insbesondere URL-sichere Implementierungen, lassen es weg, weil die Länge bereits bedeutet, wie viele Bytes fehlen.
Größenüberschüsse
Alle 3 Bytes werden zu 4 Zeichen, so dass die Base64-Ausgabe etwa 33% größer ist als die Eingabe, plus Polsterung und manchmal Zeilenbrüche (MIME-E-Mail wickelt Zeilen mit 76 Zeichen). Ein 1 MB großes Bild wird zu etwa 1,37 MB großem Text. Das ist wichtig, wenn Sie große Dateien in JSON oder HTML einbetten.
URL-sichere Base64
Das Standardalphabet umfasst + und /, die in URLs besondere Bedeutungen haben, und =, das in Abfragezeichen verwendet wird. Base64URL, definiert in RFC 4648, ersetzt + durch - und / durch _ und lässt normalerweise das Polstern fallen. JWT, viele API-Token und Web-Push-Tasten verwenden diese Variante siehe wie JWT funktioniert als Beispiel.
Ein Standard-Decoder versagt bei - und _ und umgekehrt, was eine häufige Quelle für "ungültige Zeichen"-Fehler ist. Ein tolerierender [Base64-Decoder] ((/tools/base64) akzeptiert beide Alphabete und stellt fehlende Polsterungen automatisch wieder her.
Text, Bytes und Unicode
Base64 kodiert Bytes, keine Zeichen. Um Text zu kodieren, müssen Sie ihn zuerst in Bytes mit einer Zeichenkodierung konvertieren, fast immer UTF-8. Das ist der Punkt, an dem Browser Leute verwirren: JavaScript's integrierte btoa() akzeptiert nur Zeichen im Bereich Latin-1, also funktioniert btoa("héllo") zufällig und btoa("你好") wirft einen Fehler.
Der richtige Ansatz in modernem JavaScript:
const bytes = new TextEncoder().encode("你好 👋");
const b64 = btoa(String.fromCharCode(...bytes));
const back = new TextDecoder().decode(Uint8Array.from(atob(b64), c => c.charCodeAt(0)));
Andere Sprachen machen das eindeutig: Python's base64.b64encode nimmt Bytes, also schreibt man base64.b64encode("你好".encode("utf-8")).
Daten-URLs
Eine Daten-URL integriert eine Datei direkt in HTML oder CSS:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." alt="">
Dies speichert eine HTTP-Anfrage, die in der HTTP/1.1-Ära wertvoll war. Heute, mit HTTP/2 Multiplexing, bevorzugen die Kompromisse in der Regel separate Dateien:
- Daten-URLs können nicht unabhängig voneinander zwischengespeichert werden; sie werden mit jeder Seite oder Stylesheet, die sie enthält, erneut heruntergeladen.
- Sie aufblasen HTML und CSS, was das Rendering blockiert, bis es heruntergeladen und analysiert wird.
- Der 33%-Overhead gilt, obwohl gzip einen Teil davon wiederherstellt.
Verwenden Sie Daten-URLs für kleine Assets kleine Symbole unter 12 KB, Platzhalterbilder oder HTML-Exporte in einer einzigen Datei. Für etwas Größeres, servieren Sie eine normale Datei und compress it statt.
Base64 ist keine Verschlüsselung.
Das ist der wichtigste Punkt. Base64 hat keinen Schlüssel. Jeder kann es sofort entschlüsseln, und viele Tools tun es automatisch. Es ist jedoch üblich:
- API-Schlüssel "versteckt" in Base64 im Front-End-Code.
- Passwörter, die in Datenbanken oder Konfigurationsdateien mit Base64-Codierung gespeichert sind.
- Kubernetes-Geheimnisse werden als geschützt angesehen, weil ihre Werte Base64 sind.
Kubernetes kodiert geheime Werte in Base64 rein so, dass binäre Daten in YAML passen; Schutz kommt von Zugriffskontrolle und Verschlüsselung in Ruhe, die separat konfiguriert werden müssen. Wenn Daten vertraulich sein müssen, verschlüsseln Sie sie mit einem echten Algorithmus wie AES-GCM, und wenn Sie Passwörter überprüfen müssen, verwenden Sie eine Passwort-Hash-Funktion nicht Base64 und kein einfacher Hash wie MD5 ([warum nicht] ((/blog/md5-vs-sha256)).
Häufige Anwendungsfälle richtig gemacht
- HTTP-Basic-Authentifizierung sendet
Authorization: Basic base64(user:password). Die Verschlüsselung vermeidet nur Probleme mit Sonderzeichen; die Anmeldeinformationen werden ausschließlich durch HTTPS geschützt. - E-Mail-Anhänge verwenden MIME Base64 mit Zeilenunterbrechungen alle 76 Zeichen.
- Die Einbettung von Binärdaten in JSON, z. B. ein kleines Signaturbild oder einen kryptographischen Schlüssel, ist eine legitime Verwendung. Für große Dateien separat hochladen und sie nach URL verweisen.
- Speicherung von Binärdaten in einer Textkonfiguration, z. B. TLS-Zertifikate in Umgebungsvariablen.
Entschlüsselungsfehler beheben
- Ungültiges Zeichen: Sie entschlüsseln wahrscheinlich Base64URL mit einem Standard-Decoder, oder die Zeichenfolge enthält Leerzeichen oder Zeilenbrüche.
- Falsche Polsterung:
=addieren, bis die Länge ein Vielfaches von 4 ist. - ** Verzerrter Text nach der Entschlüsselung:** Das Original wurde aus einem anderen Zeichensatz verschlüsselt, oder die Daten sind binär und nicht Text.
- ** Die Ausgabe sieht wieder wie Base64 aus:** Die Daten wurden zweimal verschlüsselt; entschlüsseln noch einmal.
Verwandte Codierungen
- Base32 verwendet 32 Zeichen (AZ und 27), ist groß- und kleinbuchstabenunempfindlich und wird in TOTP-Geheimnissen für Authentifizierungs-Apps verwendet. Die Gemeinkosten sind 60%.
- Hexadezimal (Base16) verwendet zwei Zeichen pro Byte 100% Overhead , ist aber leicht zu lesen und üblich für Hashes.
- Base58 entfernt ähnliche Zeichen und wird in Bitcoin-Adressen verwendet.
- Prozent-Coding entkommt nur unsicheren Zeichen in URLs.
Zusammenfassung
Base64 konvertiert Bytes in ein 64-zeiliges Textalfabet, 3 Bytes auf einmal, zu einem Preis von etwa 33% zusätzlicher Größe. Verwenden Sie es, um binäre Daten über Textkanäle zu übertragen; verwenden Sie die URL-sichere Variante in URLs und Tokens; konvertieren Sie immer zuerst Text in UTF-8-Bytes. Verwenden Sie es nie, um Geheimnisse zu schützen es ist eine Verschlüsselung, kein Schloss.
Diese Seite wurde automatisch aus dem Englischen übersetzt. Wenn dir ein Fehler auffällt, sag uns bitte Bescheid.