La prima versione del convertitore Base64 che ho spedito su Toolz.dev aveva un bug I & #39; sono ancora leggermente imbarazzato Ha funzionato perfettamente in ogni test che ho scritto - codificato, decodificato, round-tripped, fatto Poi qualcuno ha incollato il testo contenente un'emoji e ha ottenuto questo:
Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.
Ho creato uno strumento di codifica di testo e dimenticato che il testo include, sai, la maggior parte del testo. Ogni scrittura non latina, ogni carattere accentato, ogni emoji - rotto I miei test erano tutti ASCII perché penso in ASCII. Quel bug mi ha insegnato di più su Base64 di qualsiasi lettura di specifiche, e I & #39; ti mostrerà la correzione più tardi perché fa inciampare quasi tutti coloro che toccano btoa().
Base64 è una di quelle cose che gli sviluppatori usano quotidianamente - all'interno di ogni JWT, ogni allegato di posta elettronica, ogni data: URI - mentre raramente guarda sotto il cofano Let's guardare sotto il cofano.
tl; dr: La codifica Base64 converte i dati binari in 64 caratteri ASCII sicuri in modo che possa viaggiare attraverso canali di solo testo come JSON, URL ed e-mail, al costo di un sovraccarico di dimensioni pari a circa il 33%. È no Crittografia; chiunque può invertirla istantaneamente. Per codificare o decodificare in questo momento, utilizza il lato client gratuito convertitore base64 su Toolz.dev: i tuoi dati non lasciano mai il browser, il che conta quando tu' decodifica i token.
Che cos'è la codifica Base64?
Base64 è uno schema di codifica da binario a testo: rappresenta byte arbitrari che utilizzano solo 64 caratteri che sopravvivono a ogni sistema di testo mai costruito. La specifica autorevole è RFC 4648 (2006), sebbene la codifica risalga alla RFC 1421 e alla Privacy Enhanced Mail nel 1993, Base64 è più vecchio del browser web.
L'alfabeto:
A–Z→ Valori 0–25a–z→ Valori 26–510–9→ Valori 52–61+→ 62,/→ 63=→ Imbottitura (non un valore, solo riempitivo)
Perché questi 64? Perché sopravvivono a Singled in ASCII, EBCDIC e ogni gateway di posta elettronica mai costruito. Base64 è un trattato di pace con decenni di infrastrutture di solo testo.
Il costo del trattato: ogni 3 byte di input diventano 4 caratteri di output - una tassa fissa del 33% sulle dimensioni Tieni quel numero nella tua testa; decide le vere domande di architettura.
Come funziona l'algoritmo Base64?
Risposta più breve di te' d aspettarti: raggruppa i bit da 8s in 6s, quindi cercali in una tabella. 26 = 64 - that's da dove viene il nome.
codifica Hi!:
Passo 1 - byte a bit.
| carattere | ASCII | binario |
|---|---|---|
| h | 72 | 01001000 |
| io | 105 | 01101001 |
| ! | 33 | 00100001 |
concatenato: 010010000110100100100001- 24 bit.
Passaggio 2: riorganizzarsi in blocchi a 6 bit.
010010 | 000110 | 100100 | 100001
18 | 6 | 36 | 33
Passaggio 3: cerca ciascun valore nell'alfabeto.
18 → S, 6 → G, 36 → k, 33 → h. di sì Hi! codifica per SGkh.
Questo è l'intero algoritmo. Nessuna matematica oltre a una tabella di ricerca.
imbottitura Gestisce input che non sono multipli di 3 byte. codificare solo Hi (2 byte = 16 bit) e puoi riempire solo gruppi a 6 bit a due e un bit; l'encoder zero-pad i bit e le append = Per segnalare quanto costa il riempimento:
Hi → SGk= (2 bytes remaining → one '=')
H → SA== (1 byte remaining → two '==')
Hi! → SGkh (multiple of 3 → no padding)
Quando ho implementato questo per il convertitore Toolz.dev, il riempimento era il luogo in cui vivevano tutti i miei bug off-by-one Se mai si tirasse a mano Base64 - per un'intervista di codifica, diciamo - si scrivano prima i test di riempimento.
La decodifica è l'immagine speculare: i caratteri tornano ai valori a 6 bit, raggruppati in byte a 8 bit, rilasciano il riempimento.

Dove ti imbatti effettivamente in Base64?
JWT - quello grande
Ogni token Web JSON è composto da tre segmenti codificati per Base64URL uniti da punti: intestazione, carico utile, firma. L'autenticazione del debug è il 50% che decodifica questi.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
decodifica il primo segmento e ottieni {"alg":"HS256","typ":"JWT"}. Il secondo ti dà le affermazioni. Il mio flusso di lavoro Quando un token si comporta male: dividere i punti, decodificare ogni parte nel convertitore base64, quindi incolla il JSON nel Formattatore JSON per leggerlo bene. due paste, e tu sai se il exp Il reclamo è il tuo problema.
Vale la pena dire chiaramente: i payload JWT sono leggibile da chiunque abbia il token. La firma smette di manomettere, non di leggere. Ho esaminato le basi di codice che hanno inserito dati sensibili nelle affermazioni perché le parole incomprensibili sembrano implicite sulla privacy. non lo fa.

URI dei dati
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Incorporamento di piccole risorse in linea salva una richiesta HTTP. La mia regola pratica dalla creazione di un'interfaccia utente di amministrazione di WordPress pesante: vale la pena sotto ~ 5 KB, oltre 10 KB, stai gonfiando il documento del 33% per salvare una richiesta di multiplex HTTP/2 comunque.
Kubernetes Segreti - e uno sfogo
apiVersion: v1
kind: Secret
data:
password: cGFzc3dvcmQ= # decodes to "password"
I segreti di Kubernetes sono codificati in Base64 e la falsa sicurezza che ciò implica è allarmante Quel valore decodifica in una pasta Base64 qui esiste così i valori binari sopravvivono a YAML - a formattazione decisione, non di sicurezza. Se la tua storia di segreti finisce a "si trovano in base64 in etcd, non è iniziata.
il resto della lista
Intestazioni di autenticazione di base HTTP (Authorization: Basic dXNlcjpwYXNz decodifica in chiaro user:pass- quindi solo HTTPS). Allegati e-mail tramite MIME. Blob binari all'interno dei payload JSON, perché JSON non ha alcun tipo binario.
è la crittografia Base64? (No. Per favore, no.)
vale la propria sezione perché l'idea sbagliata si rifiuta di morire.
Base64 è un rappresentanza, come scrivere un numero in esadecimale. Nessuna chiave. Nessun segreto. La decodifica non richiede altro che la tabella dell'alfabeto stampata pubblicamente in RFC 4648. Qualsiasi cosa Base64-"protetta" è protetta nel modo in cui una lettera è protetta da essere scritta in corsivo.
Se i dati necessitano di riservatezza: Crittografare correttamente (AES-GCM o Libsodium), poi Base64-codificare il testo cifrato se il canale ha bisogno di testo Codifica e crittografia comporre fine - sono solo & #39; t sostituti. E se hai bisogno di integrità piuttosto che segretezza, che & #39;s un hash's lavoro - il Generatore di hash Copre SHA-256 e amici.
Come si confronta Base64 con Hex, codifica URL e Base85?
| base64 | esagono (base16) | Codifica URL/percentuale | ASCII85 | |
|---|---|---|---|---|
| Taglia sopraelevata | +33% | +100% | 0–200%, dipendente dal contenuto | +25% |
| alfabeto | 64 caratteri | 16 caratteri | ASCII + %XX fuoriuscire |
85 caratteri |
| Uscita leggibile dall'uomo | no | Una sorta di confini di byte visibili | Per lo più, per input ASCII | no |
| URL-safe per impostazione predefinita | no (+, /, =) |
certo | Sì, per definizione | no |
| Lo incontrerai | JWTS, Mime, URI dei dati | Hash, indirizzi MAC, codici colore | stringhe di query | interni pdf |
Come scelgo: stregato quando gli esseri umani leggeranno o confronteranno l'output: checksum, digest, qualsiasi cosa sottoposta a debug da parte del bulbo oculare. codificazione percentuale Per il testo URL, mai binario. base64 per l'attraversamento binario di un canale di testo - la maggior parte dei casi reali. ASCII85 Mai volontariamente, il risparmio dell'8% deve ancora giustificare le domande di compatibilità.
Che cos'è Base64 sicuro per URL e perché esiste?
Standard Base64 ha un problema: + significa "spazio" nelle stringhe di query, / è il separatore di percorso, = delimita i parametri Metti un token standard-Base64 in un URL e qualche middleware, da qualche parte, lo mangerà - in modo intermittente, e solo in produzione Chiedimi come faccio a saperlo.
RFC 4648 La sezione 5 definisce la correzione, solitamente chiamata Base64URL:
| vessillo | Sicuro per gli URL |
|---|---|
+ |
- |
/ |
_ |
= imbottitura |
di solito appena omesso |
Stesso algoritmo, due caratteri scambiati, riempimento eliminato. I JWT utilizzano esclusivamente Base64URL, motivo esatto per cui incollare un segmento JWT in un rigoroso decodificatore standard Base64 a volte fallisce in modo vagante - oppure _. la Convertitore Toolz.dev Gestisce entrambe le varianti, perché un decoder che rifiuta metà della base del mondo reale64 non è un decoder.
Regola pratica: se la stringa codificata toccherà mai un URL, un nome file o un'intestazione HTTP, utilizza la variante URL-safe dall'inizio. Il retrofit è un ritrovamento e una sostituzione più una preghiera.
Come si codifica e si decodifica nel codice?
JavaScript - la trappola in cui sono caduto
Ecco la versione ingenua, quella che ho spedito:
btoa('Hello') // "SGVsbG8=" — great!
btoa('café ☕') // InvalidCharacterError — the bug from my intro
btoa Precede la moderna gestione Unicode e accetta solo latino-1. L'approccio moderno corretto passa esplicitamente attraverso byte UTF-8:
// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes)); // "Y2Fmw6kg4piV"
// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"
(In Node.js, salta la cerimonia: Buffer.from(str, 'utf8').toString('base64').)
pitone
import base64
encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')
# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')
Python rende ovvia la cosa giusta: tu muffa Passa i byte, in modo che il passaggio encode-to-utf-8 non possa essere dimenticato. io desidero btoa era stato progettato con la stessa spina dorsale.
php
$encoded = base64_encode('café ☕'); // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);
// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');
la quale strtr/rtrim La linea è apparsa in ogni base di codice PHP su cui ho mai lavorato, incluso WP Adminify. PHP non ha mai ottenuto una variante integrata per URL-safe, quindi continuiamo a scrivere le stesse due righe.
Domande frequenti
A cosa serve la codifica Base64?
Converte i dati binari in testo ASCII in modo che possa passare attraverso sistemi che gestiscono solo testo: payload JSON, URL, e-mail (MIME), intestazioni HTTP. lo incontri più spesso in token JWT, data: URI per immagini in linea, segreti di Kubernetes e payload API che trasportano file. È un formato di trasporto, non un formato di archiviazione o di sicurezza.
Base64 è uguale alla crittografia?
No, e confondere i due causa incidenti di sicurezza reali Base64 non ha chiave - la decodifica richiede solo la tabella alfabetica pubblica, e prende una pasta in qualsiasi decodificatore. Crittografa prima con un vero algoritmo (AES-GCM), quindi codifica il testo cifrato se il canale ha bisogno di testo.
Perché Base64 rende i dati più grandi del 33%?
Ogni carattere Base64 trasporta 6 bit di informazioni ma occupa un byte completo a 8 bit, quindi 3 byte di input diventano sempre 4 caratteri di output - 4/3 ≈ 1.33. It's un costo fisso del formato, inevitabile dal design Se le dimensioni contano, comprimere prima della codifica, mai dopo - l'output codificato sembra casuale e si comprime terribilmente.
Qual è la differenza tra Base64 e Base64URL?
Scambio di URL Base64 + per - e / per _, e di solito lascia cadere il = riempimento, in modo che l'output sopravviva a URL, nomi di file e intestazioni senza sfuggire Stesso algoritmo altrimenti, definito nella sezione 5 della RFC 4648. JWT utilizzano esclusivamente Base64URL - motivo per cui i decoder standard-Base64 rigorosi a volte soffocano su di essi.
Perché btoa() lancia InvalidCharacterError?
La tua stringa contiene caratteri al di fuori di Latin-1 - un'emoji, un carattere accentato, qualsiasi scrittura non occidentale. btoa è un'API degli anni '90 che precede la gestione sensata di Unicode. codificare prima in byte UTF-8 con TextEncoder, quindi Base64 i byte; ho spedito questo bug esatto in uno strumento di produzione, quindi nessun giudizio.
Come posso sapere se una stringa è Base64?
Solo utilizza Base64 valido A–Z, a–z, 0–9, +, / (o -, _ per URL-safe), trailing opzionale =, con una lunghezza che' è un multiplo di 4 quando imbottito Ma anche molte parole ordinarie corrispondono a quello schema - cafe è valido Base64 che decodifica in byte di spazzatura. Il vero test è decodificarlo e verificare se l'output è significativo.
Perché la mia stringa Base64 ha una nuova linea randagio alla fine?
perché echo ne aggiunge uno prima base64 mai vederlo, quindi echo "hunter2" | base64 Codifica otto byte, non sette. printf oppure echo -n invece. Questa è la causa numero uno dei segreti di Kubernetes che sembrano proprio nel manifest e falliscono in fase di esecuzione: la password decodificata porta un trailing invisibile \n. la base64 comando avvolge anche l'output a 76 colonne su alcuni sistemi - passa -w 0 su GNU coreutils per sopprimerlo.
Come faccio a decodificare un token JWT a mano?
Dividi il token ai suoi due punti, prendi il primo segmento (intestazione) e il secondo (payload) ed esegui ciascuno attraverso a decodificatore Base64- loro're Base64URL, quindi usa uno strumento che accetti - e _. Quindi formatta il JSON risultante in a Formattatore JSON leggere le affermazioni. Non incollare mai i token di produzione in strumenti lato server, solo lato client.
Come faccio a codificare un'immagine o un file in Base64?
Leggi il file come byte, quindi Base64 quei byte e anteponi un'intestazione di dati-URI data:image/png;base64, Quindi un browser può renderlo in linea. In JavaScript, FileReader.readAsDataURL() fa entrambi i passaggi per te; sulla riga di comando, base64 logo.png stampa la codifica grezza Tienila su piccole risorse: la tassa sulle dimensioni del 33% rende Base64 una soluzione inadeguata per qualsiasi cosa di grandi dimensioni e gli URI dei big data gonfiano il tuo HTML o CSS.
Come faccio a decodificare Base64 in JavaScript, Python o Terminal?
In JavaScript moderno, decodifica Unicode in modo sicuro con new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) piuttosto che nudo atob. In Pitone, base64.b64decode(str) restituisce byte - chiama .decode('utf-8') per il testo. In un terminale, echo "aGk=" | base64 -d (o --decode). Tutti e tre si aspettano la base standard64, quindi traduci -/_ Torna a +// Innanzitutto se stai gestendo una stringa di base64URL.
il takeaway
Base64 è un trucco di 30 anni di bit-shuffling che tiene tranquillamente metà del web moderno - token di autenticazione, allegati, risorse in linea, segreti-that-aren' t-secret Comprendere il raggruppamento a 6 bit, rispettare la tassa del 33%, non scambiarlo mai per crittografia e raggiungere la variante sicura per URL ovunque sia coinvolto un URL That's 95% della pratica padronanza di Base64.
Per la parte pratica, il Convertitore Base64 su Toolz.dev la codifica standard e sicura per gli URL è interamente nel tuo browser, creata da qualcuno che ha imparato la lezione Unicode nel modo più duro, quindi non lo fai' non devo farlo.
Altro in questa serie: il pieno Guida agli strumenti di codifica copre il resto delle utilità giornaliere del conducente, il Guida alla creazione di regex affronta gli altri sviluppatori di abilità che fingono di avere, e poiché metà del debug di base64 termina in JSON, il Guida definitiva agli strumenti JSON è la lettura naturale successiva.
Articoli correlati:



