Base64

7 tools

O que é codificação?

A codificação é o processo de converter dados de uma representação para outra. No desenvolvimento web, a codificação é usada para transmitir dados com segurança através de canais projetados para um conjunto de caracteres limitado.

A codificação de caracteres define como os caracteres de texto mapeiam para bytes. A codificação Base64 converte dados binários em texto ASCII. A codificação URL torna o texto arbitrário seguro para uso em URLs.

História da codificação de caracteres

A codificação de caracteres é o mapeamento entre caracteres e suas representações binárias:

ASCII1963
128 caracteres

Código Padrão Americano de 7 bits. 128 caracteres: letras inglesas, dígitos, pontuação e códigos de controle.

Latin-11987
256 caracteres

ASCII estendido para línguas da Europa Ocidental. Adicionou 128 caracteres. Não adequado para scripts não latinos.

Unicode1991
149 186+ caracteres

Conjunto de caracteres universal cobrindo todos os sistemas de escrita do mundo. Define pontos de código para mais de 149.000 caracteres.

UTF-81993
Todo Unicode caracteres

Codificação de largura variável do Unicode usando 1–4 bytes por caractere. Compatível com ASCII. A codificação dominante na web.

UTF-161996
Todo Unicode caracteres

Codificação de largura variável usando 2 ou 4 bytes por caractere. Usado internamente pelo Windows, Java e strings JavaScript.

UTF-322000
Todo Unicode caracteres

Codificação de largura fixa: sempre 4 bytes por caractere. Raramente visto na web.

Por que o UTF-8 ganhou

O UTF-8 tornou-se dominante porque é compatível com ASCII, é autossincronizante e eficiente em espaço para texto latino. Qualquer documento ASCII é um documento UTF-8 válido.

Codificação Base64

Base64 converte dados binários em uma representação de texto usando apenas 64 caracteres ASCII imprimíveis. Isso é necessário quando dados binários devem viajar através de canais que só lidam com texto.

Como funciona

Base64 agrupa os bytes de entrada em blocos de 3 bytes e codifica cada bloco como 4 caracteres Base64. Se a entrada não for múltipla de 3 bytes, caracteres de preenchimento = são adicionados:

EntradaBytes hexBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

Os caracteres de preenchimento = indicam quantos bytes faltavam para completar o último grupo de 3 bytes. O Base64 padrão sempre produz saída com comprimento múltiplo de 4.

Codificação URL

URLs só podem conter um conjunto limitado de caracteres ASCII seguros. Qualquer caractere fora desse conjunto deve ser codificado em porcentagem antes de ser colocado em uma URL.

A codificação de porcentagem substitui cada byte inseguro por % seguido de dois dígitos hexadecimais representando o valor desse byte.

Caracteres comumente codificados

CaractereCodificadoNotas
Space%20Mais comum; usado em envios de formulário como + em application/x-www-form-urlencoded
&%26Separador de string de consulta; deve ser codificado quando usado como valor literal
=%3DSeparador chave-valor em strings de consulta; codificar quando usado como dado
+%2BInterpretado como espaço em application/x-www-form-urlencoded; codificar para preservar +
#%23Identificador de fragmento; codificar quando usado como dado literal
/%2FSeparador de segmento de caminho; codificar quando usado como dado literal
:%3ASeparador de esquema; codificar em contextos de caminho e consulta
@%40Usado em mailto: e auth; codificar quando usado como dado literal

encodeURI vs encodeURIComponent

JavaScript fornece duas funções de codificação com escopos diferentes. encodeURI codifica uma URL completa. encodeURIComponent codifica um componente de URL — codifica todos os caracteres exceto A-Z, a-z, 0-9, -, _, ., ~.

Onde a codificação aparece no desenvolvimento web

Autenticação Básica HTTP

O cabeçalho Authorization: Basic codifica credenciais como Base64(usuário:senha). Isso é codificação para conveniência de transporte, NÃO segurança. Sempre use HTTPS com Basic Auth.

URIs de dados

URIs de dados incorporam conteúdo de arquivo diretamente em HTML ou CSS: data:image/png;base64,.... Codificar imagens elimina solicitações HTTP.

Anexos de e-mail MIME

O e-mail foi projetado para ASCII de 7 bits. Anexos binários são codificados em Base64 pelo MIME antes da transmissão.

Tokens JWT

Os tokens JWT usam codificação Base64url para as três partes. Isso torna os tokens seguros para URLs.

Parâmetros de string de consulta

Qualquer dado fornecido pelo usuário em strings de consulta URL deve ser codificado em porcentagem.

Nomes de domínio internacionalizados

Nomes de domínio não ASCII são codificados usando Punycode (prefixo xn--) para compatibilidade com o sistema DNS.

Perguntas frequentes

Base64 é uma forma de criptografia?

Não. Base64 é codificação, não criptografia. É uma transformação reversível sem chave secreta. Nunca use Base64 como medida de segurança.

Por que a saída Base64 às vezes termina em ==?

Base64 processa entrada em grupos de 3 bytes. Se a entrada não for múltipla de 3, preenchimento = é adicionado.

Qual é a diferença entre Base64 e Base64url?

Base64url é uma variante segura para URLs que substitui + por - e / por _, e tipicamente omite o preenchimento =. Os JWTs usam Base64url.

Quando devo usar encodeURI vs encodeURIComponent?

Use encodeURIComponent para valores individuais. Use encodeURI para uma string URL completa onde você quer preservar os caracteres de estrutura de URL.

Por que UTF-8 é melhor que UTF-16 para a web?

UTF-8 é compatível com ASCII e eficiente em espaço para texto latino. HTTP e HTML usam UTF-8 por padrão.

O que é codificação de porcentagem?

A codificação de porcentagem representa caracteres como % seguido de seu valor de byte hexadecimal. Um espaço é %20.

A codificação afeta o desempenho?

Base64 aumenta o tamanho dos dados em ~33% e adiciona sobrecarga de CPU. A codificação URL adiciona sobrecarga mínima.

O que é Punycode?

Punycode é uma codificação para representar caracteres Unicode no sistema DNS compatível com ASCII. Domínios como münchen.de se codificam como xn--mnchen-3ya.de.