Italiano

Strumenti per sviluppatori · Codificatore e decodificatore Base64

Perché Base64 incollato non riesce a decodificare: ritorni a capo, ritorni a capo e virgolette inglesi

· Perché è importante

base64 codifica

Una stringa Base64 prima e dopo la rimozione delle interruzioni di riga, il taglio degli spazi bianchi e la riparazione del troncamento
Illustrazione vettoriale originale ToolAcre

Base64 si rompe raramente durante il trasporto; si rompe negli appunti. Questo post cataloga gli errori di copia-incolla che producono errori di carattere e lunghezza non validi e spiega come individuarli rapidamente.

La chiave che funzionava nel terminale e falliva nel browser: un carattere invisibile e una ricerca di due ore

Un ingegnere ha copiato una chiave API da un terminale per testarla in uno script. La chiave ha funzionato correttamente nel terminale ma non è riuscita con un carattere non valido quando è stata incollata nello strumento del browser. Due ore dopo, dopo aver cercato nel codice, nella configurazione e nella documentazione, hanno scoperto un carattere invisibile. Una nuova riga alla fine del tasto, aggiunta tramite echo o copiata da una riga di prompt del terminale, diventava un carattere extra che rompeva il decodificatore Base64. La chiave era corretta; gli appunti no. I dati Base64 sono affidabili se trasmessi elettronicamente, checksum e verificati. Si rompe quasi esclusivamente durante il copia e incolla manuale.

Il ritorno a capo della riga nei terminali, i ritorni a capo finali dall'output del comando, la sostituzione delle virgolette intelligenti negli editor di testo RTF e i caratteri Unicode nascosti dal copia-incolla tra diverse applicazioni introducono tutti errori che sembrano come se Base64 fosse danneggiato quando il problema reale risiede nel modo in cui è stato copiato. Questo post cataloga i guasti più comuni e mostra come individuarli e risolverli rapidamente. L'alfabeto Base64 è composto da lettere maiuscole e minuscole, cifre, segni più, barre e il carattere di riempimento (segno uguale). RFC 4648 è specifico: una stringa Base64 standard contiene solo quei caratteri più spazi opzionali se le righe vengono mandate a capo.

Ritorno a capo di riga da terminali, client di posta elettronica e formattazione PEM: perché un'interruzione di colonna 76 va bene per alcuni decodificatori e fatale per altri

Molti strumenti tollerano le deviazioni: accettano varianti URL-safe utilizzando trattini e caratteri di sottolineatura invece di più e barra, oppure ignorano i ritorni a capo. Un decodificatore rigoroso che segue RFC rifiuta qualsiasi cosa al di fuori del set di caratteri previsto e fallisce con un errore di carattere non valido. Il messaggio di errore solitamente nomina il carattere offensivo o indica che la stringa non può essere affatto decodificata. Quando si incolla Base64 da un'e-mail, da un terminale, dalla cronologia chat o da un documento formattato, spesso si insinuano caratteri invisibili o sostituzioni di caratteri che causano il fallimento della decodifica. I dati stessi vanno bene; il trasferimento degli appunti lo ha danneggiato.

Il ritorno a capo della riga è la fonte più comune di errori Base64 incollati e anche quella più facilmente risolvibile. Gli strumenti del terminale racchiudono l'output in 76 caratteri per riga o talvolta 80, inserendo una nuova riga e continuando con la riga successiva. Molti codificatori, incluse alcune librerie di codifica Base64, racchiudono il loro output allo stesso limite di caratteri 76 per compatibilità con l'e-mail MIME. Quando copi una stringa Base64 racchiusa da un terminale, i ritorni a capo arrivano.

Ritorni a capo finali dagli strumenti eco e appunti: il byte extra che diventa un carattere extra

Alcuni decodificatori accettano e ignorano automaticamente i ritorni a capo. Altri li rifiutano come caratteri non validi. La soluzione è rimuovere tutti i ritorni a capo e gli spazi bianchi. Se una stringa Base64 è racchiusa su più righe nel terminale, seleziona tutte le righe, copiale in un editor ed elimina tutti i ritorni a capo.

Copia la stringa a riga singola risultante e incollala nel decodificatore. Questa è la prima cosa da provare quando un incolla fallisce. I ritorni a capo finali dalle utilità echo e appunti sono un altro colpevole comune. Il comando echo $API_KEY stampa la chiave seguita da un ritorno a capo, che è il comportamento standard del comando. Se copi direttamente l'output, il ritorno a capo viene incluso nella copia. Alcuni terminali aggiungono un ritorno a capo extra quando copi e alcuni gestori di appunti conservano o duplicano i ritorni a capo. Il sintomo è lo stesso del ritorno a capo della riga: un carattere in più alla fine della stringa che non appartiene a Base64.

Virgolette intelligenti, spazi unificatori e caratteri a larghezza zero: come gli editor di testo RTF riscrivono il testo semplice

La soluzione è altrettanto semplice: taglia le estremità della stringa incollata nel tuo editor prima di tentare la decodifica. Rimuovi gli spazi bianchi iniziali e finali e tutti i caratteri che sembrano caratteri di fine riga. Se la stringa è sufficientemente corta, è possibile digitarla di nuovo manualmente, ma per i tasti lunghi un'accurata rifinitura manuale è più rapida. Le virgolette inglesi, gli spazi unificatori e altre sostituzioni Unicode sono trappole subdole. Gli editor di testo RTF come Word convertono automaticamente le virgolette semplici in virgolette inglesi, convertono tre trattini in un trattino emme e convertono determinate sequenze di spazi in spazi unificatori. Se qualcuno incolla una stringa Base64 in un documento e poi la copi dal documento formattato in uno strumento, si verificano tali sostituzioni.

Una virgoletta doppia (") diventa una coppia curva sinistra e destra, nessuna delle quali è Base64 valida. Uno spazio unificatore (U+00A0) sembra identico a uno spazio normale ma ha un codice carattere diverso e non è riconosciuto come spazio bianco da tutti i parser. La soluzione è incollarlo prima in un editor di testo semplice, che scarta tutta la formattazione. Se incolli da un documento Word o una chat formattata, incollalo prima in un editor di testo semplice o in un'area di testo HTML e controlla i caratteri dispari, quindi copia dalla versione in testo normale da utilizzare nel tuo strumento.

Troncamento e perdita di riempimento: il controllo length-modulo-4 che indica che mancano dei caratteri

Il troncamento avviene quando una stringa viene tagliata durante la copia o l'incollaggio. Una stringa Base64 molto lunga potrebbe superare i limiti degli appunti su alcuni sistemi o non essere copiata a causa di bug dell'applicazione. Il risultato è una stringa più breve che è incompleta. Una stringa Base64 deve avere una lunghezza multipla di quattro dopo l'applicazione del riempimento. Se una lunghezza non è un multiplo di quattro, viene troncata o danneggiata. Il messaggio di errore in genere indica che la lunghezza della stringa non è valida o che manca un carattere. La correzione richiede di sapere cosa è stato copiato originariamente.

Se riesci a controllare di nuovo la fonte, copiala di nuovo attentamente. In caso contrario, il troncamento è irrecuperabile. La perdita del riempimento è un problema correlato: il riempimento Base64 con segni di uguale a volte viene rimosso per risparmiare alcuni byte. Alcune applicazioni omettono il riempimento, altre lo richiedono. Se una stringa era originariamente imbottita e l'imbottitura è andata perduta, aggiungila nuovamente. Una stringa Base64 deve avere 0, 1 o 2 segni di uguale finali in modo che la lunghezza totale sia un multiplo di quattro. Se non ne ha e la lunghezza non è un multiplo di quattro, il riempimento potrebbe essere andato perso.

Esempio realizzato: riparare una stringa avvolta e troncata: pulirla passo dopo passo finché non viene decodificata

Un esempio pratico mostra queste riparazioni passo dopo passo. Supponiamo che una chiave API copiata appaia come questa nel tuo editor: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0Cg==. Inizia identificando i problemi. Il finale Cg== è dispari; Cg è base64 per un carattere di nuova riga (hex 0A) e l'extra == suggerisce che è stato aggiunto qualcosa. Rimuovi il Cg== finale e prova solo VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Ciò non è ancora corretto; la lunghezza è di 37 caratteri, non un multiplo di quattro. Taglia di nuovo: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (caratteri 35, ancora sbagliati). Controlla la fonte originale. La stringa corretta è VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 (32 caratteri) con la spaziatura corretta: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0. Aggiungilo: VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0=.

Prova nel decoder. Questo si decodifica in Questo non è proprio un segreto. Ad ogni passaggio, utilizzare il codificatore e decodificatore Base64 per testare la stringa corrente, correggere il problema identificato ed eseguire nuovamente il test finché non viene decodificata. La corruzione all'interno degli stessi byte Base64 non è risolvibile dal decodificatore. Se i byte sono effettivamente danneggiati durante il transito, la trasmissione o l'archiviazione, Base64 stesso non è in grado di rilevarlo. RFC specifica i caratteri validi; qualsiasi carattere al di fuori di questo set è il lavoro del decodificatore da catturare. Qualsiasi corruzione di byte, come un 0 che diventa un 1 nel mezzo di un carattere Base64, produce un codice carattere completamente diverso e non è rilevabile solo da Base64.

Ciò che questo non copre è la corruzione all'interno dei byte codificati, che lo stesso Base64 non è in grado di rilevare

Per rilevare questo tipo di danneggiamento vengono utilizzati checksum o firme digitali che devono essere calcolati sui dati binari originali prima della codifica Base64. Se decodifichi una stringa Base64 e il risultato è spazzatura o diverso da quello previsto, il danneggiamento si è verificato prima della codifica o durante la trasmissione, non durante la fase di copia-incolla. Questo è raro nella pratica. La maggior parte degli errori sono problemi di copia e incolla come quelli sopra. Un approccio sistematico al debug degli errori di copia-incolla Base64 consiste nel testare ogni potenziale problema in ordine. Innanzitutto, rimuovi tutti gli spazi bianchi e i ritorni a capo. Quindi ritaglia gli spazi iniziali e finali ed eventuali caratteri vaganti.

Quindi controlla la lunghezza modulo quattro e aggiungi il riempimento se necessario. Incolla ciascuna versione nel codificatore e decodificatore Base64 e verifica se decodifica. Se il controllo della lunghezza fallisce, chiedi se la stringa è stata troncata e recuperala dalla fonte originale. Se il controllo alfabetico fallisce e vedi caratteri insoliti, cerca le virgolette inglesi o le sostituzioni Unicode e sostituiscile con equivalenti ASCII. Utilizza uno strumento online che mostri i caratteri non validi per nome in modo da poterli identificare e rimuovere. Il codificatore e decodificatore Base64 esegue questa operazione per ogni carattere non valido, indicando esattamente quale carattere non è nell'alfabeto.

Conclusione: controlla la lunghezza e l'alfabeto prima di dare la colpa ai dati: come il codificatore e decodificatore Base64 ti offre un luogo locale veloce per testare ogni riparazione

Usa quel feedback per correggere ogni carattere e continuare finché la stringa non viene decodificata. La prevenzione è più semplice del debug. Quando sai che avrai nuovamente bisogno di una stringa Base64, copiala in modo da preservare la formattazione. Non incollarlo in un documento RTF. Memorizzarlo in un file di testo normale o in un'area di testo designata che non effettui sostituzioni. Se qualcuno ti invia una stringa Base64 in un messaggio formattato, chiedigli di inviarla nuovamente in formato codice o testo normale. Se devi copiare da un'origine formattata, incollala prima in un editor di testo semplice e verifica la stringa prima di utilizzarla.

Prova la stringa nel codificatore e decodificatore Base64 non appena ce l'hai, prima di fare affidamento su di essa. Se fallisce, puoi richiederne una nuova copia mentre la fonte è ancora accessibile. Se aspetti finché la stringa non è vecchia o la fonte non è più disponibile, correggere il troncamento o il danneggiamento diventa impossibile. Il codificatore e decodificatore Base64 ti offre un luogo locale rapido per testare qualsiasi stringa prima di impegnarti a utilizzarla. Testare presto e spesso in modo che gli errori di copia-incolla vengano rilevati immediatamente.