ToolDeck

Base64

7 strumenti

Cos'è la codifica?

La codifica è il processo di conversione dei dati da una rappresentazione a un'altra. Nello sviluppo Web, la codifica viene utilizzata per trasmettere dati in modo sicuro attraverso canali progettati per un set di caratteri limitato — ad esempio per inviare dati binari tramite un protocollo testuale o per includere caratteri speciali in un URL. Comprendere i diversi livelli di codifica aiuta a prevenire bug sottili e vulnerabilità di sicurezza.

La codifica dei caratteri definisce come i caratteri di testo si mappano ai byte. La codifica Base64 converte i dati binari in testo ASCII. La codifica URL rende il testo arbitrario sicuro per l'uso negli URL. Padroneggiare questi tre livelli di codifica è fondamentale per chiunque lavori su API Web, autenticazione o trasmissione di file.

Storia della codifica dei caratteri

La codifica dei caratteri è la mappatura tra caratteri e le loro rappresentazioni binarie:

ASCII1963
128 caratteri

Codice standard americano a 7 bit. 128 caratteri: lettere inglesi, cifre, punteggiatura e codici di controllo.

Latin-11987
256 caratteri

ASCII esteso per le lingue dell'Europa occidentale. Aggiunge 128 caratteri. Non adatto agli script non latini.

Unicode1991
149 186+ caratteri

Set di caratteri universale che copre tutti i sistemi di scrittura del mondo. Definisce code point per oltre 149.000 caratteri.

UTF-81993
Tutto Unicode caratteri

Codifica a larghezza variabile di Unicode che usa da 1 a 4 byte per carattere. Compatibile con ASCII. La codifica dominante sul Web.

UTF-161996
Tutto Unicode caratteri

Codifica a larghezza variabile che usa 2 o 4 byte per carattere. Usato internamente da Windows, Java e le stringhe JavaScript.

UTF-322000
Tutto Unicode caratteri

Codifica a larghezza fissa: sempre 4 byte per carattere. Raramente visto sul Web.

Perché UTF-8 ha vinto

UTF-8 è diventato dominante perché è retro-compatibile con ASCII (i primi 128 code point si codificano in modo identico), è auto-sincronizzante — è possibile trovare i confini dei caratteri scorrendo la sequenza — ed è efficiente in termini di spazio per il testo latino. Qualsiasi documento ASCII è un documento UTF-8 valido, il che ha reso la migrazione completamente trasparente per i sistemi già in produzione.

Codifica Base64

Base64 converte i dati binari in una rappresentazione testuale usando solo 64 caratteri ASCII stampabili: A-Z, a-z, 0-9, + e /. Questo è necessario quando i dati binari devono viaggiare attraverso canali che gestiscono solo testo — gli allegati email, gli URI dati incorporati in HTML, i token JWT e l'autenticazione HTTP Basic Auth utilizzano tutti Base64 per questo motivo. Senza Base64, un byte con valore 0x00 o 0xFF verrebbe interpretato come carattere di controllo o risulterebbe corrotto dai sistemi di trasporto testuale.

Come funziona

Base64 raggruppa i byte di input in blocchi da 3 byte (24 bit) e codifica ogni blocco come 4 caratteri Base64 (6 bit ciascuno). Ogni gruppo di 6 bit viene mappato su uno dei 64 caratteri dell'alfabeto Base64. Se l'input non è un multiplo di 3 byte, vengono aggiunti caratteri di padding =:

InputByte hexBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

I caratteri = di padding indicano quanti byte mancavano per completare l'ultimo gruppo da 3 byte. Un singolo = significa che era necessario un byte di padding; == significa che erano necessari due byte. Il Base64 standard produce sempre output con lunghezza multipla di 4. Alcune implementazioni, come Base64url usato nei JWT, omettono il padding perché la lunghezza dell'output è ricavabile dalla lunghezza della stringa stessa.

Codifica URL

Gli URL possono contenere solo un insieme limitato di caratteri ASCII sicuri. Qualsiasi carattere al di fuori di tale insieme deve essere codificato in percentuale.

La codifica percentuale sostituisce ogni byte non sicuro con % seguito da due cifre esadecimali che rappresentano il valore di quel byte. Uno spazio diventa %20, una e commerciale diventa %26 e così via. I caratteri Unicode multi-byte vengono prima convertiti in UTF-8 e poi ogni byte viene codificato separatamente: la lettera é diventa %C3%A9.

Caratteri comunemente codificati

CarattereCodificatoNote
Space%20Il più comune; usato negli invii di moduli come + in application/x-www-form-urlencoded
&%26Separatore di query string; deve essere codificato quando usato come valore letterale
=%3DSeparatore chiave-valore nelle query string; codificare come dato
+%2BInterpretato come spazio in application/x-www-form-urlencoded; codificare per preservare +
#%23Identificatore di frammento; codificare come dati letterali in un percorso o query
/%2FSeparatore di segmento di percorso; codificare come dati letterali
:%3ASeparatore di schema; codificare nei contesti di percorso e query
@%40Usato in mailto: e auth; codificare come dati letterali

encodeURI vs encodeURIComponent

JavaScript fornisce due funzioni di codifica con portate diverse. encodeURI codifica un URL completo e lascia intatti i caratteri strutturali dell'URL come :, /, ?, # e @. encodeURIComponent codifica un componente URL — codifica tutti i caratteri eccetto A-Z, a-z, 0-9, -, _, ., ~. Usa sempre encodeURIComponent per i singoli valori e encodeURI per URL completi.

Dove la codifica appare nello sviluppo Web

Autenticazione HTTP di base

L'intestazione Authorization: Basic codifica le credenziali come Base64(utente:password). È codifica per comodità di trasporto, NON sicurezza. Chiunque intercetti la richiesta può decodificare le credenziali in un istante. Usa sempre HTTPS con Basic Auth per proteggere le credenziali durante il transito.

URI dati

Gli URI dati incorporano il contenuto del file direttamente in HTML o CSS: data:image/png;base64,.... Questo elimina le richieste HTTP per risorse piccole come icone e font, a scapito di un aumento della dimensione del documento di circa il 33% — il costo fisso della codifica Base64.

Allegati email MIME

La posta elettronica era progettata per l'ASCII a 7 bit. Gli allegati binari come immagini e PDF vengono codificati in Base64 da MIME prima della trasmissione. Il client di posta ricevente decodifica l'allegato in modo trasparente prima di mostrarlo all'utente.

Token JWT

I token JWT usano la codifica Base64url — una variante che sostituisce + con - e / con _, e omette il padding = — per tutte e tre le parti (intestazione, payload, firma). Questo li rende sicuri per gli URL e per le intestazioni HTTP senza ulteriore codifica percentuale.

Parametri di query string

Qualsiasi dato fornito dall'utente nelle query string URL deve essere codificato in percentuale. Dimenticare di codificare & o = in un valore corrompere silenziosamente il parsing della query string. Usa sempre encodeURIComponent sui singoli valori prima di assemblarli nell'URL.

Nomi di dominio internazionalizzati

I nomi di dominio non ASCII vengono codificati con Punycode (prefisso xn--) per la compatibilità con il sistema DNS. Il browser mostra la forma Unicode all'utente ma invia la forma Punycode ai resolver DNS.

Domande frequenti

Base64 è una forma di crittografia?

No. Base64 è codifica, non crittografia. È una trasformazione reversibile senza chiave segreta: chiunque veda una stringa Base64 può decodificarla immediatamente. Non usare mai Base64 come misura di sicurezza per proteggere dati sensibili.

Perché l'output Base64 finisce a volte con ==?

Base64 elabora l'input in gruppi da 3 byte. Se l'input non è un multiplo di 3, viene aggiunto padding =. Un singolo = significa un byte di padding; == significa due byte di padding. Alcune implementazioni come Base64url per i JWT omettono il padding perché la lunghezza può essere dedotta dalla dimensione della stringa.

Qual è la differenza tra Base64 e Base64url?

Base64url è una variante sicura per URL che sostituisce + con - e / con _, e di solito omette il padding =. Questo la rende sicura da usare negli URL e nelle intestazioni HTTP senza codifica percentuale aggiuntiva. I JWT usano Base64url per tutte e tre le parti: intestazione, payload e firma.

Quando usare encodeURI vs encodeURIComponent?

Usa encodeURIComponent per valori individuali come i parametri di query o i segmenti di percorso. Usa encodeURI per una stringa URL completa dove vuoi preservare i caratteri di struttura URL come /, :, ? e #. In caso di dubbio, preferisci sempre encodeURIComponent.

Perché UTF-8 è meglio di UTF-16 per il Web?

UTF-8 è compatibile con ASCII ed efficiente per il testo latino, che costituisce la maggior parte degli URL, dei tag HTML e del codice sorgente. UTF-16 spreca spazio per i contenuti ASCII e non è retro-compatibile. HTTP e HTML usano UTF-8 per impostazione predefinita.

Cos'è la codifica percentuale?

La codifica percentuale rappresenta i caratteri come % seguito dal loro valore di byte esadecimale a due cifre. Uno spazio è %20 (decimale 32, esadecimale 20). I caratteri UTF-8 multi-byte codificano ogni byte separatamente: ad esempio la lettera é diventa %C3%A9.

La codifica influisce sulle prestazioni?

Base64 aumenta la dimensione dei dati di circa il 33% e aggiunge overhead CPU per la codifica e la decodifica. Per sistemi ad alto throughput è preferibile usare protocolli binari che non richiedono questa conversione. La codifica URL aggiunge un overhead minimo, ma può allungare significativamente gli URL in presenza di molti caratteri speciali.

Cos'è Punycode?

Punycode è una codifica per rappresentare caratteri Unicode nel sistema DNS compatibile con ASCII. I nomi di dominio internazionalizzati come münchen.de vengono codificati come xn--mnchen-3ya.de nelle query DNS. I browser mostrano la forma Unicode all'utente ma usano internamente la forma Punycode quando interrogano i resolver DNS.