Italiano

Strumenti per sviluppatori · Codificatore e decodificatore Base64

Perché gli allegati e-mail sono Base64: MIME, 7-bit trasporto e 76-righe di colonna

· Sfondo

base64 codifica

Intestazione MIME Content-Transfer-Encoding e avvolgimento riga Base64 di caratteri 76 per il trasporto della posta elettronica
Illustrazione vettoriale originale ToolAcre

L'e-mail è stata creata per il testo 7-bit ASCII e gli allegati dovevano adattarsi a esso. Questo post traccia come MIME ha adottato Base64, perché le righe vengono racchiuse in caratteri 76 e cosa significa per dimensioni e debug.

L'allegato arrivato danneggiato tramite un vecchio relè: il problema di 8-bit che MIME è stato inventato per risolvere

L'e-mail è stata progettata negli anni '70 e '80 solo per testo 7-bit ASCII. SMTP, il protocollo che trasporta la posta elettronica, prevede che ogni riga contenga al massimo 998 caratteri di 7-bit ASCII (caratteri 0-127). L'invio di un file binario come PDF o un'immagine direttamente tramite SMTP fallirebbe: i byte 128-255 verrebbero danneggiati o rifiutati dai vecchi server di posta e relè. Gli allegati devono essere codificati. MIME (Multifunction Internet Mail Extensions, RFC 2045) ha risolto questo problema definendo i valori dell'intestazione Content-Transfer-Encoding, incluso base64, che rappresenta qualsiasi sequenza di byte come testo 7-bit ASCII.

MIME offre diverse scelte di codifica per il trasferimento dei contenuti: 7bit (nessuna codifica, solo per ASCII sicuro), 8bit (per server che supportano byte da 8 bit, non universale), quoted-printable (codifica solo byte non sicuri, mantenendo ASCII leggibile) e base64 (codifica tutto, massimizzando la compatibilità). Base64 è stato scelto per gli allegati binari perché è semplice, standardizzato e garantisce sicurezza su qualsiasi sistema di posta, non importa quanto vecchio o rigorosamente 7-bit-only. Il compromesso è la dimensione: Base64 è circa un terzo più grande dei byte originali.

Il problema del trasporto risolto da Base64: rappresentare byte arbitrari con caratteri stampabili

Un 3 KB PDF diventa circa 4 KB di testo Base64. Il limite di riga di caratteri 76 proviene da RFC 2045.

SMTP consente righe fino a 998 caratteri, ma i sistemi di posta più vecchi e alcuni filtri antispam rifiutano le righe lunghe. RFC 2045 specifica che le righe MIME Base64 non devono superare i 76 caratteri (più un finale di riga CRLF), quindi un server di posta non interromperà mai il trasporto. Il limite non è magico; si tratta di un compromesso storico tra leggibilità (i caratteri 76 si adattano alla maggior parte dei terminali degli anni '80), compatibilità con i vecchi sistemi ed evitare il rilevamento come spam o pattern di virus.

Le scelte di output visibili in questo strumento: riempimento canonico e avvolgimento dei caratteri 76 facoltativo

I moderni sistemi di posta di solito supportano linee più lunghe, ma la codifica in linee di caratteri 76 garantisce che l'allegato raggiunga anche il destinatario più vecchio. Dopo che RFC 2045 ha definito MIME Base64, RFC 4288 (tipi di supporto) e RFC 2183 (Content-Disposition) hanno aggiunto modi standardizzati per etichettare gli allegati. Un messaggio con un allegato PDF include un'intestazione Content-Transfer-Encoding: base64, un'intestazione Content-Type: application/pdf e i byte PDF codificati come Base64 con righe di caratteri 76. Un lettore di posta decodifica le righe rimuovendo le interruzioni di riga (caratteri CRLF) e quindi decodificando Base64 per recuperare i byte originali.

Per decodificare un allegato MIME Base64 è necessario ignorare gli spazi bianchi. Il RFC dice: i decoder devono saltare le interruzioni di riga (caratteri CR e LF) durante la decodifica. Questo è il motivo per cui è pratico un decodificatore Base64 che accetta gli spazi bianchi; la maggior parte della vera posta MIME avrà interruzioni di riga. Alcuni decodificatori sono rigorosi e rifiutano gli spazi bianchi (adatti a contesti come JWT, dove le interruzioni di riga non dovrebbero essere presenti), mentre altri sono indulgenti e saltano gli spazi bianchi (adatti per MIME).

L'opzione 76-character in pratica: come il codificatore inserisce e il decodificatore ignora le interruzioni di riga

Lo strumento di codifica e decodifica Base64 può gestire entrambi: accetta un allegato incollato su più righe e ignora le interruzioni di riga durante la decodifica. L’impatto sulle dimensioni è prevedibile. RFC 2045 Il wrapper base64 aggiunge un CRLF (2 bytes) per 76 caratteri di output. Per un file 10 KB, Base64 è circa 13.3 KB, più CRLF ogni 76 caratteri: circa 13.5 KB totale. Il sovraccarico è di circa un terzo di byte in più.

I limiti di dimensione dell'e-mail sono generalmente indicati per la dimensione codificata, non per la dimensione del file originale; un server di posta con un limite 25 MB significa 25 MB del messaggio codificato, non 25 MB degli allegati. Per calcolare la dimensione del file originale è necessario dividere per 1.33 (o più precisamente, per 4 diviso per 3). La codifica quoted-printable è un'alternativa che mantiene invariato il ASCII stampabile e codifica solo i byte 128-255 e alcuni caratteri speciali.

Esempio realizzato: leggere la fonte di un messaggio non elaborato: trovare la parte Base64 e decodificare un piccolo allegato di testo

Un file di testo con principalmente ASCII rimane leggibile se si apre l'origine del messaggio non elaborato. Base64 offusca tutto, anche il semplice testo ASCII. Quoted-printable viene utilizzato raramente per i file binari (sarebbe molto inefficiente per un PDF) ma a volte viene utilizzato per il testo. Un lettore di posta sceglie la codifica in base al tipo di allegato; un browser solitamente non chiede all'utente quale codifica applicare.

Il corpo Base64 di un messaggio di posta elettronica è costituito solo dai byte stessi, non da un file separato. Quando vedi un allegato in un lettore di posta, il lettore ha già decodificato Base64 e mostra il file originale.

Il costo in termini di dimensioni in pratica è circa un terzo di byte in più e perché i limiti di dimensione della posta sono indicati per la dimensione codificata

Se visualizzi l'origine del messaggio non elaborato (un'opzione nella maggior parte dei client di posta), vedrai le intestazioni MIME e il corpo con codifica Base64. Lo strumento di codifica e decodifica Base64 può aiutarti a decodificare manualmente un frammento di un'origine del messaggio; copia la parte Base64, rimuovi le interruzioni di riga e incollala nello strumento.

Più allegati in un messaggio MIME utilizzano un limite multiparte. Ogni parte ha le proprie intestazioni (Content-Type, Content-Transfer-Encoding) e il proprio corpo. Una versione alternativa in testo semplice del messaggio viene visualizzata come una parte e ciascun allegato viene visualizzato come un'altra parte. La corda di delimitazione separa le parti; si è scelto di non apparire nel contenuto di nessuna parte. Un lettore di posta ricostruisce il messaggio analizzando i confini e decodificando ciascuna parte in base alla sua intestazione Content-Transfer-Encoding.

Cosa non copre: intestazioni di parole codificate, S/MIME e l'estensione 8BITMIME in modo approfondito

RFC 2045 La codifica base64 non è universale oggi. Alcuni sistemi di posta supportano il trasporto 8 bit e non richiedono più base64. Alcuni sistemi utilizzano nomi di codifica diversi o aggiungono intestazioni personalizzate. Ma base64 con linee di caratteri 76 rimane la scelta più compatibile per gli allegati che devono raggiungere qualsiasi sistema di posta, ovunque. Quando alleghi un file utilizzando un client di posta, il client in genere sceglie automaticamente base64 per i file binari, gestisce il ritorno a capo della riga e aggiunge le intestazioni MIME.

Comprendere il meccanismo ti aiuta a eseguire il debug quando un allegato sembra danneggiato o quando lavori manualmente con un'origine del messaggio. Per creare o analizzare un messaggio di posta elettronica in uscita è necessario comprendere la struttura MIME. Una libreria dovrebbe gestire la codifica, il ritorno a capo delle righe e le intestazioni; di solito non costruisci MIME manualmente. Ma se stai analizzando un'origine di messaggio non elaborata (eseguendo il debug di un problema di consegna o estraendo gli allegati a livello di codice), sapere che Content-Transfer-Encoding: base64 significa che il corpo seguente è 76-character-wrapped base64 ti consente di applicare il decodificatore corretto.

Conclusione: Base64 è il livello di compatibilità dell'e-mail: in che modo il codificatore e decodificatore Base64 ti consente di leggere localmente una piccola parte di testo da un messaggio non elaborato

Lo stesso base64 è standard RFC 4648; le intestazioni wrap e MIME sono specifiche dell'e-mail. Gli allegati e-mail sono Base64 perché la posta elettronica è stata creata per testo semplice e Base64 è il livello di compatibilità più semplice e universale per inviare dati binari tramite un protocollo di solo testo. Il limite della riga di caratteri 76 è un artefatto storico dei terminali degli anni '80 e delle reti lente, ma persiste come standard di compatibilità.

Comprendere questa cronologia spiega perché esiste MIME, perché esistono più opzioni di codifica e perché base64 rimane l'impostazione predefinita per gli allegati anche se i moderni sistemi di posta potrebbero supportare direttamente il binario. Il codificatore e decodificatore Base64 ti consente di lavorare manualmente con i corpi MIME per verificare o eseguire il debug della codifica.