A cosa serve la codifica base 64?


782

Ho sentito gente parlare di "codifica base 64" qua e là. A cosa serve?


1
Dal manuale di base64_encode () : "Questa codifica è progettata per far sopravvivere il trasporto di dati binari attraverso livelli di trasporto non puliti a 8 bit, come i corpi di posta."
still_dreaming_1,

Risposte:


941

Quando si dispone di alcuni dati binari che si desidera spedire attraverso una rete, generalmente non lo si fa semplicemente trasmettendo i bit e i byte sul filo in un formato non elaborato. Perché? perché alcuni media sono creati per lo streaming di testo. Non si sa mai: alcuni protocolli possono interpretare i tuoi dati binari come caratteri di controllo (come un modem), oppure i tuoi dati binari potrebbero essere rovinati perché il protocollo sottostante potrebbe pensare di aver inserito una combinazione di caratteri speciale (come il modo in cui FTP traduce la riga terminazioni).

Quindi, per ovviare a questo, le persone codificano i dati binari in caratteri. Base64 è uno di questi tipi di codifiche.

Perché 64
Perché in genere puoi fare affidamento sullo stesso 64 caratteri presenti in molti set di caratteri e puoi essere ragionevolmente sicuro che i tuoi dati finiranno dall'altra parte del filo senza essere corrotti.


104
(In teoria potresti fare la codifica base 80 o qualcosa di simile, ma sarebbe molto più difficile. I poteri di due sono basi naturali per il binario.)
Jon Skeet,

13
@yokees: non c'è garanzia, sono solo personaggi che sono quasi sempre al sicuro. Questo è il motivo per cui ci sono più forme di Base-64 ( en.wikipedia.org/wiki/Base-64 ).

8
Ciò significa che tutti i tipi di dati di rete che passano dovrebbero usare un qualche tipo di codifica?
Tanner Summers,

6
Ma perché viene utilizzato il metodo base64 per codificare i dati di stringa? ad es. nella funzione javascript atob Significa che il server codifica un file json nel formato base64? I caratteri speciali potrebbero essere un caso d'uso, ma perché non utf8 in quel caso, sono equivalenti? Qualsiasi ulteriore risorsa in merito sarebbe molto apprezzata grazie.
partizanos,

4
Un elenco di almeno alcuni protocolli che fallirebbero sarebbe bello se qualcuno lo sapesse.
Tadej,

202

È fondamentalmente un modo per codificare dati binari arbitrari nel testo ASCII. Richiede 4 caratteri per 3 byte di dati, più potenzialmente un po 'di riempimento alla fine.

In sostanza ogni 6 bit dell'input è codificato in un alfabeto di 64 caratteri. L'alfabeto "standard" usa AZ, az, 0-9 e + e /, con = come carattere di riempimento. Esistono varianti sicure per gli URL.

Wikipedia è una fonte ragionevolmente buona di ulteriori informazioni.


In una lingua come php, da dove verranno i dati binari. Lavoriamo quasi sempre con dati stringa che sono testo.
Cholthi Paul Ttiopic,

3
@CholthiPaulTtiopic: i risultati di crittografia o compressione o audio / immagini / video.
Jon Skeet,

1
@CholthiPaulTtiopic: temo di non avere idea di cosa intendi per "che dire dello spazio di archiviazione", ma a questo punto penso che siamo un po 'fuori tema.
Jon Skeet,

2
@CholthiPaulTtiopic: eviterei fortemente di pensare in termini di "stringa binaria". I dati binari devono essere trattati come dati binari e non trattati come testo. Ho visto letteralmente centinaia - forse migliaia - di domande sulla SO che sostanzialmente si riducono a persone che non si prendono abbastanza cura di questa distinzione.
Jon Skeet,

1
@ still_dreaming_1 PHP li chiama binary strings. (fonte) php.net/manual/en/function.pack.php
Cholthi Paul Ttiopic


116

È una codifica testuale di dati binari in cui il testo risultante non ha altro che lettere, numeri e simboli "+", "/" e "=". È un modo conveniente per archiviare / trasmettere dati binari su supporti specificamente utilizzati per dati testuali.

Ma perché Base-64? Le due alternative per convertire i dati binari in testo che vengono immediatamente in mente sono:

  1. Decimale: memorizza il valore decimale di ogni byte come tre numeri: 045 112 101 037 ecc. Dove ogni byte è rappresentato da 3 byte. I dati si gonfiano tre volte.
  2. Esadecimale: memorizza i byte come coppie esadecimali: AC 47 0D 1A ecc. Dove ogni byte è rappresentato da 2 byte. I dati si gonfiano due volte.

Base-64 mappa 3 byte (8 x 3 = 24 bit) in 4 caratteri che si estendono su 6 bit (6 x 4 = 24 bit). Il risultato è simile a "TWFuIGlzIGRpc3Rpb ...". Pertanto il gonfiore è solo un mero 4/3 = 1.3333333 volte l'originale.


10
Capisco correttamente, che 64 è la scelta migliore in quanto è la massima potenza di due che è convertibile in un carattere ASCII stampabile (ce ne sono 95)?
Voho,

Se in entrambi i casi sono 24 bit, allora non è il gonfiore 1: 1? Oppure quando dici 4 caratteri che si estendono su 6 bit, vuoi dire che in realtà ci sono 8 bit per carattere, ma i primi due sono 0 con riempimento?
David Klempfner,

1
@Backwards_Dave Ogni 6 bit sono espressi in 8 bit. Quindi il gonfiore è 8: 6 o 4: 3.
Ates Goral,

82

A parte ciò che è già stato detto, ci sono due usi molto comuni che non sono stati elencati

hash:

Gli hash sono funzioni unidirezionali che trasformano un blocco di byte in un altro blocco di byte di dimensioni fisse come 128 bit o 256 bit (SHA / MD5). La conversione dei byte risultanti in Base64 semplifica notevolmente la visualizzazione dell'hash soprattutto quando si confronta un checksum per l'integrità. Gli hash sono visti così spesso in Base64 che molte persone scambiano Base64 stesso come hash.

Crittografia:

Poiché una chiave di crittografia non deve essere di testo ma di byte non elaborati, a volte è necessario memorizzarla in un file o database, per cui Base64 è utile. Lo stesso vale per i byte crittografati risultanti.

Si noti che sebbene Base64 sia spesso usato nella crittografia non è un meccanismo di sicurezza. Chiunque può riconvertire la stringa Base64 nei suoi byte originali, quindi non dovrebbe essere usata come mezzo per proteggere i dati, ma solo come formato per visualizzare o archiviare i byte grezzi più facilmente.

certificati

I certificati x509 in formato PEM sono codificati in base 64. http://how2ssl.com/articles/working_with_pem_files/


4
In realtà, in molti casi è più facile archiviare byte come byte come byte. Anche in un database, e specialmente in un file (se vengono utilizzati record a lunghezza fissa o i byte sono l'unico contenuto). Base64 viene in genere utilizzato quando tali byte sono destinati a essere trasmessi da qualche parte, in particolare su un canale che potrebbe eliminare bit o interpretare alcuni dei byte come codici di controllo.
cHao,

Non ho mai visto un hash scritto come numeri interi a 8 bit senza segno, 0,1,255,36 ... e visualizzarlo con UTF-8 o qualsiasi altra codifica non avrebbe senso, in quale altro modo lo visualizzeresti se non con base64? Le chiavi di crittografia e i dati crittografati vengono spesso archiviati in file XML e di configurazione in cui non è possibile archiviare i byte non elaborati. Sono d'accordo se è possibile memorizzarlo come byte non elaborati, in ogni caso, ma base64 è per quelle situazioni in cui non è possibile. Ci sono molti usi di base64 oltre alla trasmissione. Questi sono semplicemente due scenari comuni in cui lo vedrai.
Despertar,

1
Visualizzeresti l'hash come esadecimale, non decimale. Per gli hash, questo è in effetti molto più comune di base64.
cHao,

@cHao Sì, anche questo è comune. Le cifre esadecimali possono rappresentare qualsiasi dato binario, ma la base 64 ha il vantaggio di occupare molto meno spazio poiché utilizza più caratteri.
Despertar,

45

Anni fa, quando fu introdotta la funzionalità di mailing, in modo che fosse completamente basato sul testo, con il passare del tempo, nacque la necessità di allegati come immagini e media (audio, video ecc.). Quando questi allegati vengono inviati su Internet (che è fondamentalmente sotto forma di dati binari), la probabilità che i dati binari vengano corrotti è elevata nella sua forma grezza. Quindi, per affrontare questo problema è arrivato BASE64.

Il problema con i dati binari è che contiene caratteri null che in alcune lingue come C, C ++ rappresentano la fine della stringa di caratteri, quindi l'invio di dati binari in formato non elaborato contenente byte NULL interromperà la lettura completa di un file e lo porterà a dati corrotti.

Per esempio :

In C e C ++, questo carattere "null" mostra la fine di una stringa. Quindi "CIAO" viene memorizzato in questo modo:

CIAO

72 69 76 76 79 00

Lo 00 dice "fermati qui".

Vediamo ora come funziona la codifica BASE64.

Punto da notare: la lunghezza della stringa deve essere in multipli di 3.

Esempio 1 :

Stringa da codificare: "asso", lunghezza = 3

1) Converti ogni carattere in decimale.

a = 97, c = 99, e = 101

inserisci qui la descrizione dell'immagine

2) Cambia ogni decimale in rappresentazione binaria a 8 bit.

97 = 01100001, 99 = 01100011, 101 = 01100101

Combinato: 01100001 01100011 01100101

3) Separato in un gruppo di 6 bit.

011000 010110 001101 100101

4) Calcola binario in decimale

011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

5) Converti i caratteri decimali in base64 usando il grafico base64.

24 = Y, 22 = W, 13 = N, 37 = l

“Ace” => “YWNl”

inserisci qui la descrizione dell'immagine

Esempio 2:

Stringa da codificare: "abcd" Lunghezza = 4, non è multiplo di 3. Quindi, per rendere la lunghezza della stringa multipla di 3, è necessario aggiungere un'imbottitura di 2 bit per rendere lunghezza = 6. Il bit di imbottitura è rappresentato dal segno "=".

Punto da notare: un bit di riempimento equivale a due zero 00, quindi due bit di riempimento equivalgono a quattro zero 0000.

Quindi iniziamo il processo: -

1) Converti ogni carattere in decimale.

a = 97, b = 98, c = 99, d = 100

2) Cambia ogni decimale in rappresentazione binaria a 8 bit.

97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

3) Separare in un gruppo di 6 bit.

011000, 010110, 001001, 100011, 011001, 00

quindi l'ultimo 6 bit non è completo, quindi inseriamo due bit di padding che equivalgono a quattro zero "0000".

011000, 010110, 001001, 100011, 011001, 000000 ==

Ora è uguale. Due segni di uguale alla fine mostrano che sono stati aggiunti 4 zero (aiuta nella decodifica).

4) Calcola binario in decimale.

011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

5) Converti i caratteri decimali in base64 usando il grafico base64.

24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

“Abcd” => “YWJjZA ==”


5
questa è davvero una grande spiegazione
maheshmnj,

28

All'inizio dei computer, quando la comunicazione tra sistemi non era particolarmente affidabile, veniva usato un metodo rapido e sporco per verificare l'integrità dei dati: la "parità dei bit". In questo metodo, ogni byte trasmesso avrebbe 7 bit di dati e l'ottavo sarebbe 1 o 0, per forzare il numero totale di 1 bit nel byte per essere pari.

Quindi 0x01 verrebbe trasmesso come 0x81; 0x02 sarebbe 0x82; 0x03 rimarrebbe 0x03 ecc.

Per favorire questo sistema, quando fu definito il set di caratteri ASCII, furono assegnati solo caratteri 00-7F. (Ancora oggi, tutti i personaggi impostati nell'intervallo 80-FF non sono standard)

Molti router del giorno inseriscono il controllo di parità e la traduzione dei byte in hardware, costringendo i computer ad essi collegati a gestire rigorosamente i dati a 7 bit. Ciò impone che gli allegati di posta elettronica (e tutti gli altri dati, motivo per cui i protocolli HTTP e SMTP sono basati su testo), vengano convertiti in un formato di solo testo.

Pochi dei router sopravvissero negli anni '90. Dubito fortemente che qualcuno di loro sia in uso oggi.


2
Questo è un eccellente punto di discussione e un'interessante lezione di storia, grazie.
Dan Bechard,

26

Da http://en.wikipedia.org/wiki/Base64

Il termine Base64 si riferisce a una specifica codifica di trasferimento del contenuto MIME. Viene anche usato come termine generico per qualsiasi schema di codifica simile che codifica i dati binari trattandoli numericamente e traducendoli in una rappresentazione 64 di base. La particolare scelta della base è dovuta alla storia della codifica del set di caratteri: si può scegliere un set di 64 caratteri che è sia parte del sottoinsieme comune alla maggior parte delle codifiche, sia stampabile. Questa combinazione lascia improbabile che i dati vengano modificati in transito attraverso sistemi, come la posta elettronica, che tradizionalmente non erano puliti a 8 bit.

Base64 può essere utilizzato in una varietà di contesti:

  • Evolution e Thunderbird utilizzano Base64 per offuscare le password e-mail [1]
  • Base64 può essere utilizzato per trasmettere e archiviare testo che potrebbe altrimenti causare collisioni del delimitatore
  • Base64 è spesso usato come scorciatoia veloce ma insicuro per oscurare segreti senza incorrere nel sovraccarico della gestione delle chiavi crittografiche

  • Gli spammer usano Base64 per eludere gli strumenti di base antispam, che spesso non decodificano Base64 e quindi non sono in grado di rilevare le parole chiave nei messaggi codificati.

  • Base64 viene utilizzato per codificare stringhe di caratteri nei file LDIF
  • Base64 viene talvolta utilizzato per incorporare dati binari in un file XML, utilizzando una sintassi simile a ...... ad esempio bookmarkshtml di Firefox.
  • Base64 viene inoltre utilizzato quando si comunica con i dispositivi di stampa Fiscal Signature governativi (in genere, tramite porte seriali o parallele) per ridurre al minimo il ritardo nel trasferimento dei caratteri di ricevuta per la firma.
  • Base64 viene utilizzato per codificare file binari come immagini all'interno di script, per evitare di dipendere da file esterni.
  • Può essere utilizzato per incorporare dati di immagini non elaborati in una proprietà CSS come immagine di sfondo.

11

Alcuni protocolli di trasporto consentono solo la trasmissione di caratteri alfanumerici. Immagina una situazione in cui i personaggi di controllo vengono utilizzati per attivare azioni speciali e / o che supporta solo una larghezza di bit limitata per personaggio. Base64 trasforma qualsiasi input in una codifica che utilizza solo caratteri alfanumerici, +, /e =come un carattere di riempimento.


9

L'uso di Base64 che descriverò qui è un po 'un trucco. Quindi se non ti piacciono gli hack, per favore non andare avanti.

Sono andato nei guai quando ho scoperto che utf8 di MySQL non supporta i caratteri unicode a 4 byte poiché utilizza una versione a 3 byte di utf8. Quindi cosa ho fatto per supportare l'unicode a 4 byte completo su utf8 di MySQL? Bene, base64 codifica le stringhe durante l'archiviazione nel database e base64 decodifica durante il recupero.

Poiché la codifica e la decodifica base64 sono molto veloci, quanto sopra ha funzionato perfettamente.

Hai i seguenti punti da prendere in considerazione:

  • La codifica Base64 utilizza il 33% di memoria in più

  • Le stringhe archiviate nel database non saranno leggibili dall'uomo (è possibile venderle come funzionalità che le stringhe del database utilizzano una forma base di crittografia).

È possibile utilizzare il metodo sopra indicato per qualsiasi motore di archiviazione che non supporta Unicode.


6
"Potresti venderlo come una caratteristica che le stringhe di database usano una forma base di crittografia" Mi piace il tuo stile: D
Ercan,

8
"Potresti venderlo come una caratteristica che le stringhe di database usano una forma base di crittografia" che cosa orribile da dire: D
Alex,

1
forma base di crittografia contro chiunque non abbia l'algoritmo di decodifica base64 rofl: D
Eladian

1
@Alex Non è affatto una "cosa orribile da dire". Va bene che i dati sensibili di secondo grado siano codificati in base64 per renderli illeggibili dagli amministratori di database. Non è sempre necessario disporre del massimo livello di crittografia per ogni dato. Ad esempio, se si desidera nascondere "commenti" da un amministratore di database, allora base64 è adatto per il lavoro. Gratcias!
Basil Musa,

1
Vale la pena ricordare che MySQL ora supporta tutto Unicode, anche se ai fini della compatibilità con le versioni precedenti, il loro utf8tipo è ancora solo di tre byte; se vuoi la cosa reale, usa utf8mb4. Bello hack, ma non è più necessario.
TRiG

7

È usato per convertire dati binari arbitrari in testo ASCII.

Ad esempio, gli allegati di posta elettronica vengono inviati in questo modo.


7

Lo uso in senso pratico quando trasferiamo oggetti binari di grandi dimensioni (immagini) tramite servizi web. Quindi, quando collaudo un servizio web C # usando uno script Python, l'oggetto binario può essere ricreato con un po 'di magia.

[In pitone]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

1
I dati viaggiano più velocemente?
FelipeM

1
@FelipeM più lento, non più veloce. Base64 ha il 33% di spese generali (per il prezzo della sicurezza.)
Juraj

6

“Gli schemi di codifica Base64 vengono comunemente utilizzati quando è necessario codificare i dati binari che devono essere archiviati e trasferiti su supporti progettati per gestire dati testuali. Questo per garantire che i dati rimangano intatti senza modifiche durante il trasporto ”(Wiki, 2017)

L'esempio potrebbe essere il seguente: si dispone di un servizio Web che accetta solo caratteri ASCII. Si desidera salvare e quindi trasferire i dati dell'utente in un'altra posizione (API) ma il destinatario desidera ricevere dati non toccati. Base64 è per questo. . . L'unico aspetto negativo è che la codifica base64 richiederà circa il 33% di spazio in più rispetto alle stringhe normali.

Un altro esempio: uenc = url codificato = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-say .

Come puoi vedere, non possiamo inserire il carattere "/" nell'URL se vogliamo inviare l'ultimo URL visitato come parametro perché rompiamo la regola di attributo / valore per "MOD riscrittura" - parametro GET.

Un esempio completo potrebbe essere: “ http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 / "


4

Principalmente, l'ho visto usato per codificare i dati binari in contesti che possono gestire solo set di caratteri ASCII o semplici.


3

Per espandere un po 'quello che dice Brad: molti meccanismi di trasporto per e-mail e Usenet e altri modi di spostare i dati non sono "puliti a 8 bit", il che significa che i caratteri al di fuori del set di caratteri ASCII standard potrebbero essere alterati durante il trasporto, ad esempio, 0x0D potrebbe essere visto come ritorno a capo e trasformato in ritorno a capo e avanzamento riga. Base 64 mappa tutti i caratteri binari in diverse lettere e numeri ascii standard e punteggiatura in modo che non vengano alterati in questo modo.


2

Base64

Base64 è un termine generico per un numero di schemi di codifica simili che codificano i dati binari trattandoli numericamente e traducendoli in una rappresentazione 64 di base. Il termine Base64 proviene da una specifica codifica di trasferimento del contenuto MIME.

Gli schemi di codifica Base64 sono comunemente utilizzati quando è necessario codificare dati binari che devono essere archiviati e trasferiti su supporti progettati per gestire dati testuali. Questo per garantire che i dati rimangano intatti senza modifiche durante il trasporto. Base64 viene utilizzato comunemente in numerose applicazioni, tra cui la posta elettronica tramite MIME e la memorizzazione di dati complessi in XML.


0

Base64 può essere utilizzato per vari scopi.

Il motivo principale è convertire i dati binari in qualcosa di passabile.

A volte lo uso per trasferire i dati JSON da un sito all'altro, per memorizzare informazioni nei cookie di un utente.

Nota: "puoi" usarlo per la crittografia: non vedo perché la gente dice che non puoi, e che non è crittografia, anche se sarebbe facilmente fragile e non è rispettabile. Crittografia non significa altro che convertire una stringa di dati in un'altra stringa di dati che può essere decifrata in un secondo momento oppure no, ed è ciò che fa base64.



2
Stai interpretando la definizione di "crittografia" di gran lunga troppo alla lettera. La parola si è evoluta in qualcosa di leggermente più specifico delle sue origini.
Dan Bechard,

0

Una cifra esadecimale è di un bocconcino (4 bit). Due nibble formano 8 bit che sono anche chiamati 1 byte.

MD5 genera un output a 128 bit che viene rappresentato utilizzando una sequenza di 32 cifre esadecimali, che a loro volta sono 32 * 4 = 128 bit. 128 bit formano 16 byte (poiché 1 byte è 8 bit).

Ogni carattere Base64 codifica 6 bit (tranne l'ultimo carattere non pad che può codificare 2, 4 o 6 bit e l'eventuale carattere pad finale). Pertanto, per la codifica Base64, un hash a 128 bit richiede almeno ⌈128 / 6⌉ = 22 caratteri, più il pad se presente.

Usando base64, possiamo produrre l'output codificato della nostra lunghezza desiderata (6, 8 o 10). Se scegliamo di decidere un output lungo 8 caratteri, occupa solo 8 byte mentre occupava 16 byte per un output hash a 128 bit.

Quindi, oltre alla sicurezza, la codifica base64 viene utilizzata anche per ridurre lo spazio consumato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.