Base64 Kodier- und Dekodierwerkzeug
Schnelle Base64-Kodierung und -Dekodierung, UTF-8-Textkonvertierung unterstützt
Konvertierungsmethode wählen
Was ist Base64?
Base64 ist eine Methode, die 64 druckbare Zeichen verwendet, um Binärdaten darzustellen. Diese 64 Zeichen umfassen Großbuchstaben A-Z, Kleinbuchstaben a-z, Ziffern 0-9 sowie die zwei Symbole + und /. Da nur druckbare Zeichen verwendet werden, können Base64-kodierte Daten sicher in Umgebungen übertragen werden, die nur Text unterstützen, wie E-Mails, Webseiten und JSON. Die kodierten Daten sind etwa 33% größer als die Originaldaten. Base64 erschien erstmals 1987 im PEM-Protokoll zur sicheren Übertragung von Binärdaten in E-Mails. Heute ist es einer der Internetstandards und wird in vielen Szenarien weit verbreitet eingesetzt, von E-Mail-Anhängen bis JWT-Tokens, von Bild-Einbettungen bis Datenübertragungen. Fast alle Programmiersprachen haben Base64-Kodierungs- und Dekodierungsfunktionen eingebaut.
Anleitung
Anleitung
- Text in das linke Eingabefeld einfügen
- Vorgang „Kodieren“ oder „Dekodieren“ auswählen
- Ergebnisse erscheinen automatisch auf der rechten Seite
- Klicken Sie auf die Kopierschaltfläche, um das Ergebnis zu speichern.
Häufige Fehler
- Base64 ist eine Kodierung, keine Verschlüsselung; jeder mit dem Text kann ihn dekodieren – verwenden Sie ihn nicht zum Schutz vertraulicher Daten.
- Wenn das Dekodieren fehlschlägt, prüfen Sie auf fehlendes Padding, kopierte Zeilenumbrüche, URL-sichere Base64-Zeichen oder umgebende Anführungszeichen.
Anwendungsfälle
Technisches Prinzip
Base64 ist eine von mehreren Binär-Text-Kodierungen, die in RFC 4648 (S. Josefsson, Oktober 2006) spezifiziert sind, zusammen mit Base16 (Hex) und Base32. Der Name 'Base64' und das Alphabet wurden ursprünglich für Privacy-Enhanced Mail (RFC 989, 1987) definiert, wo PEM binäre S/MIME- und X.509-Daten in eine druckbare ASCII-Hülle einbettete, damit sie 7-Bit-sichere Transporte überstehen konnten. Dasselbe Alphabet wurde später zum De-facto-Standard für MIME (RFC 2045), JWT-Signaturen (RFC 7519), HTML-data:-URIs (RFC 2397), SSH-öffentliche Schlüssel-Blobs (RFC 4253 §6.6) und Git-LFS-Zeigerdateien (die SHA-256-Hashes als Base64 speichern). Gits eigene Packfiles sind KEIN Base64 — sie verwenden Deltakodierung mit zlib-Komprimierung, und Git-Objekt-IDs sind 40-stellige Hex-SHA-1-Zeichenketten, kein Base64. Die Kosten: Je 3 Eingabebytes werden zu 4 Ausgabezeichen, sodass die kodierte Ausgabe genau 4/3 der Größe hat (33,3 % Überhang). Bei einem 10 MB großen Binärblob beträgt die kodierte Form ca. 13,3 MB. Der Mechanismus: Die Eingabe wird in 3-Byte-(24-Bit-)Gruppen aufgeteilt; jede Gruppe wird in vier 6-Bit-Werte zerlegt; jeder 6-Bit-Wert wählt ein Zeichen aus einem 64-Zeichen-Alphabet. Das kanonische Alphabet ist A–Z (Indizes 0–25), a–z (26–51), 0–9 (52–61), '+' (62), '/' (63), mit '=' als Füllzeichen. Das klassische RFC-4648-Beispiel: 'Man' (0x4d 0x61 0x6e) wird zum 24-Bit-Wert 0x4d616e gepackt; aufgeteilt in 6-Bit-Abschnitte ergibt 0x0d 0x16 0x0e 0x0a, zugeordnet zu 'TWFu'. Wenn die Eingabelänge kein Vielfaches von 3 ist, wird die abschließende Gruppe rechts mit Nullen aufgefüllt: 1 Byte übrig → 2 signifikante 6-Bit-Abschnitte + '==' (2 Füllzeichen); 2 Bytes übrig → 3 signifikante Abschnitte + '=' (1 Füllzeichen). Die Füllzeichen tragen keine Information, aber sie machen die Kodierungslänge zu einer deterministischen Funktion der Eingabelänge und ermöglichen es Decodierern, unvollständige Eingaben abzulehnen. Im Browser hat Base64 zwei bekannte Fallstricke. Erstens operieren `btoa` und `atob` (die DOMString-Varianten) auf Latin-1-Codewerten, nicht auf Bytes — eine Zeichenkette mit U+00E9 (é) oder U+4E2D (中) löst einen InvalidCharacterError aus. Die Seite umgeht dies, indem die Eingabe vor dem Aufruf von `btoa` durch `TextEncoder().encode(str)` (immer UTF-8) und nach `atob` durch `TextDecoder().decode(bytes)` geleitet wird. UTF-8-Mehrbytezeichen expandieren: '你' sind 3 Bytes (0xe4 0xbd 0xa0) → 4 Base64-Zeichen (8 Base64-Zeichen für '你好'). Zweitens ersetzt Base64URL (RFC 4648 §5) '+' und '/' durch '-' und '_' und entfernt die Auffüllung, weil '+' und '/' URL-signifikant sind und '=' Abfragezeichenketten beendet. JWT (RFC 7519) und JWS (RFC 7515) erfordern Base64URL genau aus diesem Grund. Base64 ist Kodierung, keine Verschlüsselung — die kodierte Form hat keinerlei Geheimhaltung, und das Alphabet ist so kurz, dass jeder Beobachter das Ergebnis mühelos lesen kann. Base64 für einen Sicherheitsmechanismus zu halten, ist ein CVE-Muster: CVE-2004-2761 dokumentierte die X.509-MD5-Chosen-Prefix-Kollision, die es Angreifern erlaubte, Zertifikate mit kollidierenden MD5-Signaturen zu fälschen, während CVE-2005-4900 und andere die alte Praxis betrafen, bei der `$1$`-md5crypt-Passwort-Hashes von einer Authentifizierungsschicht erneut kodiert oder gehasht wurden, die Base64-dekodierte Bytes mit neuen Anmeldedaten verwechselte. Das wiederkehrende Muster ist dasselbe: Ein System behandelt die Kodierung so, als füge sie eine Geheimhaltungsebene hinzu, die sie nicht besitzt, und das Ergebnis ist ausnutzbar. Für echte Geheimnisse verwenden Sie AES-GCM (RFC 5288) oder ChaCha20-Poly1305 (RFC 8439). Bei Kompression-gefolgt-von-Base64 (was `gzip -b64` tut) ist zu beachten, dass die kodierte Form ca. das 1,37-fache der gzip-Größe beträgt und jede Byteänderung im komprimierten Strom die Decodierung bricht — Base64 ist daher eine schlechte Integritätsschicht; HMAC-SHA256 über die Bytes vor der Kodierung ist der richtige Ansatz.
- RFC 4648 (Oktober 2006) definiert Base64, Base32 und Base16 mit einem kanonischen Alphabet (A–Z, a–z, 0–9, +, /) und '=' als Füllzeichen. Die MIME-Variante (RFC 2045) fügt alle 76 Zeichen Zeilenumbrüche für den Transport ein; die URL-sichere Variante (Base64URL, RFC 4648 §5) ersetzt + und / durch - und _ und entfernt die Auffüllung — verwendet von JWT (RFC 7519), JWS (RFC 7515) und JWK (RFC 7517).
- Mechanismus: 3 Eingabebytes (24 Bit) → 4 Ausgabezeichen (je 6 Bit). Der Überhang beträgt 33,3 % — jeder 1 MB Binäreingabe wird zu 1,33 MB Base64. Bei ASCII kann das Verhältnis noch schlechter sein, wenn die Eingabe '=' oder andere Zeichen enthält, die von umgebenden Protokollen escaped werden.
- Auffüllregel: Eingabelänge mod 3 = 0 → keine Auffüllung; mod 3 = 1 → '==' (zwei Füllzeichen, ein Byte kodiert); mod 3 = 2 → '=' (ein Füllzeichen, zwei Bytes kodiert). '=' enthält keine Information; es teilt dem Decoder nur mit, wie viele Bytes entfernt wurden.
- UTF-8 + btoa-Fallstrick: `btoa('é')` löst InvalidCharacterError aus, weil btoa die Eingabe als Latin-1-Codewerte behandelt. Die Seite umgeht dies, indem sie vor btoa durch `TextEncoder` (UTF-8) kodiert und nach atob durch `TextDecoder` dekodiert. Ohne diesen Schritt wird alles außerhalb von U+0000..U+00FF zu '0 Bytes kodiert' statt zu einem Fehler.
- Base64URL ist für JWT, JWS und JWK erforderlich (RFC 7519/7515/7517). Es verwendet '-' und '_' statt '+' und '/' (URL-signifikante Zeichen) und entfernt die '='-Auffüllung (die Abfragezeichenketten beendet). Ein JWT-Header-Segment an einen Base64-Decoder statt an einen Base64URL-Decoder zu übergeben, liefert Müll; die Seite erkennt nicht automatisch — wählen Sie die richtige Variante für die Nutzlast.
- Leistung: Die Kodierung liegt bei ca. 400–700 MB/s in V8 auf einem modernen Laptop (eine enge Schleife mit Tabellenlookups und Bitverschiebungen). Die Dekodierung hat ähnliche Geschwindigkeit. Bei großen Blobs (10+ MB) ist die Allokation der Engpass, nicht die Berechnung — der Ausgabepuffer ist 33 % größer und `TextEncoder/TextDecoder` erstellt eine Kopie.
- Base64 ist Kodierung, keine Verschlüsselung — jeder mit der Zeichenkette kann sie lesen. CVE-2004-2761 (X.509-MD5-Chosen-Prefix-Kollision bei Zertifikatssignaturen) und viele MISC-CTF-Writeups nutzen dieses Missverständnis als ersten Schritt. Für Geheimnisse verwenden Sie AES-GCM (RFC 5288) oder ChaCha20-Poly1305 (RFC 8439). Bei data:-URIs beachten Sie die kodierte Größe: Ein 10-MB-Bild wird zu einer 13,3-MB-URL, was die meisten Browser-URL-Längenlimits und die meisten E-Mail-Größenlimits überschreitet.
- Hinweis zur Migration: Base16 (Hex) wird in Low-Level-Protokollen und Hash-Ausgaben bevorzugt, weil jedes Byte genau 2 Zeichen abbildet und die Länge vorhersagbar ist (keine Auffüllungsmathematik). Base32 wird für die manuelle Übertragung bevorzugt (keine ähnlich aussehenden Zeichen). Base64 ist die universelle Standardeinstellung für Binärtransport in Textprotokollen, wird aber schrittweise durch rohe Bytes über HTTP/2 und WebTransport ersetzt, wo es das Framing erlaubt.
Beispiele
ASCII-Text kodieren
Eingabe: Hello
Ausgabe: SGVsbG8= (5 Bytes -> 8 Zeichen, 1 Padding-Zeichen)
Eingabe: Hello, World!
Ausgabe: SGVsbG8sIFdvcmxkIQ== (13 Bytes -> 18 Zeichen, 1 Padding-Zeichen)
Eingabe: Man
Ausgabe: TWFu (3 Bytes -> 4 Zeichen, kein Padding)
Das 'Man'-Beispiel ist der kanonische RFC-4648-Vektor: die Bytes 0x4D 0x61 0x6E
werden zum 24-Bit-Wert 0x4D616E gepackt, in 6-Bit-Blöcke 0x0D 0x16 0x0E 0x0A
zerlegt und über das Standard-Alphabet auf T W F u abgebildet.UTF-8-Text kodieren (Chinesisch)
Eingabe: ni hao (3 ASCII-Bytes)
Ausgabe: 5L2g5aW9 (8 Zeichen)
Eingabe: ni hao shi jie (4 CJK-Zeichen, 12 UTF-8-Bytes)
Ausgabe: 5L2g5aW95LiW55WM (16 Zeichen)
Jedes CJK-Zeichen wird zu 3 UTF-8-Bytes (E4 BD A0 usw.), daher
wächst die Base64-Ausgabe um ~4/3 und dann erneut um ~4/3 - also
etwa das 2,67-Fache der Zeichenanzahl in der kodierten Ausgabe.
Die Seite leitet die Eingabe zuerst durch TextEncoder().encode(str),
um der btoa('InvalidCharacterError')-Falle bei Nicht-ASCII-Eingaben
zu entgehen.Ein JWT-Segment dekodieren und round-trippen
Kodiert: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Dekodiert: {"alg":"HS256","typ":"JWT"}
Round-Trip:
encode('{"alg":"HS256","typ":"JWT"}') -> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9') -> {"alg":"HS256","typ":"JWT"}
JWT-Segmente verwenden Base64URL, daher muss die Seite '-' / '_'
neben dem Standard '+' / '/' akzeptieren. Ein JWT-Header, der an
einen strikten Base64-Decoder geht, liefert Datenmüll - wähle die
richtige Variante für die Payload.Base64 vs. Base64URL
Eingabe: Hello><h2>
Standard: SGVsbG8+PGgyPg== (+ / = Padding; sicher in JSON / E-Mail)
URL-sicher: SGVsbG8-PGIyPg (- _ ohne Padding; sicher in URL-Pfaden/-Querys)
Unterschiede:
'+' (62) -> '-' und '/' (63) -> '_'
'=' Padding wird in der URL-sicheren Form vollständig entfernt
Verwende Base64URL für JWT, JWS, JWK und jedes Token, das in einem
URL-Query-String übertragen wird, weil '+' / '/' in URLs eine
besondere Bedeutung haben und '=' die Query beendet.FAQ
Ist Base64 eine Verschlüsselung?
Nein. Base64 ist eine Kodierung, keine Verschlüsselung. Es wandelt beliebige Bytes nur in 64 druckbare ASCII-Zeichen (A-Z, a-z, 0-9, +, /) um, damit sie Systeme überleben, die Binärdaten verstümmeln. Jede Person mit dem kodierten String kann ihn sofort wieder dekodieren — es gibt kein Geheimnis.
Warum endet meine kodierte Ausgabe mit einem oder zwei =?
Base64 erzeugt 4 Ausgabezeichen pro 3 Eingabebytes. Ist die Eingabelänge kein Vielfaches von 3, füllt der Encoder mit = auf, damit die Ergebnislänge ein Vielfaches von 4 bleibt. Ein übriges Eingabebyte → zwei =; zwei übrige Bytes → ein =; passende Eingabe → keins. Manche Implementierungen lassen das Padding weg — das ist erlaubt, aber nicht überall interoperabel.
Was ist URL-sicheres Base64?
Standard-Base64 enthält / und +, die in URLs und Dateinamen besondere Bedeutung haben. URL-sicheres Base64 (RFC 4648 §5) ersetzt sie durch _ und - und lässt das =-Padding oft weg. Nutze es für JWT-Tokens, URL-Parameter und Dateinamen; Standard-Base64 für alles andere.
Warum ist der Base64-String etwa 33 % länger als das Original?
Aus jeweils 6 Eingabebits wird ein 8-Bit-Ausgabezeichen, also encoded_size = ceil(input_length / 3) * 4. Das ist grob 4/3 der Eingabe (33 % Overhead). Das ist der Preis dafür, beliebige Bytes als druckbares ASCII darzustellen.
Welche Eingabeformate kann ich hier einfügen?
Zum Kodieren fügst du reinen Text (intern UTF-8-kodiert) ein oder lädst eine Datei hoch. Zum Dekodieren fügst du einen Base64-String mit oder ohne Whitespace ein — der Decoder entfernt Zeilenumbrüche automatisch. Schlägt das Dekodieren fehl, prüfe auf abweichende Zeichen oder ein fehlendes =-Padding.
Kann Base64 binäre Dateiinhalte transportieren?
Ja. Genau das ist sein Hauptanwendungsfall — Inline-Bilder in HTML/CSS (data:-URLs), E-Mail-Anhänge (MIME) und Anmeldedaten in HTTP-Headern (Basic Auth) nutzen Base64 alle dafür, binäre Inhalte über reine Textkanäle zu schicken. Beachte, dass die resultierende Nutzlast 33 % größer ist als die Rohdatei.
Soll ich Base64 nutzen, um sensible Daten zu verstecken?
Niemals. Base64 ist ohne Schlüssel vollständig umkehrbar — es als Verschleierung zu nutzen, ist ein häufiger Fehler, der in vielen realen Vorfällen Passwörter und Tokens preisgegeben hat. Nimm für alles Sensible eine echte Verschlüsselung oder einen Secrets-Manager.