Ho sentito gente parlare di "codifica base 64" qua e là. A cosa serve?
Ho sentito gente parlare di "codifica base 64" qua e là. A cosa serve?
Risposte:
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.
È 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.
binary strings
. (fonte) php.net/manual/en/function.pack.php
La codifica Base-64 è un modo per prendere dati binari e trasformarli in testo in modo che sia più facilmente trasmesso in cose come e-mail e dati di moduli HTML.
È 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:
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.
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/
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
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”
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 ==”
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.
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.
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.
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.
utf8
tipo è ancora solo di tre byte; se vuoi la cosa reale, usa utf8mb4
. Bello hack, ma non è più necessario.
È usato per convertire dati binari arbitrari in testo ASCII.
Ad esempio, gli allegati di posta elettronica vengono inviati in questo modo.
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 )
“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 / "
Principalmente, l'ho visto usato per codificare i dati binari in contesti che possono gestire solo set di caratteri ASCII o semplici.
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.
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.
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.
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.