Explicando Base64
O texto abaixo é uma reescrita/resumo do blog post presente na fonte
O que é codificação Base64?
A codificação Base64 transforma dados binários em texto, especificamente em texto ASCII. O texto gerado consiste apenas de letras A-Z
, a-z
, números de 0-9
e os símbolos +
e /
. Esta codificação é chamada de Base64 devido aos seus 64 caracteres seguros, que não são suscetíveis a interpretações errôneas por computadores e programas legados, ao contrário de caracteres como <
e outros.
É importante destacar que a Base64 não criptografa o texto, apenas altera a representação dos dados. Dados codificados em Base64 podem ser facilmente decodificados para o texto original. A Base64 utiliza 6 bits para representar cada um dos 64 caracteres disponíveis, pois 2^6 = 64
. Cada caractere Base64 representa 6 bits de dados. Como 8 bits equivalem a um byte, o múltiplo comum mais próximo entre 8 e 6 é 24. Portanto, 24 bits (ou 3 bytes) podem ser representados por quatro caracteres Base64 de 6 bits.
Por que Base64?
Para incorporar imagens diretamente em um documento HTML, você pode usar URLs de dados que permitem a inclusão de dados de imagem em Base64. Isso evita a necessidade de vincular a arquivos externos. A sintaxe é a seguinte:
<img src="data:image/gif;base64,xxxxbase64encodedtextxxxx">
data:[<mime type>][;charset=<charset>][;base64],<encoded data>
Isso é útil quando se precisa transmitir dados binários como texto, garantindo que permaneçam intactos durante a transmissão, e quando os dados contêm caracteres incompatíveis com URLs. A codificação Base64 também é amplamente usada para manipular objetos em editores de texto e transferir arquivos como texto, codificando-os em Base64 e decodificando-os no lado receptor. Aprofundaremos esse algoritmo na próxima seção.
Algoritmo de codificação para Base64
Algoritmo simples para codificar texto em Base64:
- Converta o texto em sua representação binária.
- Divida os bits em grupos de 6 bits cada.
- Converta cada grupo em um número decimal no intervalo de 0 a 63 (pois cada grupo possui 6 bits no máximo).
- Mapeie o número decimal para o caractere equivalente na tabela Base64.
Dessa forma, você obtém uma string codificada em Base64. Se o grupo final tiver menos de 6 bits, você pode preenchê-lo com um ou dois caracteres =
para garantir que o comprimento da codificação seja um múltiplo de 4.
Exemplo do algoritmo
Passo 1: Conversão da string 'abc' para representação binária:
A primeira etapa é converter os caracteres 'a', 'b' e 'c' em sua representação binária de acordo com a tabela ASCII. Aqui estão as representações binárias de 'a', 'b' e 'c' em ASCII:
- 'a' =
01100001
- 'b' =
01100010
- 'c' =
01100011
Agora, concatenamos essas representações binárias para formar uma única sequência de bits:
011000010110001001100011
Passo 2: Divisão dos bits em grupos de 6 bits:
Agora, dividimos a sequência de bits em grupos de 6 bits cada:
011000 010110 001001 100011
Passo 3: Conversão de grupos em números decimais de 0 a 63:
Cada grupo de 6 bits é convertido em um número decimal. O valor decimal pode variar de 0 a 63, já que estamos usando 6 bits. Vamos converter cada grupo:
011000
= 24010110
= 22001001
= 9100011
= 35
Passo 4: Mapeamento para caracteres Base64:
Agora, mapeamos esses números decimais para os caracteres correspondentes na tabela Base64. A tabela Base64 possui os seguintes caracteres:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Agora, mapeamos os números decimais:
- 24 é mapeado para 'Y'
- 22 é mapeado para 'W'
- 9 é mapeado para 'J'
- 35 é mapeado para 'j'
Portanto, a string abc
em Base64 é codificada como YWJj
.
Assim, a conversão da string abc
em Base64 resulta em YWJj
.
Muito bom, principalmente por reforçar que Base64 não é criptografia (já vi muita gente que acha que é).
Complementando, um dos primeiros usos da Base64 foi em sistemas de email, mais precisamente no protocolo PEM (Privacy-enhanced Eletronic Mail). Isso porque só eram permitidos caracteres ASCII, e a conversão para Base64 permitia que qualquer tipo de conteúdo binário fosse enviado (por exemplo, em anexos do email).
Enfim, Base64 é uma forma genérica de converter quaisquer bytes em um subconjunto de ASCII, permitindo a transmissão dos dados sem perda ou corrupção destes (assumindo que o sistema que vai processar tais dados não tenha suporte adequado a caracteres não-ASCII, pois caso tenha, a conversão seria desnecessária).
Vale lembrar também que, por causa do algoritmo (no qual 3 bytes são convertidos em 4 bytes), o tamanho do conteúdo em Base64 será 1,333… vezes maior que o original.
Por fim, existem algumas variações do formato, nas quais os caracteres +
e /
são substituídos por outros (por exemplo, por -
, _
ou ,
), além do =
no fim ser opcional. Em outros há uma quebra de linha obrigatória a cada 64 caracteres (como é o caso do PEM).
E como curiosidade, existem vários formatos que usam uma ideia similar (limitam a saída a um conjunto fixo de valores), como o Base16, Base32, Base85, entre outros.
Quanto aos exemplos, sei que a ideia foi ser didático e usar ASCII para simplificar, mas vale lembrar que a mesma string pode resultar em bytes diferentes, dependendo do encoding usado. Segue um exemplo em Python para ilustrar:
from base64 import b64encode
s = 'abc'
for enc in [ 'ascii', 'utf-8', 'utf-16', 'utf-32']:
print(f'{enc:7}= {b64encode(s.encode(enc))}')
Primeiro eu converti os caracteres da string para um encoding específico, e depois os bytes resultantes são passados para b64encode
, que faz a codificação para Base64. O resultado é:
ascii = b'YWJj'
utf-8 = b'YWJj'
utf-16 = b'//5hAGIAYwA='
utf-32 = b'//4AAGEAAABiAAAAYwAAAA=='
Isso porque, em cada encoding, um mesmo caractere pode resultar em bytes diferentes. E como Base64 codifica bytes (e não caracteres), o resultado pode ser diferente, dependendo do encoding usado.
Essa é uma distinção importante: Base64 converte bytes, e só. O que esses bytes significam é indiferente para o algoritmo (se eram caracteres, uma imagem, vídeo, ou se foram gerados aleatoriamente, não importa).
Quem está convertendo para Base64 (e também quem está convertendo de volta aos bytes originais) é que deve saber o que são esses bytes (se é um texto em ASCII ou em algum outro encoding, por exemplo).
A explicação sobre a codificação Base64 é clara e informativa. Ela descreve o que é Base64, por que é usado e fornece um algoritmo simples para a codificação, acompanhado de um exemplo prático. É uma ótima introdução para quem deseja entender o conceito de Base64 e como ele é aplicado.
Caraca, que curiosidade sensacional! Não sabia muito sobre o Base64, e foi muito gratificante saber sobre.