Base64-Kodierung- und Dekodierungs-Schnellreferenz: Befehlsbeispiele für Windows, Linux und Mac

Base64 auf Windows, Linux und Mac kodieren und dekodieren.

Inhaltsverzeichnis

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.

Bärtiger Mann führt nachts einige fortgeschrittene Codierung durch

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

  1. Öffnen Sie die Eingabeaufforderung.

  2. Kodieren Sie eine Datei in Base64:

    certutil -encode input.bin output.b64
    

    Ersetzen Sie input.bin durch Ihren Dateipfad und output.b64 durch den gewünschten Ausgabedateinamen. Die Datei beginnt mit -----BEGIN CERTIFICATE-----, gefolgt von umgebrochenem Base64, und endet mit -----END CERTIFICATE-----.

  3. Entfernen Sie die Banner-Zeilen und geben Sie den Inhalt aus:

    certutil -encode input.bin tmp.b64 && findstr /v /c:- tmp.b64 && del tmp.b64
    

    findstr /v /c:- entfernt jede Zeile, die ein - enthält, was die zwei Banner entfernt. Der Inhalt bleibt umgebrochen. PowerShell [Convert]::ToBase64String ist 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.

Abonnieren

Neue Beiträge zu Systemen, Infrastruktur und KI-Engineering.