Die erste Version des Base64-Konverters, den ich auf toolz.dev ausgeliefert habe, hatte einen Fehler, über den ich noch etwas peinlich war. Es funktionierte perfekt in jedem Test, den ich geschrieben habe - codiert, dekodiert, rund, fertig. Dann hat jemand einen Text mit einem Emoji eingefügt und folgendes erhalten:
Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.
Ich habe ein Textcodierungstool erstellt und vergessen, dass Text, Sie wissen, der meiste Textdrohen Jedes nicht-lateinische Skript, jeder akzentuierte Charakter, jedes Emoji - gebrochen. Meine Tests waren alle ASCII, weil ich in ASCII denke. Dieser Fehler hat mir mehr über Base64 beigebracht als jede Spezifikationslesung, und ich werde Ihnen die Lösung später zeigen, weil es fast jeden berührt, der berührt btoa()drohen
Base64 ist eines der Dinge, die Entwickler täglich verwenden - in jeder JWT, jedem E-Mail-Anhang, jeder data: URI - während selten unter die Haube schauen. Schauen wir uns unter die Haube.
tl; dr: Die Base64-Encoding wandelt binäre Daten in 64 sichere ASCII-Zeichen um, sodass sie nur Textkanäle wie JSON, URLs und E-Mails durchlaufen können - zum Preis von ~ 33% der Größe des Overheads. es ist nicht Verschlüsselung, jeder kann es sofort umkehren. Verwenden Sie die kostenlose Client-Seite, um jetzt zu kodieren oder zu dekodieren Base64-Konverter Auf toolz.dev — Ihre Daten verlassen den Browser nie, was zählt, wenn Sie Tokens dekodieren.
Was ist Base64-Codierung?
Base64 ist ein Binär-zu-Text-Codierungsschema: Es stellt beliebige Bytes dar, die nur 64 Zeichen verwenden, die jedes jemals erstellte Textsystem überleben. Die maßgebliche Spezifikation ist RFC 4648 (2006), obwohl die Codierung 1993 auf RFC 1421 und Privacy Enhanced Mail zurückgeht - Base64 ist älter als der Webbrowser.
Das Alphabet:
A–Z→ Werte 0–25a–z→ Werte 26–510–9→ Werte 52–61+→ 62,/→ 63=→ Polsterung (kein Wert, nur Füller)
Warum diese 64? Weil sie in ASCII, EBCDIC und jedem E-Mail-Gateway, das jemals gebaut wurde, ungemastert überleben. Base64 ist ein Friedensvertrag mit jahrzehntelanger reiner Textinfrastruktur.
Die Kosten des Vertrags: Alle 3 Eingabebytes werden zu 4 Ausgabezeichen - eine feste Steuer von 33%. Behalten Sie diese Zahl in Ihrem Kopf, sie entscheidet über echte Architekturfragen.
Wie funktioniert der Base64-Algorithmus?
Kürzere Antwort als Sie erwarten: Gruppieren Sie Bits von 8s in 6s und schauen Sie sie dann in einer Tabelle nach. 2⁶ = 64 - Daraus stammt der Name.
Verschlüsselung Hi!:
Schritt 1 - Bytes in Bits.
| Charakter | ASCII | binär |
|---|---|---|
| h | 72 | 01001000 |
| ich | 105 | 01101001 |
| ! | 33 | 00100001 |
Verkettung: 010010000110100100100001 - 24 Bits.
Schritt 2 - Gruppieren Sie in 6-Bit-Chunks.
010010 | 000110 | 100100 | 100001
18 | 6 | 36 | 33
Schritt 3 - Suchen Sie jeden Wert im Alphabet.
18 → S, 6 → G, 36 → k, 33 → hdrohen so Hi! codiert zu SGkhdrohen
Das ist der gesamte Algorithmus. Keine Mathematik jenseits einer Nachschlagetabelle.
Polster Verarbeitet Eingaben, die nicht vielfache von 3 Bytes sind. Codieren Sie gerade Hi (2 Bytes = 16 Bit) und Sie können nur 2-und-A-Bit-6-Bit-Gruppen füllen, der Encoder Null-Pads die Bits und anhängig = Um zu signalisieren, wie viel Füller ist:
Hi → SGk= (2 bytes remaining → one '=')
H → SA== (1 byte remaining → two '==')
Hi! → SGkh (multiple of 3 → no padding)
Als ich dies für den Toolz.dev-Konverter implementierte, war das Padding der Ort, an dem alle meine Off-by-One-Bugs lebten. Wenn Sie Base64 jemals mit der Hand rollen - schreiben Sie für ein Codierungsinterview - schreiben Sie zuerst die Padding-Tests.
Die Dekodierung ist das Spiegelbild: Zeichen zurück auf 6-Bit-Werte, gruppieren Sie sich in 8-Bit-Bytes um, lassen Sie die Padding fallen.
Wohin rennst du eigentlich in base64?
JWTS - der Große
Jeder JSON-Web-Token besteht aus drei base64URL-kodierten Segmenten, die durch Punkte verbunden sind: Header, Payload, Signatur. Debuggen Auth ist 50% dekodieren.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Dekodieren Sie das erste Segment und Sie erhalten {"alg":"HS256","typ":"JWT"}drohen Der zweite gibt Ihnen die Ansprüche. Mein Workflow Wenn sich ein Token schlecht benimmt: Bei den Punkten aufgeteilt, dekodieren Sie jeden Teil der Base64-Konverter, fügen Sie dann den JSON in die JSON-Formater um es richtig zu lesen. zwei Pasten, und Sie wissen, ob die exp Anspruch ist Ihr Problem.
Es lohnt sich, klar zu sagen: JWT-Nutzlasten sind Lesbar von jedem, der den Token hältdrohen Die Unterschrift hört auf zu manipulieren, nicht zu lesen. Ich habe Codebasen überprüft, die sensible Daten in Ansprüche gefüllt haben, weil der Kauderwelsch die Privatsphäre implizierte. es tut nicht.
Daten-URIs
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Durch das Einbetten kleiner Assets inline speichert eine HTTP-Anforderung. Meine Faustregel beim Erstellen von bildintensiven WordPress-Admin-UIs: Es lohnt sich unter ~ 5 KB, nach 10 KB blähen Sie das Dokument um 33% auf, um eine Anfrage HTTP / 2-Multiplexe trotzdem zu speichern.
Kubernetes Geheimnisse - und ein Scherz
apiVersion: v1
kind: Secret
data:
password: cGFzc3dvcmQ= # decodes to "password"
Kubernetes-Geheimnisse sind base64-kodiert, und die damit verbundene falsche Sicherheit ist alarmierend. Dieser Wert dekodiert in einer Paste. Base64 existiert hier, damit binäre Werte überleben YAML — a Formatierung Entscheidung, keine Sicherheits-. Wenn Ihre Geheimnisse bei "Base64 in etcd" endet, hat sie nicht begonnen.
Der Rest der Liste
HTTP-Basis-Authenheader (Authorization: Basic dXNlcjpwYXNz Dekodieren zu einfach user:pass - daher nur HTTPS-). E-Mail-Anhänge über MIME. Binäre Blobs in JSON-Nutzlasten, da JSON keinen binären Typ hat.
ist Base64-Verschlüsselung? (Nein. Bitte, nein.)
Es lohnt sich, einen eigenen Abschnitt zu werten, weil das Missverständnis sich weigert zu sterben.
base64 ist ein Darstellung, wie eine Zahl in Hexadezimal zu schreiben. Kein Schlüssel. Kein Geheimnis. Die Dekodierung erfordert nichts als die in RFC 4648 öffentlich gedruckte Alphabettabelle. Alles, was base64-"geschützt" ist, wird so geschützt, wie ein Brief durch Kursivschrift geschützt wird.
Wenn Daten vertraulich sind: ordnungsgemäß verschlüsseln (AES-GCM oder LibsOdium), dann base64-Codieren Sie den Chiffretext, wenn der Kanal Text benötigt. Codierung und Verschlüsselung komponieren gut - sie sind nur keine Ersatz. Und wenn Sie eher Integrität als Geheimhaltung benötigen, ist dies ein Hash-Job - der Hash-Generator Deckt SHA-256 und Freunde ab.
Wie vergleicht Base64 mit Hex, URL-Codierung und Base85?
| base64 | Hex (Basis16) | URL/Prozent-Codierung | ASCII85 | |
|---|---|---|---|---|
| Größe Overhead | +33% | +100% | 0–200%, inhaltsabhängig | +25% |
| Alphabet | 64 Zeichen | 16 Zeichen | ASCII + %XX Flucht |
85 Zeichen |
| Von Menschen lesbare Ausgabe | kein | Art von Bytegrenzen sichtbar | Meistens für ASCII-Eingabe | kein |
| Standardmäßig URL-sicher | Nein (+, /, =) |
ja | Ja, per Definition | kein |
| Sie werden es in treffen | JWTs, MIME, Daten-URIs | Hashes, MAC-Adressen, Farbcodes | Abfragezeichenfolgen | PDF-Intern |
Wie ich mich auswähle: verhexen Wenn Menschen die Ausgabe lesen oder vergleichen - Prüfsummen, Verdauungen, alles, was von Augapfel debuggt wird. Prozent-Kodierung Für URL-Text niemals binär. base64 Für die binäre Überkreuzung eines Textkanals — die meisten realen Fälle. ASCII85 Niemals freiwillig, die 8%-Einsparung muss die Kompatibilitätsfragen noch rechtfertigen.
Was ist URL-Safe Base64 und warum existiert es?
Standard Base64 hat ein Problem: + bedeutet "Leerzeichen" in Abfragezeichenfolgen, / ist der Wegtrenner, = Begrenzt Parameter. Fügen Sie ein Standard-Base64-Token in eine URL ein und eine Middleware wird es irgendwo verstauen - zeitweise und nur in der Produktion. Fragen Sie mich, woher ich weiß.
RFC 4648 Abschnitt 5 definiert den Fix, der normalerweise als base64url bezeichnet wird:
| serienmäßig | URL-Safe |
|---|---|
+ |
- |
/ |
_ |
= Polster |
Normalerweise nur weggelassen |
Gleicher Algorithmus, zwei Zeichen getauscht, Padding fallen gelassen. JWTs verwenden ausschließlich base64url – genau deshalb schlägt das Einfügen eines JWT-Segments in einen strengen Standard-Base64-Decoder auf einem Streuner aus - oder _drohen der toolz.dev-Konverter Behandelt beide Varianten, da ein Decoder, der die Hälfte der realen Base64 ablehnt, kein großer Decoder ist.
Faustregel: Wenn die codierte Zeichenfolge jemals eine URL, einen Dateinamen oder einen HTTP-Header berührt, verwenden Sie die URL-Safe-Variante von Anfang an. Nachrüsten ist ein Fund-und-Ersetzen plus Gebet.
Wie kodiert und dekodiert man im Code?
Javascript - die Falle, in die ich gefallen bin
Hier ist die naive Version, die ich versendet habe:
btoa('Hello') // "SGVsbG8=" — great!
btoa('café ☕') // InvalidCharacterError — the bug from my intro
btoa Vorab der modernen Unicode-Handling und akzeptiert nur Latin-1. Der richtige moderne Ansatz geht explizit durch UTF-8-Bytes:
// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes)); // "Y2Fmw6kg4piV"
// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"
(Überspringen Sie in node.js die Zeremonie: Buffer.from(str, 'utf8').toString('base64').)
Python
import base64
encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')
# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')
Python macht das Richtige offensichtlich: Sie müssen Byte übergeben, so dass der Schritt ENCODE-TO-UTF-8 nicht vergessen werden kann. Ich wünsche btoa Wurde mit der gleichen Wirbelsäule entworfen.
PHP
$encoded = base64_encode('café ☕'); // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);
// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');
das strtr/rtrim Line ist in jeder PHP-Codebasis erschienen, an der ich jemals gearbeitet habe, einschließlich WP Adminify. PHP hat nie eine integrierte URL-sichere Variante erhalten, daher schreiben wir alle die gleichen zwei Zeilen.
Häufig gestellte Fragen
Wofür wird Base64-Codierung verwendet?
Es konvertiert binäre Daten in ASCII-Text, damit es Systeme durchlaufen kann, die nur Text verarbeiten: JSON-Nutzdaten, URLs, E-Mail (MIME), HTTP-Header. Sie treffen es am häufigsten in JWT-Tokens, data: URIs für Inline-Images, Kubernetes-Geheimnisse und API-Nutzdaten mit Dateien. Es ist ein Transportformat, kein Speicher- oder Sicherheitsformat.
Ist base64 dasselbe wie Verschlüsselung?
Nein, und die Verwirrung der beiden verursacht echte Sicherheitsvorfälle. Base64 hat keinen Schlüssel – Dekodierung erfordert nur die öffentliche Alphabettabelle und nimmt eine Paste in eine beliebige Decoderdrohen Verschlüsseln Sie zuerst mit einem realen Algorithmus (AES-GCM) und codieren Sie dann den Chiffretext, wenn der Kanal Text benötigt.
Warum erhöht Base64 die Daten um 33%?
Jedes Base64-Zeichen trägt 6 Bits an Informationen, belegt jedoch ein volles 8-Bit-Byte, sodass 3 Bytes der Eingabe immer 4 Zeichen der Ausgabe - 4/3 ≈ 1,33. Es sind Fixkosten des Formats, die nicht durch Design vermeidbar sind. Wenn die Größe wichtig ist, komprimieren Sie vor der Codierung, nie danach - die codierte Ausgabe sieht zufällig aus und komprimiert schrecklich.
Was ist der Unterschied zwischen Base64 und Base64url?
base64url-Swaps + auf - und / auf _, und lässt normalerweise die = Padding, so dass die Ausgabe URLs, Dateinamen und Header ohne Flucht überlebt. Ansonsten wird derselbe Algorithmus in RFC 4648 Abschnitt 5 definiert. JWTs verwenden ausschließlich base64url - weshalb strenge Standard-Base64-Decoder auf sie verstopfen.
Warum löst btoa () InvalidCharacterError aus?
Ihre Zeichenfolge enthält Zeichen außerhalb von Latin-1 - ein Emoji, ein akzentuiertes Zeichen, jedes nicht-westliche Skript. btoa ist eine API aus den 1990er Jahren, die vor der sinnvollen Unicode-Handling liegt. Codieren Sie zuerst mit UTF-8-Bytes mit TextEncoder, dann base64 die Bytes; ich habe genau diesen Fehler in einem Produktionstool ausgeliefert, also kein Urteil.
Wie kann ich feststellen, ob eine Zeichenfolge base64 ist?
Nur gültige Base64 verwendet A–Z, a–z, 0–9, +, / (oder -, _ für URL-Safe), optionales Trailing =, mit einer Länge, die ein Vielfaches von 4 ist, wenn es gepolstert wird. Aber viele gewöhnliche Wörter passen auch zu diesem Muster - cafe ist gültig base64, die zu Müllbytes dekodiert. Der eigentliche Test ist die Dekodierung und die Überprüfung, ob die Ausgabe sinnvoll ist.
Warum hat meine Base64-Saite am Ende eine streunende Zeile?
weil echo fügt einen vorher hinzu base64 sieht es immer so echo "hunter2" | base64 Codiert acht Bytes, nicht sieben. printf oder echo -n stattdessen. Dies ist die häufigste Ursache für Kubernetes-Geheimnisse, die im Manifest richtig aussehen und zur Laufzeit fehlschlagen: Das dekodierte Passwort trägt eine unsichtbare Trailing \ndrohen der base64 Der Befehl umschließt auch die Ausgabe in 76 Spalten auf einigen Systemen — pass -w 0 auf GNU Coreutils, um es zu unterdrücken.
Wie dekodiere ich einen JWT-Token von Hand?
Teilen Sie den Token an seinen beiden Punkten, nehmen Sie das erste Segment (Header) und das zweite (Nutzlast) und führen Sie jeweils durch a Base64-Decoder — Sie sind base64url, verwenden Sie also ein Tool, das akzeptiert - und _drohen Formatieren Sie dann das resultierende JSON in a JSON-Formater die Behauptungen zu lesen. Fügen Sie niemals Produktions-Token in serverseitige Tools ein, nur auf der Clientseite.
Wie codiere ich ein Bild oder eine Datei in base64?
Lesen Sie die Datei als Bytes, dann base64 diese Bytes und stellen Sie einen Data-URI-Header wie data:image/png;base64, Ein Browser kann es also inline rendern. In Javascript, FileReader.readAsDataURL() Erledigt beide Schritte für Sie; in der Befehlszeile, base64 logo.png Druckt die RAW-Codierung. Behalten Sie es auf kleine Vermögenswerte - die 33% ige Steuer macht Base64 zu einer schlechten Passform für alles, was große Datenmengen und Big Data-URIs Ihr HTML oder CSS aufblähen.
Wie dekodiere ich base64 in Javascript, Python oder im Terminal?
In modernem Javascript dekodieren Sie Unicode-sicher mit new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) eher als nackt atobdrohen In Python, base64.b64decode(str) Gibt Bytes zurück - Aufruf .decode('utf-8') Für Text. In einem Terminal, echo "aGk=" | base64 -d (oder --decode).). Alle drei erwarten Standard Base64, also übersetzen -/_ zurück zu +// Zuerst, wenn Sie eine base64url-Zeichenfolge behandeln.
Der Mitnehmen
Base64 ist ein 30 Jahre alter Bit-Shuffling-Trick, der leise die Hälfte des modernen Webs aufrechterhält - Auth-Token, Anhänge, Inline-Assets, Geheimnisse, die nicht geheim sind. Verstehen Sie die 6-Bit-Neugruppierung, respektieren Sie die 33% Steuer, verwechseln Sie sie niemals mit Verschlüsselung und greifen Sie nach der URL-sicheren Variante, wo immer eine URL beteiligt ist. Das sind 95% der praktischen Base64-Meisterschaft.
Für den praktischen Teil ist Base64-Konverter auf toolz.dev Verfügt Standard- und URL-sichere Kodierung vollständig in Ihrem Browser - erstellt von jemandem, der die Unicode-Lektion auf die harte Tour gelernt hat, sodass Sie es nicht müssen.
Mehr in dieser Serie: das volle Anleitung für die Coding-Tools deckt den Rest der täglichen Fahrerdienstprogramme ab, die Regex Builder-Anleitung Tackle die anderen Skill-Entwickler vor, und da die Hälfte der Base64-Debugging in JSON endet, Ultimative JSON-Tools-An ist die natürliche nächste Lesung.
Verwandte Artikel:

