Base64-Kodierung- und Dekodierungs-Schnellreferenz: Befehlsbeispiele für Windows, Linux und Mac
Base64 auf Windows, Linux und Mac kodieren und dekodieren.
Dieser Spickzettel zeigt, wie man Base64 auf Windows, Linux und macOS mit certutil, PowerShell und base64 kodiert und dekodiert, einschließlich der Schalter, die je nach System unterschiedlich sind.

Dieser Leitfaden ist Teil von Developer Tools: Der vollständige Leitfaden zu modernen Entwicklungs-Workflows. Base64 bildet jede Eingabegruppe von drei Bytes auf vier Zeichen aus A–Z, a–z, 0–9, + und / ab. Für das Dekodieren ist kein Schlüssel erforderlich: Das Alphabet und das Füllzeichen = reichen aus, um die ursprünglichen Bytes wiederherzustellen.
Linux base64 bricht bei 76 Zeichen um, sofern nicht -w 0 gesetzt ist, macOS base64 schreibt eine Zeile, sofern nicht -b einen Zeilenumbruch festlegt, und Windows certutil -encode fügt Zertifikatsbanner rund um umgebrochene Zeilen hinzu. Die untenstehenden Linux-Befehle wurden mit GNU coreutils 9.7, uutils coreutils 0.10.0, BusyBox 1.37.0 und OpenSSL 3.5.5 ausgeführt. Die macOS-Befehle verwenden die Schalter -i, -D und -b, die für dieses Binary seit OS X 10.7 dokumentiert sind.
Base64 Kodieren und Dekodieren auf Windows
Windows bietet keinen base64-Befehl an. Certutil und PowerShell sind jedoch integriert.
Verwenden der Eingabeaufforderung mit Certutil
-
Öffnen Sie die Eingabeaufforderung.
-
Kodieren Sie eine Datei in Base64:
certutil -encode input.bin output.b64Ersetzen Sie
input.bindurch Ihren Dateipfad undoutput.b64durch den gewünschten Ausgabedateinamen. Die Datei beginnt mit-----BEGIN CERTIFICATE-----, gefolgt von umgebrochenem Base64, und endet mit-----END CERTIFICATE-----. -
Entfernen Sie die Banner-Zeilen und geben Sie den Inhalt aus:
certutil -encode input.bin tmp.b64 && findstr /v /c:- tmp.b64 && del tmp.b64findstr /v /c:-entfernt jede Zeile, die ein-enthält, was die zwei Banner entfernt. Der Inhalt bleibt umgebrochen. PowerShell[Convert]::ToBase64Stringist das Ergebnis in einer Zeile.
Base64 auf Windows dekodieren (Certutil)
certutil -decode encoded.b64 decoded.bin
certutil -decode akzeptiert die Banner-Datei, die -encode geschrieben hat. Es akzeptiert auch eine rohe Base64-Datei.
Verwenden von PowerShell zum Kodieren und Dekodieren
PowerShell [Convert]::ToBase64String schreibt eine Zeile und fügt keine Banner hinzu. Für mehr Shell-Automatisierung siehe den PowerShell-Spickzettel.
Eine Datei kodieren:
[Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\file.bin"))
Eine Zeichenfolge (UTF-8) kodieren:
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("Hello, World!"))
# Ausgabe: SGVsbG8sIFdvcmxkIQ==
Encoding.Unicode ist UTF-16LE. Die gleichen Zeichen kodieren dann als SABlAGwAbABvACwAIABXAG8AcgBsAGQAIQA=. Linux base64 von den UTF-8-Bytes erzeugt SGVsbG8sIFdvcmxkIQ==.
Base64 in eine Zeichenfolge dekodieren:
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("SGVsbG8sIFdvcmxkIQ=="))
# Ausgabe: Hello, World!
Base64 in eine Datei dekodieren:
[System.IO.File]::WriteAllBytes("decoded.bin", [Convert]::FromBase64String((Get-Content encoded.b64 -Raw)))
FromBase64String akzeptiert Leerzeichen, Tabulatoren und Zeilenumbrüche. Bei dem Banner BEGIN CERTIFICATE wird eine Ausnahme ausgelöst, daher muss eine certutil-Datei durch certutil -decode gehen (oder die Banner müssen zuvor entfernt werden).
Base64 Kodieren und Dekodieren auf Linux
base64 --version gibt den Binary-Namen auf dem PATH aus. Eine Zeile, die mit base64 (GNU coreutils) beginnt, ist GNU. Auf Ubuntu 25.10 und 26.04 ist /usr/bin/base64 uutils aus rust-coreutils; das hier geprüfte 26.04-Paket war uutils coreutils 0.10.0. GNU coreutils 9.7 ist gnubase64 aus dem Paket gnu-coreutils.
Beide akzeptieren eine Positionalsdatei, -d / --decode, -i / --ignore-garbage und -w / --wrap. Das Standard-Bruchverhalten ist 76. -w 0 deaktiviert es. uutils 0.10.0 behandelt auch -D als Alias von -d. GNU coreutils 9.7 beendet sich mit invalid option -- 'D' bei -D.
Piping und Quoting für diese One-Liner werden im Bash-Spickzettel behandelt.
Eine Datei in Base64 kodieren
base64 input_file > output_file
Beispiel:
base64 myfile.txt > encoded.txt
Um den kodierten Inhalt in das Terminal auszugeben:
base64 myfile.txt
Eine Zeichenfolge in Base64 kodieren
printf '%s' 'Hello, World!' | base64 -w 0
# Ausgabe: SGVsbG8sIFdvcmxkIQ==
printf '%s' schreibt die übergebenen Bytes und stoppt. echo ohne -n hängt einen Zeilenumbruch an, daher kodiert der gleiche Text als SGVsbG8sIFdvcmxkIQo=. In bash entspricht echo -n "Hello, World!" | base64 -w 0 der printf-Zeile. echo -n ist nicht auf jedes sh portabel.
Zeilenumbruch deaktivieren (-w 0)
GNU und uutils brechen bei 76 Zeichen um, einschließlich wenn stdout eine Datei oder ein Pipe ist. JSON, Umgebungsvariablen, URLs und ein Kubernetes data-Wert benötigen eine Zeile. Terraforms base64encode() gibt eine Zeile Standard-Base64 aus, daher muss CLI-Ausgabe, die damit verglichen wird, mit deaktiviertem Umbruch erzeugt werden:
base64 -w 0 input_file > output_file
Base64 auf Linux dekodieren
base64 -d encoded_file > decoded_file
# oder
base64 --decode encoded_file > decoded_file
Beispiel:
printf '%s' 'SGVsbG8sIFdvcmxkIQ==' | base64 -d
# Ausgabe: Hello, World!
GNU coreutils seit 9.5 und uutils 0.10.0 dekodieren Standard-Base64, das das =-Füllzeichen weglässt. printf '%s' 'SGVsbG8' | base64 -d gibt Hello aus. Encoder geben weiterhin das Füllzeichen aus. Ältere GNU base64-Versionen wiesen ungefüllte Eingaben zurück.
-i / --ignore-garbage überspringt Zeichen außerhalb des Alphabets beim Dekodieren. Zeilenumbrüche sind bereits erlaubt. Leerzeichen sind es nicht, außer -i ist gesetzt:
printf '%s' 'SGVs bG8=' | base64 -di
# Ausgabe: Hello
Bei GNU und uutils nimmt -i keinen Dateinamen entgegen. base64 -i input_file kodiert input_file, da der Name ein Positionalargument ist und -i nur das Dekodieren ändert. Auf macOS ist -i der Schalter für die Eingabedatei.
OpenSSL
OpenSSL 3.5.5 bricht bei 64 Zeichen um. -A hält die Ausgabe in einer Zeile:
printf '%s' 'data' | openssl base64 -e -A
# Ausgabe: ZGF0YQ==
printf '%s' 'ZGF0YQ==' | openssl base64 -d -A
# Ausgabe: data
Ohne -A wird ein langer Puffer alle 64 Zeichen unterbrochen, was eine andere Breite ist als bei GNU base64.
BusyBox
BusyBox 1.37.0 akzeptiert -d und -w COL (Standard 76, 0 deaktiviert Umbruch). --decode schlägt mit unrecognized option '--decode' fehl, und -D schlägt mit invalid option -- 'D' fehl. Das Dekodieren überspringt bereits Zeichen außerhalb des Alphabets: printf '%s' 'SGVs!bG8=' | busybox base64 -d gibt Hello aus. -i wird akzeptiert und erscheint nicht in der Hilfezeile.
Base64 Kodieren und Dekodieren auf macOS
macOS liefert ein BSD base64 mit. Ein Dateiname wird mit -i übergeben. Stdin-Umleitung funktioniert ohne -i: base64 < input_file.
Eine Datei in Base64 kodieren
base64 -i input_file > output_file
Beispiel:
base64 -i myfile.txt > encoded.txt
Um in das Terminal auszugeben:
base64 -i myfile.txt
Der Standard-Abstand ist 0, daher ist der kodierte Text eine Zeile. -b count fügt einen Zeilenumbruch alle count Zeichen ein. base64 -w 0 ist die Linux-Option; das macOS-Binary verwendet sie nicht. base64 -b 0 -i input_file ist die explizite Form für eine Zeile.
Kodieren und in die Zwischenablage kopieren
base64 -i input_file | pbcopy
Base64 auf dem Mac dekodieren
base64 -D -i encoded_file > decoded_file
-D ist Dekodieren. Diese -i- und -D-Schalter sind die macOS-Schnittstelle seit OS X 10.7. Ein Linux-Skript, das base64 -d aufruft, sollte auf macOS base64 -D aufrufen.
Schalter nach Implementierung
| Schalter | GNU coreutils 9.7 | uutils 0.10.0 | BusyBox 1.37.0 | macOS |
|---|---|---|---|---|
-d / --decode |
Dekodieren | Dekodieren (-D ist ein Alias) |
Nur -d; --decode führt zu einem Fehler |
-D verwenden |
-i |
--ignore-garbage beim Dekodieren |
--ignore-garbage beim Dekodieren |
Akzeptiert, aber nicht in --help aufgelistet; Nicht-Alphabet-Bytes werden bereits übersprungen |
Eingabedatei |
-w N |
Umbruch bei N Spalten (Standard 76); 0 deaktiviert |
Gleiche Standard und 0 |
Gleiche; keine lange Option | Nicht dieser Schalter; -b verwenden |
-b N |
Nicht akzeptiert | Nicht akzeptiert | Nicht akzeptiert | Zeilenumbruch alle N Zeichen (Standard 0) |
| Hilfe-Text Alphabet | RFC 4648 | RFC 3548 | (keine RFC-Zeile) | RFC 4648 |
RFC 4648 ersetzt RFC 3548. Das Standardalphabet in beiden Dokumenten ist A–Z, a–z, 0–9, +, /.
base64 -i file kodiert auf Linux, da -i dort ein Boolescher Wert ist und file der Positionaloperator ist. Der gleiche Befehl auf macOS kodiert ebenfalls, da -i file als Eingabepfad verbraucht. base64 -D -i file dekodiert auf macOS und bei uutils 0.10.0.
Base64url für JWT
JWT-Header- und Payload-Segmente verwenden base64url (RFC 4648 Abschnitt 5): - und _ ersetzen + und /, und das =-Füllzeichen wird normalerweise weggelassen. Standard base64 -d schlägt dann fehl. Bei uutils 0.10.0 ist der Fehler invalid input.
GNU basenc (und gnubasenc auf Ubuntu 26.04) akzeptiert die ungefüllte Form:
printf '%s' 'aGVsbG8_Ky93b3JsZA' | gnubasenc --base64url -d
# Ausgabe: hello?+/world
uutils 0.10.0 basenc --base64url -d erfordert, dass das Füllzeichen wiederhergestellt wird, bis eine Vielfache von 4 ist. Das gleiche Segment mit angehängtem == dekodiert. Kodieren und Füllzeichen entfernen für ein JWT-ähnliches Token:
printf '%s' 'hello?+/world' | basenc --base64url -w 0 | tr -d '='
# Ausgabe: aGVsbG8_Ky93b3JsZA
jq dekodiert JWT-Segmente mit @base64d, was der Pfad in JWT-Token dekodieren und anzeigen ist.
PowerShell kann das gleiche Alphabet aufbauen:
$b = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello?+/world"))
$b.TrimEnd("=").Replace("+","-").Replace("/","_")
Häufige Anwendungsfälle
| Anwendungsfall | Befehl / Ansatz |
|---|---|
| JWT-Header/Payload | base64url, oft ungefüllt. GNU basenc --base64url -d, oder jq @base64d |
| HTTP Basic Auth | printf '%s' 'user:pass' | base64 -w 0 → Authorization: Basic dXNlcjpwYXNz |
| Kubernetes-Secret aus einer Datei | kubectl create secret generic mysecret --from-file=key=file.bin |
| Kubernetes-Secret aus einer Zeichenfolge | kubectl create secret generic mysecret --from-literal=key=value |
| cURL Basic Auth | curl -u user:pass, oder -H "Authorization: Basic $(printf '%s' 'user:pass' | base64 -w 0)" |
| Data URI in HTML | data:image/png;base64,$(base64 -w 0 image.png) auf Linux |
kubectl create secret kodiert --from-literal- und --from-file-Werte selbst Base64. Wenn man den Wert mit base64 -w 0 präfixt, wie in --from-literal=key=$(base64 -w 0 file.bin), wird eine zweite Kodierung gespeichert, und ein späteres base64 -d liefert weiterhin Base64. Der Kubernetes-Spickzettel verwendet die Klartextform, --from-literal=username=admin.
In einem Manifest ist jeder data-Wert bereits eine Zeile Standard-Base64, und stringData enthält die rohe Zeichenfolge. Der API-Server fügt stringData in data ein. Kubernetes dokumentiert, dass stringData nicht gut mit server-side apply zusammenarbeitet. Das Objekt ist kodierter Text; etcd speichert es unverschlüsselt, sofern die Verschlüsselung in Ruhe nicht aktiviert ist.
curl -u schreibt den Authorization: Basic-Header. Das Bauen dieses Headers aus user:pass wird im cURL-Spickzettel behandelt.
Wenn das Dekodieren fehlschlägt
base64 --version ist der Check, wenn -D oder -w sich unerwartet verhält. Die GNU-Zeile und die uutils-Zeile sind unterschiedlich, und -D auf Linux entspricht der uutils-Zeile.
Ein dekodierter Wert, der mit einer leeren Zeile endet, enthält einen Zeilenumbruch von echo. Kodieren Sie diese Eingabe mit printf '%s' neu.
base64 file | wc -l gibt aus, wie viele umgebrochene Zeilen der Encoder ausgegeben hat. Eine Anzahl größer als 1 auf Linux bedeutet, dass der Befehl ohne -w 0 ausgeführt wurde.
invalid input bei Text, der - oder _ enthält, ist ein base64url-Alphabet, typisch für ein JWT-Segment. Dekodieren Sie es mit basenc --base64url, und bei uutils 0.10.0 = anhängen, bis die Länge eine Vielfache von 4 ist.