Zum Hauptinhalt springen

← Zurück zum Blog

Base64 vs. URL-Kodierung: Was ist der Unterschied?

Base64 und URL-Kodierung sind beide „mach das sicher als Text übertragbar”-Werkzeuge und daher leicht zu verwechseln. Aber sie lösen verschiedene Probleme. Hier der Unterschied.

Derselbe Text, zwei Kodierungen, nebeneinander. Wir haben 台北 101 durch beide Werkzeuge geschickt. Base64 liefert 5Y+w5YyXIDEwMQ==, der URL-Encoder liefert %E5%8F%B0%E5%8C%97%20101. Beide starten bei denselben 10 UTF-8-Bytes und laufen dann völlig auseinander: Base64 drückt alle Bytes in einem 64-Zeichen-Alphabet aus und füllt auf ein Vielfaches von vier auf (daher die ==), Prozentkodierung lässt sichere Zeichen wie 1, 0 und 1 sichtbar und maskiert nur den Rest. Deshalb wächst Base64 alles um ein Drittel, URL-Kodierung nur das Nötige.

Base64: Binär → Text

Base64 verwandelt beliebige Binärdaten (ein Bild, eine Datei, rohe Bytes) in reine ASCII-Buchstaben, -Ziffern sowie +, / und =. Es vergrößert die Daten um etwa 33 % und ist keine Verschlüsselung — jeder kann es dekodieren. Nutze es, wenn ein reiner Textkanal Binärdaten transportieren muss:

  • Ein Bild als data:-URI in HTML/CSS einbetten
  • E-Mail-Anhänge (MIME)
  • Kleine Binär-Blobs in JSON oder ein Token packen

Mehr dazu in Ist Base64 Verschlüsselung? (Spoiler: nein).

URL-Kodierung: sicherer Text in einer URL

URL-Kodierung (auch Prozent-Kodierung) ersetzt Zeichen, die in einer URL besondere Bedeutung haben oder nicht erlaubt sind, durch %XX-Codes — ein Leerzeichen wird zu %20, & zu %26 usw. Nutze sie, um Text zu platzieren in:

  • einer Query-String (?q=hello%20world)
  • einem Pfadsegment
  • Formularübermittlungen

Details im URL-Kodierungs-Leitfaden.

Die Unterschiede auf einen Blick

  • Zweck: Base64 = Binäres als Text tragen · URL-Kodierung = Text in einer URL sicher machen.
  • Ausgabe: Base64 = A–Z a–z 0–9 + / = · URL-Kodierung = Originaltext mit %XX-Escapes.
  • Größe: Base64 ≈ +33 % · URL-Kodierung vergrößert nur die escapten Zeichen.

Am weitesten auseinander liegen die beiden Verfahren bei Nicht-ASCII-Eingaben, und der Abstand ist messbar. 台北 sind sechs UTF-8-Bytes. Base64 macht daraus 5Y+w5YyX — acht Zeichen. Prozentkodierung macht aus denselben sechs Bytes %E5%8F%B0%E5%8C%97 — achtzehn Zeichen, drei pro Byte, denn jedes Byte wird zu einem % plus zwei Hexstellen. Base64 ist deutlich kompakter; dafür ist es in der Adressleiste unlesbar, und genau deshalb nutzen URLs das andere.

Sie kombinieren sich oft

Ein Base64-String kann +, / und = enthalten, die in URLs unsicher sind — willst du Base64 in eine URL setzen, kodierst du es entweder per URL oder nutzt Base64URL (eine URL-sichere Variante mit - und _).

Beide ausprobieren (lokal)

Faustregel: Base64, um Binäres als Text zu tragen; URL-Kodierung, um Text sicher in einen Link zu setzen.

Ein durchgerechnetes Beispiel

Nimm den Text a b&c. Jeder Kodierer behandelt ihn völlig anders:

Eingabe:        a b&c
URL-kodiert:    a%20b%26c
Base64-kodiert: YSBiJmM=

Die URL-Kodierung lässt die Buchstaben in Ruhe und escapt nur das Leerzeichen und das &, das Ergebnis bleibt also lesbar. Base64 schreibt jedes Byte in sein eigenes Alphabet um — vier Zeichen je drei Bytes — sodass die Ausgabe der Eingabe in nichts mehr ähnelt, dafür aber einen Kanal übersteht, der nur wenige sichere Zeichen zulässt. Andere Aufgabe, andere Ausgabe.

Das Padding wirkt willkürlich — und hört damit auf, sobald man vier Eingabelängen nebeneinander sieht. Base64 liest drei Bytes und gibt vier Zeichen aus; ist die letzte Gruppe kürzer, hält = fest, um wie viel. Jede Zeile unten ist Ausgabe unseres Base64-Encoders.

EingabeBase64Padding
aYQ====
abYWI==
abcYWJj—
abcdYWJjZA====
helloaGVsbG8==
台北5Y+w5YyX—
🎉8J+OiQ====

Häufige Fehlanwendungen

  • Base64 zum „Verstecken” von Daten. Es lässt sich in einem Schritt umkehren und schützt daher nichts — behandle es als Umschlag, nicht als Schloss. Siehe Ist Base64 Verschlüsselung?
  • Eine ganze URL URL-kodieren. Kodiere die Teile — einen Query-Wert, ein Pfadsegment — nicht die gesamte Adresse, sonst wird aus https:// ein https%3A%2F%2F und der Link ist kaputt.
  • Doppelte Kodierung. Einen bereits kodierten Wert erneut zu kodieren ergibt %2520 (ein %, das selbst escapt wurde). Kommt ein Leerzeichen als %2520 statt %20 an, wurde zweimal kodiert.
  • Base64s + und / vergessen. Reines Base64 ist nicht URL-sicher; nutze in einer URL Base64URL oder kodiere die Zeichenkette per URL.

Der häufigste Missbrauch von Base64 ist, es als Versteck zu behandeln — und ein konkreter Wert lohnt sich. admin:password kodiert zu YWRtaW46cGFzc3dvcmQ=, genau das schreibt HTTP-Basic-Authentifizierung in einen Header, und {"role":"admin"} kodiert zu eyJyb2xlIjoiYWRtaW4ifQ==. Beide dekodieren ganz ohne Schlüssel. Prozentkodierung wird nie für Verschleierung gehalten, weil sie lesbar bleibt; Base64 wird dafür gehalten, gerade weil es das nicht ist. Keines von beiden ist eine Sicherheitsmaßnahme — eines sieht nur eher so aus.

Wo jedes vorkommt

  • Base64 taucht auf, wo Binäres in Text reist: data:-URIs, E-Mail-MIME-Teile, die Segmente eines JWT und in JSON gestopfte Binärfelder.
  • URL-Kodierung taucht auf, wo Text in einer URL reist: Query-Strings, Formular-Posts (application/x-www-form-urlencoded) und Pfadsegmente mit Leerzeichen oder Nicht-ASCII-Zeichen.

FAQ

Kann ich Base64 statt URL-Kodierung nutzen?

Nein — sie sind nicht austauschbar. Base64 macht Binäres textsicher; URL-Kodierung macht Text URL-sicher. Rohes Base64 in einer URL kann sie wegen +, / und = trotzdem zerbrechen.

Warum endet mein Base64 mit =?

Das ist Padding, damit die Ausgabelänge ein Vielfaches von vier ist. Es ist normal, und manche URL-sicheren Varianten lassen es weg.

Macht eine der beiden Daten sicher?

Nein. Kodierung betrifft das Format, nicht die Geheimhaltung — sie ist von jedem umkehrbar. Für Vertraulichkeit brauchst du Verschlüsselung, für Manipulationsschutz einen Hash oder eine Signatur.