Scheda di riferimento per la codifica e decodifica Base64: esempi di comandi su Windows, Linux e Mac

Codifica e decodifica Base64 su Windows, Linux e Mac.

Indice

Questa scheda rapida mostra come codificare e decodificare in Base64 su Windows, Linux e macOS utilizzando certutil, PowerShell e base64, includendo le opzioni (flag) che variano in base al sistema.

Un uomo barbato sta eseguendo avanzate operazioni di programmazione di notte

Questa guida fa parte di Strumenti per Sviluppatori: La Guida Completa ai Flussi di Lavoro Moderni. Base64 mappa ogni tre byte di input a quattro caratteri tratti da A–Z, a–z, 0–9, + e /. Per la decodifica non è necessaria una chiave: l’alfabeto e il carattere di riempimento = sono sufficienti per recuperare i byte originali.

Su Linux, base64 interrompe la riga ogni 76 caratteri a meno che non venga impostato -w 0; su macOS, base64 scrive una riga singola a meno che -b non imposti un’interruzione; su Windows, certutil -encode aggiunge intestazioni di certificato attorno alle righe interrotte. I comandi Linux riportati di seguito sono stati eseguiti con GNU coreutils 9.7, uutils coreutils 0.10.0, BusyBox 1.37.0 e OpenSSL 3.5.5. I comandi macOS utilizzano le opzioni -i, -D e -b documentate per quel binario da OS X 10.7 in poi.

Codifica e Decodifica Base64 su Windows

Windows non include un comando base64. Certutil e PowerShell sono integrati nel sistema.

Utilizzo del Prompt dei Comandi con Certutil

  1. Apri il Prompt dei Comandi.

  2. Codifica un file in Base64:

    certutil -encode input.bin output.b64
    

    Sostituisci input.bin con il percorso del tuo file e output.b64 con il nome del file di output desiderato. Il file inizia con -----BEGIN CERTIFICATE-----, seguito dal testo Base64 interrotto a capo, e termina con -----END CERTIFICATE-----.

  3. Rimuovi le righe di intestazione e stampa il corpo:

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

    findstr /v /c:- rimuove ogni riga che contiene -, eliminando così le due intestazioni. Il corpo rimane interrotto a capo. PowerShell [Convert]::ToBase64String è il risultato in una riga singola.

Decodifica Base64 su Windows (Certutil)

certutil -decode encoded.b64 decoded.bin

certutil -decode accetta il file con intestazione scritto da -encode. Accetta anche un file Base64 grezzo.

Utilizzo di PowerShell per Codifica e Decodifica

PowerShell [Convert]::ToBase64String scrive una riga singola e non aggiunge intestazioni. Per ulteriori automazioni di shell, consulta la Scheda Rapida PowerShell.

Codifica di un file:

[Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\file.bin"))

Codifica di una stringa (UTF-8):

[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("Hello, World!"))
# Output: SGVsbG8sIFdvcmxkIQ==

Encoding.Unicode è UTF-16LE. Gli stessi caratteri vengono quindi codificati come SABlAGwAbABvACwAIABXAG8AcgBsAGQAIQA=. base64 su Linux per i byte UTF-8 produce SGVsbG8sIFdvcmxkIQ==.

Decodifica Base64 in stringa:

[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("SGVsbG8sIFdvcmxkIQ=="))
# Output: Hello, World!

Decodifica Base64 in file:

[System.IO.File]::WriteAllBytes("decoded.bin", [Convert]::FromBase64String((Get-Content encoded.b64 -Raw)))

FromBase64String accetta spazi, tabulazioni e nuovi caratteri di riga. Genera un errore sulle intestazioni BEGIN CERTIFICATE, quindi un file certutil deve passare attraverso certutil -decode (o le intestazioni devono essere rimosse prima).

Codifica e Decodifica Base64 su Linux

base64 --version indica il binario presente nel PATH. Una riga che inizia con base64 (GNU coreutils) indica GNU. Su Ubuntu 25.10 e 26.04, /usr/bin/base64 è uutils da rust-coreutils; il pacchetto 26.04 verificato qui era uutils coreutils 0.10.0. GNU coreutils 9.7 è gnubase64 dal pacchetto gnu-coreutils.

Entrambi accettano un file come argomento posizionale, -d / --decode, -i / --ignore-garbage e -w / --wrap. Il wrapping predefinito è 76. -w 0 lo disabilita. uutils 0.10.0 tratta -D come un alias di -d. GNU coreutils 9.7 esce con invalid option -- 'D' su -D.

L’uso di pipe e citazioni per questi comandi in una riga è coperto nella Scheda Rapida Bash.

Codifica di un File in Base64

base64 input_file > output_file

Esempio:

base64 myfile.txt > encoded.txt

Per stampare il contenuto codificato nel terminale:

base64 myfile.txt

Codifica di una Stringa in Base64

printf '%s' 'Hello, World!' | base64 -w 0
# Output: SGVsbG8sIFdvcmxkIQ==

printf '%s' scrive i byte forniti e si ferma. echo senza -n aggiunge un carattere di nuova riga, quindi lo stesso testo viene codificato come SGVsbG8sIFdvcmxkIQo=. In bash, echo -n "Hello, World!" | base64 -w 0 corrisponde alla riga printf. echo -n non è portabile su tutte le versioni di sh.

Disattivazione dell’Interruzione di Riga (-w 0)

GNU e uutils interrompono la riga a 76 caratteri, incluso quando lo stdout è un file o una pipe. JSON, variabili di ambiente, URL e un valore data di Kubernetes richiedono una riga singola. base64encode() di Terraform restituisce una riga di Base64 standard, quindi l’output della riga di comando confrontato con questo deve essere prodotto con wrapping disattivato:

base64 -w 0 input_file > output_file

Decodifica Base64 su Linux

base64 -d encoded_file > decoded_file
# oppure
base64 --decode encoded_file > decoded_file

Esempio:

printf '%s' 'SGVsbG8sIFdvcmxkIQ==' | base64 -d
# Output: Hello, World!

GNU coreutils dalla 9.5 in poi, e uutils 0.10.0, decodificano il Base64 standard che omette il riempimento =. printf '%s' 'SGVsbG8' | base64 -d stampa Hello. I codificatori emettono comunque il riempimento. Versioni più vecchie di GNU base64 rifiutavano input senza riempimento.

-i / --ignore-garbage ignora i caratteri fuori dall’alfabeto durante la decodifica. I nuovi caratteri di riga sono già consentiti. Gli spazi non lo sono, a meno che non sia impostato -i:

printf '%s' 'SGVs bG8=' | base64 -di
# Output: Hello

Su GNU e uutils, -i non accetta un nome file. base64 -i input_file codifica input_file perché il nome è un argomento posizionale e -i cambia solo la decodifica. Su macOS, -i è l’opzione per il file di input.

OpenSSL

OpenSSL 3.5.5 interrompe a 64 caratteri. -A mantiene l’output su una riga singola:

printf '%s' 'data' | openssl base64 -e -A
# Output: ZGF0YQ==
printf '%s' 'ZGF0YQ==' | openssl base64 -d -A
# Output: data

Senza -A, un buffer lungo viene interrotto ogni 64 caratteri, che è una larghezza diversa da quella di GNU base64.

BusyBox

BusyBox 1.37.0 accetta -d e -w COL (predefinito 76, 0 disattiva il wrapping). --decode fallisce con unrecognized option '--decode', e -D fallisce con invalid option -- 'D'. La decodifica ignora già i caratteri fuori dall’alfabeto: printf '%s' 'SGVs!bG8=' | busybox base64 -d stampa Hello. -i è accettato ma non appare nella riga di aiuto.

Codifica e Decodifica Base64 su macOS

macOS include un base64 BSD. Un nome file viene passato con -i. La ridirezione da stdin funziona senza -i: base64 < input_file.

Codifica di un File in Base64

base64 -i input_file > output_file

Esempio:

base64 -i myfile.txt > encoded.txt

Per stampare nel terminale:

base64 -i myfile.txt

L’intervallo di interruzione predefinito è 0, quindi il testo codificato è su una riga singola. -b count inserisce una nuova riga ogni count caratteri. base64 -w 0 è l’opzione Linux; il binario macOS non la usa. base64 -b 0 -i input_file è la forma esplicita per una riga singola.

Codifica e Copia negli Appunti

base64 -i input_file | pbcopy

Decodifica Base64 su Mac

base64 -D -i encoded_file > decoded_file

-D è per la decodifica. Queste opzioni -i e -D sono l’interfaccia di macOS da OS X 10.7 in poi. Uno script Linux che chiama base64 -d dovrebbe chiamare base64 -D su macOS.

Opzioni per Implementazione

Opzione GNU coreutils 9.7 uutils 0.10.0 BusyBox 1.37.0 macOS
-d / --decode Decodifica Decodifica (-D è un alias) Solo -d; --decode dà errore Usa -D
-i --ignore-garbage durante la decodifica --ignore-garbage durante la decodifica Accettata, non elencata in --help; i byte non alfabetici sono già saltati File di input
-w N Interruzione a N colonne (predefinito 76); 0 disattiva Stesso predefinito e 0 Stesso; nessuna opzione lunga Non questa opzione; usa -b
-b N Non accettata Non accettata Non accettata Nuova riga ogni N caratteri (predefinito 0)
Alfabeto nel testo di aiuto RFC 4648 RFC 3548 (nessuna riga RFC) RFC 4648

RFC 4648 sostituisce RFC 3548. L’alfabeto standard in entrambi i documenti è A–Z, a–z, 0–9, +, /.

base64 -i file codifica su Linux, perché -i è un booleano lì e file è l’operando posizionale. Lo stesso comando su macOS codifica anche, perché -i consuma file come percorso di input. base64 -D -i file decodifica su macOS e su uutils 0.10.0.

Base64url per JWT

Le segmenti header e payload di JWT usano base64url (sezione 5 di RFC 4648): - e _ sostituiscono + e /, e il riempimento = viene spesso omesso. base64 -d standard fallisce quindi. Su uutils 0.10.0 l’errore è invalid input.

GNU basenc (e gnubasenc su Ubuntu 26.04) accetta la forma senza riempimento:

printf '%s' 'aGVsbG8_Ky93b3JsZA' | gnubasenc --base64url -d
# Output: hello?+/world

basenc --base64url -d di uutils 0.10.0 richiede che il riempimento sia ripristinato a un multiplo di 4. Lo stesso segmento con == aggiunto alla fine viene decodificato. Codifica e rimuovi il riempimento per un token in stile JWT:

printf '%s' 'hello?+/world' | basenc --base64url -w 0 | tr -d '='
# Output: aGVsbG8_Ky93b3JsZA

jq decodifica i segmenti JWT con @base64d, che è il percorso in Decodifica e stampa token JWT.

PowerShell può costruire lo stesso alfabeto:

$b = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello?+/world"))
$b.TrimEnd("=").Replace("+","-").Replace("/","_")

Casi d’Uso Comuni

Caso d’uso Comando / approccio
Header/Payload JWT base64url, spesso senza riempimento. GNU basenc --base64url -d, o jq @base64d
Autenticazione Basic HTTP printf '%s' 'user:pass' | base64 -w 0 → Authorization: Basic dXNlcjpwYXNz
Secret Kubernetes da file kubectl create secret generic mysecret --from-file=key=file.bin
Secret Kubernetes da stringa kubectl create secret generic mysecret --from-literal=key=value
Autenticazione Basic cURL curl -u user:pass, o -H "Authorization: Basic $(printf '%s' 'user:pass' | base64 -w 0)"
Data URI in HTML data:image/png;base64,$(base64 -w 0 image.png) su Linux

kubectl create secret esegue la codifica base64 dei valori --from-literal e --from-file da solo. Prefissando il valore con base64 -w 0, come in --from-literal=key=$(base64 -w 0 file.bin), si archivia una seconda codifica, e un successivo base64 -d restituisce comunque Base64. La Scheda Rapida Kubernetes usa la forma in testo normale, --from-literal=username=admin.

In un manifest, ogni valore data è già una riga di Base64 standard, e stringData contiene la stringa grezza. Il server API unisce stringData in data. Kubernetes documenta che stringData non funziona bene con server-side apply. L’oggetto è testo codificato; etcd lo memorizza non cifrato a meno che la crittografia a riposo non sia attivata.

curl -u scrive l’intestazione Authorization: Basic. La creazione di tale intestazione da user:pass è coperta nella Scheda Rapida cURL.

Quando la Decodifica Fallisce

base64 --version è il controllo quando -D o -w si comportano in modo anomalo. La riga GNU e la riga uutils sono diverse, e -D su Linux corrisponde alla riga uutils.

Un valore decodificato che termina con una riga vuota include un carattere di nuova riga da echo. Ricodifica quell’input con printf '%s'.

base64 file | wc -l stampa quante righe interrotte il codificatore ha emesso. Un conteggio superiore a 1 su Linux significa che il comando è stato eseguito senza -w 0.

invalid input su testo che contiene - o _ indica un alfabeto base64url, tipico di un segmento JWT. Decodificalo con basenc --base64url e, su uutils 0.10.0, aggiungi = finché la lunghezza non è un multiplo di 4.

Iscriviti

Ricevi nuovi articoli su sistemi, infrastruttura e ingegneria AI.