Executando verificação de segurança...
Em resposta a Explicando Base64
10

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).

Carregando publicação patrocinada...