Codificare in Base64

Scrivi o incolla qualcosa e la codifica Base64 compare mentre digiti. Il Base64 esiste per far passare dei byte attraverso canali che accettano solo pochi caratteri — per questo lo trovi nelle data URI, negli allegati di posta e nelle intestazioni Authorization, e non dove una persona debba leggerlo. Niente di quello che scrivi viene caricato: la codifica avviene in questa pagina.

Quello sicuro per URL sostituisce + e / con - e _, che una query string accetta senza doverli proteggere.

Risultato

La risposta compare qui mentre scrivi.

  • Dove gira

    Non viene caricato nulla, perché non c’è nessun file: il calcolo avviene in questa pagina.

  • Nessuna coda, nessun account

    Risponde alla velocità della tua macchina e non chiede mai chi sei.

  • Tutte le volte che vuoi

    Non si conta né si limita nulla: rispondere di nuovo non ci costa niente.

Come funziona

  1. Incolla il testo nel campo.
  2. Scegli l’alfabeto: quello standard, oppure quello sicuro per URL se il valore finisce dentro un indirizzo.
  3. Copia il risultato. Non è uscito dalla tua macchina.

Cosa fa davvero il Base64

Il Base64 non cifra e non comprime: riscrive dei byte usando solo 64 caratteri che sopravvivono a quasi qualunque trasporto. Prende tre byte, li guarda come 24 bit e li ritaglia in quattro pezzi da sei, e ogni pezzo diventa un carattere della tabella.

Da lì viene il suo costo: il risultato occupa sempre un terzo in più dell’originale. È il prezzo per attraversare un canale che capisce solo testo, ed è il motivo per cui un allegato di posta pesa più del file che contiene — la posta, sotto sotto, è ancora un protocollo di testo.

I due alfabeti, e quando serve il secondo

L’alfabeto standard usa `+` e `/` per gli ultimi due caratteri. Tutti e due hanno un significato dentro una URL: la barra separa i segmenti di percorso e il più viene letto come spazio in una query string. Un valore in Base64 standard infilato in un indirizzo arriva quindi cambiato.

La variante sicura per URL sostituisce quei due con `-` e `_`, che non significano niente in nessun punto di un indirizzo. È quella che usano i JWT, ed è il motivo per cui un token copiato da un’intestazione non contiene né barre né segni più. Se il valore deve viaggiare in una URL, l’opzione è quella; altrimenti lo standard è ciò che tutto il resto si aspetta.

Il segno di uguale in fondo

Il Base64 lavora tre byte alla volta. Quando l’input non è un multiplo di tre ne avanzano uno o due, e il riempimento viene segnalato con uno o due segni di uguale in fondo. È per questo che un risultato finisce con `=`, con `==` o con niente, e per questo la sua lunghezza è sempre un multiplo di quattro.

Quel padding è facoltativo in alcune specifiche e obbligatorio in altre, il che produce un malinteso ricorrente: i JWT lo omettono di proposito, mentre parecchie librerie si rifiutano di decodificare senza. Se qualcosa rifiuta un valore che sembra corretto, il numero di caratteri è la prima cosa da guardare.

Le lettere accentate valgono due byte

Il Base64 codifica byte, non caratteri, quindi prima bisogna decidere come il testo diventa byte. Qui è sempre UTF-8, dove una `à` sono due byte — `c3 a0` — e così una `è` e una `ù`; un emoji ne vale quattro. La stringa Base64 è di conseguenza più lunga di quanto sarebbe se il testo fosse solo ASCII.

Lì sta l’errore più comune quando si confronta con un altro strumento: se dall’altra parte hanno usato Latin-1, la `à` era un byte invece di due e i risultati non coincidono. Non è un difetto di nessuno dei due codificatori — stavano codificando testi diversi, e il disaccordo è uno strato più in basso.

Basic Auth non è sicurezza

L’intestazione `Authorization: Basic` è esattamente `utente:password` in Base64, e nient’altro. Chiunque veda quell’intestazione la disfa in un secondo, perché non c’è nessuna chiave: è una codifica, non una cifratura.

Quelle credenziali le protegge HTTPS e solo HTTPS. Per questo Basic Auth su HTTP in chiaro equivale a mandare la password in chiaro, e per questo un’intestazione del genere dentro uno screenshot, un ticket o un log è una credenziale esposta. Che sembri illeggibile non cambia niente.

Le data URI e il loro limite pratico

Un’immagine in Base64 dentro un `src` risparmia una richiesta, ed è ragionevole per un’icona piccola o per un SVG di pochi kilobyte. Da lì in poi smette di convenire: il file cresce di un terzo, viene incorporato nell’HTML e quindi non si mette in cache per conto suo, e il browser deve analizzarlo prima di disegnare qualsiasi cosa.

Il punto in cui il segno si inverte dipende dalla pagina, ma la regola spannometrica tiene: sotto qualche kilobyte la data URI quasi sempre vince, sopra qualche decina quasi sempre perde. Un’immagine grande incorporata trasforma ogni visita in uno scaricamento completo dell’HTML gonfiato.

Perché non è un modo per nascondere niente

Compare con una certa regolarità come modo per «nascondere» una chiave nel codice di un’app, in un file di configurazione o in uno script. Non nasconde niente: tornare indietro è un bottone, e gli strumenti che cercano segreti finiti nei repository riconoscono le stringhe Base64 proprio perché sono un pattern facilissimo da individuare.

Quello che fa davvero è togliere il campanello d’allarme a chi guarda di sfuggita, ed è quello il problema: un segreto in chiaro si vede e si corregge, uno in Base64 passa una revisione. Se qualcosa deve restare nascosto serve una cifratura con una chiave che stia altrove, oppure non metterlo lì.

Gli a capo che non ti servono

Certe specifiche vogliono il Base64 spezzato: MIME manda a capo ogni 76 caratteri, i blocchi PEM ogni 64. Quegli a capo fanno parte del formato che li richiede e non del valore, e questa pagina non li mette perché quello che si incolla in un campo di solito va in un’intestazione, in un JSON o in una variabile d’ambiente, dove una riga sola è l’unica forma che funziona.

Nell’altro verso vale la regola opposta: un decodificatore serio ignora gli spazi bianchi, perché un PEM copiato da un terminale arriva per forza spezzato. Se qualcosa rifiuta un valore che a occhio è giusto, prova prima a togliere gli a capo — è il caso più frequente e il più facile da escludere.

Codificare non verifica niente

Il Base64 non aggiunge nessun controllo: non c’è checksum, non c’è lunghezza dichiarata, non c’è modo di accorgersi che manca un pezzo. Una stringa troncata resta Base64 valido finché la lunghezza torna, e decodifica in byte che finiscono a metà parola senza che nessuno protesti.

È per questo che, quando si sposta un valore importante, la verifica va messa accanto e non dentro: un hash del contenuto, oppure il confronto della lunghezza in byte prima e dopo. Chi si aspetta che il Base64 «se ne accorga» ha in mano un formato di trasporto e lo sta usando come se fosse un formato di archiviazione.

Il GDPR e quello che scrivi in questo campo

Quello che digiti qui non lascia il dispositivo, quindi non c’è nessuna comunicazione di dati verso di noi. È il punto che conta quando nel campo finisce una password, un token o un payload con dentro il nome di un cliente: non serve un accordo di trattamento per qualcosa che non ci è mai arrivato.

Quello che rimane visibile è il resto del sito, e sta scritto nell’informativa: la visita, le richieste di pubblicità e, se acconsenti, di statistica. Distinguere le due cose è la parte onesta della faccenda — il contenuto del campo non si muove mai, il fatto che tu sia su questa pagina invece sì.

Perché questa pagina non decodifica anche

Codificare e decodificare sembrano lo stesso problema visto da due lati e non lo sono. Chi codifica sta costruendo qualcosa e ha una sola domanda: quale alfabeto. Chi decodifica ha in mano qualcosa di rotto e ne ha cinque, tutte diverse, e nessuna riguarda l’alfabeto.

Una pagina sola con un selettore risponderebbe male a entrambi, perché metà del testo sarebbe sempre fuori tema. La pagina per decodificare è a un clic da qui e parla dei suoi problemi: il padding mancante, i byte che non sono testo, i JWT. Questa parla dei tuoi.

Codificare in Base64: domande frequenti

Il Base64 cifra il mio testo?

No, e considerarlo una protezione è un errore diffuso e reale. Non c’è nessuna chiave e non c’è niente di nascosto: chi ha il risultato lo ridecodifica in un secondo, per costruzione, perché chi lo riceve deve poterlo fare. Se ti serve segretezza ti serve una cifratura, che è un’altra cosa.

Quando mi serve l’alfabeto sicuro per URL?

Quando il valore finisce dentro un indirizzo: in un percorso, in un parametro di query o in un JWT. L’alfabeto standard usa + e /, che in una URL significano già qualcos’altro — il più viene letto come spazio e la barra separa i segmenti — quindi il valore arriva dall’altra parte modificato senza che nessuno segnali niente.

Perché il risultato finisce con uno o due segni di uguale?

È il padding. L’algoritmo lavora a gruppi di tre byte, quindi se la lunghezza non è un multiplo di tre l’ultimo gruppo è incompleto e viene riempito fino a quattro caratteri con `=`. Un uguale vuol dire che avanzavano due byte, due uguali che ne avanzava uno. La variante sicura per URL li omette.

Perché il mio risultato non coincide con quello di un altro strumento?

Quasi sempre perché il testo è stato trasformato in byte in due modi diversi. Qui è sempre UTF-8, dove una à vale due byte; uno strumento che usa Latin-1 ne produce uno solo e da lì in poi la stringa diverge. L’altra causa frequente è un a capo finale presente da una parte e non dall’altra.

Quello che scrivo viene caricato?

No. La codifica avviene in questa pagina, sulla tua macchina, e lo si verifica nel pannello di rete: mentre digiti non parte niente. Qui conta più che altrove, perché le stringhe che si codificano in Base64 sono regolarmente password e token.

Altri strumenti