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:

  1. Converta o texto em sua representação binária.
  2. Divida os bits em grupos de 6 bits cada.
  3. Converta cada grupo em um número decimal no intervalo de 0 a 63 (pois cada grupo possui 6 bits no máximo).
  4. 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 = 24
  • 010110 = 22
  • 001001 = 9
  • 100011 = 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.