Base64

De Viquipèdia
Dreceres ràpides: navegació, cerca

Base 64 és un sistema de numeració posicional que fa servir 64 com a base. És la major potència de dos que pot ser representada usant únicament els caràcters imprimibles de ASCII. Això ha propiciat el seu ús per codificació de correus electrònics, PGP i altres aplicacions. Totes les variants famoses que es coneixen amb el nom de Base64 usen el rang de caràcters AZ, az i 0-9 en aquest ordre per als primers 62 dígits, però els símbols escollits per als últims dos dígits varien considerablement d'unes a altres. Altres mètodes de codificació com UUENCODE i les últimes versions de binhex usen un conjunt diferent de 64 caràcters per a representar 6 dígits binaris, però aquests mai són anomenats Base64.


Esquemes de codificació a base 64[modifica | modifica el codi]

Protocol Privacy-Enhanced Electronic Mail (PEM)[modifica | modifica el codi]

La primera aplicació coneguda de la codificació Base 64 per a transmissions electròniques de dades va ser el protocol Privacy-enhanced Electronic Mail (PEM), proposat pel RFC 989 el 1987. PEM defineix un esquema de caràcters imprimibles que utilitza Base 64 per transformar una secuenca arbitrària d'octets en un format que pot ser expressat en línies curtes de caràcters de 7 bit s, com ara les necessàries en protocols de transmissió com SMTP.

La versió actual de PEM (especificada en el RFC 1421) fa servir un alfabet de 64 caràcters consistent en els caràcters en majúscula i minúscula de l'alfabet llatí (AZ, az), els numerals (0-9) i els símbols '+'i'/'. El símbol '=' s'usa com un sufix especial. L'especificació original (RFC 989) fa servir més el caràcter '*' per delimitar la part codificada però no xifrada del flux de sortida.

Per transformar dades en una codificació PEM imprimible, el primer byte se situa en els 8 bits més significatius d'un memòria intermèdia de 24 bits, el següent en els 8 de al mig i el tercer en els de menor pes. Si hi ha menys de 3 bytes per codificar, la resta de la memòria intermèdia s'omple amb zeros. En aquest punt, la memòria intermèdia s'usa de manera que es van extraient 6 bits des de la part més significativa per a ser usats com a índex dins de la cadena: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", de manera que el caràcter indicat serà la sortida.

Aquest procés es repeteix amb les dades restants fins que quedin menys de quatre octets. Si queden tres, es processen de forma normal, mentre que si queden menys de 3 bytes (24 bits), l'entrada s'omplirà amb zeros per la dreta per formar un múltiple de 6 bits.

Després de codificar les dades, si en el pas anterior quedaven 2 octets per codificar, llavors s'afegeix el caràcter '=' al final de la sortida, si només quedava un octet, es concatena dos caràcters '= '. Això avisa el descodificador que els bit sa 0 que s'hagin afegit de farciment no han de formar part de les dades reconstruïts.

PEM necessita que totes les línies codificades estiguin formades exactament per 64 caràcters imprimibles, amb l'excepció de l'última, que pot contenir menys. Les línies estaran delimitades per caràcters d'espai en blanc d'acord amb les convencions específiques de la plataforma.

MIME[modifica | modifica el codi]

L'especificació MIME (Multipurpouse Internet Mail Extensions) definida en el RFC 2045, descriu base64 com un dels sistemes de codificació de binari a text. L' base64 de MIME es basa en la versió de PEM que es descriu en el RFC 1421: utilitza el mateix alfabet de 64 caràcters i el mateix mecanisme de codificació, igual que fa servir el símbol '=' per assenyalar el farcit final, com es descriu en el RFC 1521.

MIME no especifica una mida fixa per a les línies codificades en base64 , però sí que cal una mida màxima de 76 caràcters. A més, concreta que qualsevol caràcter que no pertanyi a l'alfabet ha de ser ignorat pels descodificadors, encara que moltes implementacions fan servir els caràcters CR/LF (retorn de carro i salt de línia) per delimitar les línies codificades. D'aquesta manera, la mida real de les dades codificades d'acord amb MIME sol ser d'un 140% de la mida original.

UTF-7[modifica | modifica el codi]

UTF-7, descrit en el RFC 2152, va introduir un sistema anomenat Modified Base64 (Base64 Modificat). Aquest esquema de codificació s'usa per codificar UTF-16 com caràcters ASCII per a ser usats en transmissions de 7 bits com en SMTP. És una variant del base64 usat en MIME.

L'alfabet de Base64 Modificat consisteix en l'alfabet de base64 usat en MIME, però no fa servir el caràcter '='. UTF-7 es va pretendre fer servir per a les capçaleres dels correus (definit en RFC 2047), i el caràcter '=' es reserva en aquest context com a caràcter d'escapament per codificació Quoted-Printable. Base 64 Modificat simplement omet el farcit i acaba immediatament després de l'últim dígit BASE64 que conté bits útils (deixant els 0-4 bits inútils de l'últim dígit base64 ).

OpenPGP[modifica | modifica el codi]

OpenPGP, descrit en el RFC 2440, utilitza la codificació Radix-64 , també coneguda com a ASCII Armor . Radix-64 és idèntic a base64 de MIME, excepte en que afegeix una suma de verificació CRC de 24 bit s. Aquesta suma es calcula sobre les dades d'entrada, abans de codificar, i posteriorment es codifica amb el mateix base64 per ser concatenada a la codificació resultant.

IRCu[modifica | modifica el codi]

En el protocol P10 de servidor-servidor utilitzat pel dimoni IRC IRCu i programari compatible, s'usa una versió de Base 64 per codificar les dades numèriques de client/servidor i de les adreces IP binàries. Aquestes dades numèriques de la comunicació entre el client i el servidor tenen mides fixos, amb un nombre exacte de dígits base64 , de manera que no cal omplir. Les adreces IP binàries tenen bit sa 0 pel començament per fer-les encaixar. El símbol utilitzat és una mica diferent a l'usat en l'alfabet de MIME, utilitzant "[]" en lloc de "+/"per evitar conflictes amb altres parts del protocol que fan servir el caràcter '+' internament com a indicador d'establiment de maneres.

RFC 3548[modifica | modifica el codi]

RFC 3548 (Les codificacions base16, Base32 i Base64) és un document informal (no-normatiu) que tracta d'unificar les especificacions RFC 1421 i RFC 2045 de base64 , codificacions amb alfabets alternatius i les codificacions rarament usades Base32 i base16.

RFC 3548 prohibeix a les implementacions afegir caràcters no alfabètics i estableix que els descodificadors han de rebutjar dades que continguin caràcters no alfabètics, tot això si no estan previstos en una especificació que es refereixi a aquesta o que, en tot cas, la requereixi.

RFC 4648[modifica | modifica el codi]

Aquest RFC fa obsolet al RFC 3548 i es refereix al mateix tema:

Aquest document descriu les codificacions base 64, base 32 i base 16 usades comunament i tracta qüestions com l'ús de salts de línia, farcits, amb caràcters no alfabètics en les dades codificades i la utilització d'altres alfabets i codificacions canòniques.

Exemple[modifica | modifica el codi]

Una cita de Thomas Hobbes pertanyent a l'obra Leviathan:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a Lust of the mind, that by a Perseverance of delight in the continued and Indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

es codifica en base64 la manera següent:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 =

A la cita de dalt el valor codificat de Man és TWFu. Codificades en ASCII, les lletres: M, a i n són emmagatzemades com els bytes 77, 97 i 110, és a dir, 01.001.101, 01.100.001, 01.101.110 en base 2.

Ara aquests tres bytes s'uneixen i tenim el buffer de 24 bits, que serà 010011010110000101101110. Aquest nombre es convertirà al seu valor base 64, que es pot fer prenent blocs de 6 bits a la vegada (6 bits formen com a màxim 64 valors diferents en binari: 2 6 ). A continuació, agafant cada vegada 6 bits de la memòria intermèdia, tenim 4 números (24 = 6 x 4), que llavors es converteixen al seu corresponent valor en base 64.

Text d'entrada M a n
ASCII 77 97 110
Bits 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Índex 19 22 5 46
Resultat en Base64 T W F o

Per tant, 3 bytes sense codificar (en aquest cas, caràcters ASCII) entren i 4 caràcters ASCII codificats sorgeixen com a resultat.

Il·lustració del marcat de farciment acord escurcem l'entrada:

L'entrada acaba amb  carnal pleasure.  La sortida acaba amb: c3VyZS4 =
L'entrada acaba amb  carnal pleasure  La sortida acaba amb: c3VyZQ ==
L'entrada acaba amb  carnal pleasur  La sortida acaba amb: c3Vy
L'entrada acaba amb  carnal pleasu  La sortida acaba amb: c3U =

Aplicacions en URL[modifica | modifica el codi]

La codificació Base64 pot ser útil quan la mida de la informació d'identificació usada en un entorn https bastant gran. El framework de base de dades per a objectes persistents anomenat Hibernate per al llenguatge de programació Java fa servir Base64 per a codificar una ID única relativament gran (generalment UUIDs de 128 bit s) dins d'una cadena de text per a ser usada com a paràmetre http en els formularis o en la manera de transmissió GET. També, gran quantitat d'aplicacions necessiten codificar dades binàries de manera que puguin ser introduïts en les URL, així com en els camps ocults dels formularis. Base64 resulta adequat per a aquests propòsits, ja que a més de transformar en una cadena compacta, oculta la naturalesa de les dades davant possibles observadors.

L'ús d'un codificador d'URL sobre Base64 estàndard, però, no és adequat, ja que traduirà els caràcters '+' i '/' en les seqüències especials en hexadecimal% XX ('+' = '% 2B' i '/' = '% 2F'). Si posteriorment es fa servir per a emmagatzematge en base de dades o entre sistemes heterogenis, produiran un conflicte en el caràcter '%' generat pel codificador d'URL (pel fet que aquest caràcter és usat en ANSI SQL com a comodí).

Per això hi ha un Base64 Modificat per URL , on no s'usa el caràcter '=' de marcat de farciment, i els caràcters '+' i '/' del Base64 estàndard són substituïts per '*' i '- 'respectivament, de manera que ja no es necessita utilitzar codificadors d'URL. A més, no té impacte en la mida de la codificació, deixant intacta per a ús en base de dades relacionals, formularis web i identificadors d'objectes en general.

Una altra variant, anomenada Base64 Modificat per expressions regulars , usa "! -" en lloc de "*-" per substituir el "+/"del Base64 estàndard, pel fet que, tant '+' com '*' són caràcters reservats per les expressions regulars (cal ressaltar que el "[]" usat en la variant IRCu explicada dalt no funcionarà en aquest context).

També hi ha altres variants que usen "_-" o ". _" Quan la cadena codificada serà usada com a identificador vàlid per a programes, o ".-" quan s'usa per als tokens de XML ( Nmtoken ), o fins i tot "_:" per ser usada en un els identificadors més restrictius de XML ( Name ).

Altres aplicacions[modifica | modifica el codi]

Base64 s'usa també per a altres aplicacions, com:

  • Thunderbird i Evolution fan servir Base64 per ofuscar les contrasenyes de correu electrònic.
  • Ofuscació insegura però ràpida d'informació privada sense la necessitat de la gestió de claus de la criptografia.
  • Els spammers fan servir Base64 per evitar algunes proteccions anti-spam, que no solen descodificar Base64 i, per tant, no poden detectar paraules prohibides en els missatges codificats.
  • Codificació de cadenes de caràcters en fitxers LDIF.
  • Incorporació de dades binaris en fitxers XML, usant una sintaxi similar a <Dades encoding="base64"> ....... Per exemple, els marcadors de Firefox emmagatzemats en bookmarks.html .
  • En el llenguatge CSS es pot, literalment, escriure una imatge en base64 en comptes de carregar una imatge des d'un servidor.

Un exemple programàtic[modifica | modifica el codi]

A continuació es mostra un exemple de com codificar i descodificar un text usant Base64. L'exemple que es mostra està escrit en el llenguatge de programació Python

>>> Import base64
>>> Text = "Prova de codificació BASE64 !"
>>> TextoCodificado = base64.encodestring (text)
>>> TextoCodificado
'UHJ1ZWJhIGRlIGNvZGlmaWNhY2nDs24gQkFTRTY0IQ == \n'
>>> Base64.decodestring (textoCodificado)
'Prova de codificació BASE64 !'

A php també es permet l'ús de base64, en el següent exemple podem veure com es codifica/decodifica en base64 amb PHP:

<? Php
$ Text = "Hola món";
$ Codificat = base64_encode ($ text);
$ Descodificat = base64_decode ($ codificat);
echo $ descodificat. "<br/>";//Es mostra Hola món
echo $ codificat;//Es mostra SG9sYSBtdW5kbw ==
?>

Vegeu també[modifica | modifica el codi]

Enllaços externs[modifica | modifica el codi]