Todos os artigos
74 artigos · atualizado semanalmente Veja nossas Ferramentas
Todos os artigos
Tutoriais

O que é Base64? Guia direto ao ponto

Base64 converte dados binários em texto ASCII para que possam trafegar por protocolos que não aceitam bytes brutos. Entenda como funciona e quando usar.

COVER · Tutoriais

Base64 aparece em todo lugar — JWTs, data URLs, anexos de e-mail, payloads de API — mas a maioria dos devs só o usa sem entender o mecanismo. Isso não é problema até você precisar depurar um dado corrompido ou decidir se faz sentido embutir uma imagem de 200 KB como string numa resposta JSON. Saber como o algoritmo funciona de verdade cobre esses casos em segundos.

Este artigo explica o que é Base64, como o encoding acontece byte a byte, por que ele existe e quando você não deveria usá-lo. Se você quer comparar as ferramentas disponíveis para encode e decode online, tem um post irmão em /pt/blog/best-base64-tools com avaliação direta de cada uma.

O que é Base64

Base64 é um esquema de encoding que representa dados binários arbitrários usando apenas 64 caracteres ASCII: letras maiúsculas (A–Z), letras minúsculas (a–z), dígitos (0–9), mais + e /. O caractere = é usado como padding. O resultado é uma string que qualquer sistema capaz de lidar com texto comum consegue transmitir e armazenar sem corrupção.

O nome vem exatamente dessa quantidade: 64 símbolos distintos. Cada símbolo representa 6 bits de dados (2⁶ = 64). É importante entender que Base64 não é criptografia — não há chave, não há segredo. É apenas uma representação diferente dos mesmos dados. Qualquer um pode decodificar uma string Base64 sem nenhuma informação adicional.

Como funciona por dentro: o algoritmo passo a passo

O algoritmo opera sobre grupos de 3 bytes de entrada (24 bits) e os converte em 4 caracteres Base64 (24 bits também, mas agora todos na faixa ASCII segura de 6 bits cada).

Pegue a string Man:

  • M = byte 77 = binário 01001101
  • a = byte 97 = binário 01100001
  • n = byte 110 = binário 01101110

Concatene os 24 bits: 010011010110000101101110

Divida em grupos de 6 bits: 010011 010110 000101 101110

Esses valores decimais são 19, 22, 5 e 46. Consultando a tabela Base64:

  • 19T
  • 22W
  • 5F
  • 46u

Resultado: TWFu. Isso é exatamente o que qualquer biblioteca Base64 vai te dar para Man.

Se a entrada não for múltipla de 3 bytes, o algoritmo adiciona bytes nulos para completar o grupo e marca com = (um = para 2 bytes restantes, dois == para 1 byte restante). A string Hello tem 5 bytes — dois grupos, sendo o segundo incompleto — e vira SGVsbG8=.

Para quem quiser experimentar isso sem instalar nada, o Codificador Base64 do QuickEasy roda inteiramente no browser e mostra o resultado em tempo real.

Por que Base64 existe: protocolos que odeiam bytes brutos

O problema que Base64 resolve tem origem nos primeiros protocolos de comunicação. SMTP, o protocolo de e-mail, foi projetado para transportar texto ASCII de 7 bits. Bytes com o bit mais significativo em 1 (valores acima de 127) podiam ser alterados por servidores de relay que assumiam que estavam lidando com texto simples.

HTTP, embora mais tolerante, usa cabeçalhos que precisam de texto. JSON não tem tipo nativo para dados binários. HTML não tem atributo src que aceite bytes brutos. Então o padrão foi: converta o binário para uma representação em texto que sobreviva a qualquer canal de transporte.

Essa é a razão de existência do Base64. Não é eficiência — é compatibilidade. Você o usa porque o canal de destino tem restrições que impedem binário puro.

Usos reais no desenvolvimento

Data URLs em HTML e CSS: embutir imagens diretamente no HTML usando data:image/png;base64,... elimina um request HTTP para ícones pequenos. É um trade-off válido para assets de poucos KB que aparecem em todas as páginas.

Tokens JWT: o header e o payload de um JWT são strings Base64url (variante URL-safe). Não são criptografados por padrão — qualquer um que tenha o token consegue decodificar e ler o conteúdo do payload. A assinatura garante integridade, não confidencialidade. Esse equívoco causa bugs de segurança.

Anexos de e-mail (MIME): todo PDF, imagem ou arquivo que você envia por e-mail passa por Base64 encoding antes de ser transmitido como parte do body da mensagem. Seu cliente de e-mail decodifica automaticamente.

APIs REST transportando arquivos: quando um endpoint precisa aceitar um arquivo dentro de um payload JSON, a alternativa a multipart/form-data é encodar o conteúdo em Base64 e incluir como campo de string. É conveniente para arquivos pequenos; para arquivos grandes, multipart é muito melhor.

Armazenamento de dados binários em bancos relacionais: alguns sistemas armazenam imagens ou certificados em colunas TEXT como Base64. Funciona, mas BYTEA (PostgreSQL) ou BLOB (MySQL) são mais eficientes — armazenam binário nativo sem o overhead do encoding.

O overhead de 33%: por que o arquivo fica maior

Base64 converte cada 3 bytes em 4 caracteres. Isso significa que a saída é sempre ceil(n / 3) * 4 bytes, onde n é o tamanho original. Para qualquer entrada, o resultado é aproximadamente 33% maior.

Um PNG de 100 KB vira uma string Base64 de ~133 KB. Uma imagem de 1 MB vira ~1,33 MB. Esse overhead é real e tem impacto direto em tempo de transferência e uso de memória se você estiver manipulando strings grandes em JavaScript.

Além do tamanho, strings Base64 longas são opacos para ferramentas de diff, logging e debugging. Um binário inline de 500 KB num campo JSON vai aparecer como uma linha gigantesca nos seus logs. Considere isso antes de tomar a decisão de embutir.

Base64 padrão vs Base64 URL-safe

A variante padrão usa + e / como 62º e 63º caracteres. Esses dois caracteres têm significado especial em URLs — + é espaço encoded em application/x-www-form-urlencoded, e / separa segmentos de path.

A variante URL-safe (definida na RFC 4648) substitui + por - e / por _, e geralmente omite o padding =. Isso permite que a string resultante apareça em query strings, path parameters e cookies sem necessidade de percent-encoding adicional.

JWT usa Base64url. Quando você copiar um token JWT para uma URL sem converter para a variante correta, vai ter bugs difíceis de rastrear — o + vira espaço em alguns parsers e decodificação falha silenciosamente.

Quando não usar Base64

Base64 não faz sentido para transferência de arquivos grandes. Se o usuário está fazendo upload de um vídeo de 500 MB, usar Base64 encoding significa que você vai ter uma string de ~665 MB em memória no servidor antes de começar a processar. multipart/form-data existe exatamente para isso — permite streaming sem carregar tudo em memória.

Também não faz sentido quando o canal já suporta binário. WebSockets têm frames binários nativos. gRPC usa Protocol Buffers com suporte nativo a bytes. HTTP/2 e HTTP/3 são protocolos binários — o overhead de Base64 não agrega nada se você controla ambos os lados da comunicação.

E finalmente, Base64 não é uma medida de segurança. Dados sensíveis encodados em Base64 não estão protegidos — estão apenas em formato diferente. Se você precisa de confidencialidade, use criptografia real.

Perguntas frequentes

Base64 é o mesmo que criptografia?

Não. Base64 é encoding, não criptografia. Não há chave nem segredo envolvido. Qualquer pessoa com a string Base64 consegue decodificar e obter os dados originais instantaneamente. Se você precisa proteger informação, use AES, RSA ou outro algoritmo criptográfico de verdade.

Por que meu JWT tem um ponto no meio da string Base64?

Um JWT não é uma única string Base64 — é três strings Base64url separadas por pontos: header.payload.signature. Cada parte é independentemente encodada. O header descreve o algoritmo, o payload carrega as claims, e a assinatura é calculada sobre os dois primeiros.

Posso usar Base64 para armazenar senhas?

Definitivamente não. Base64 é reversível sem nenhuma informação adicional — é só uma representação diferente. Para senhas, use uma função de hash com salt como bcrypt, scrypt ou Argon2. Esses algoritmos são intencionalmente lentos e não reversíveis.

Por que a string Base64 às vezes termina com = ou ==?

O padding indica que a entrada não tinha múltiplo de 3 bytes. Um = significa que sobrou 1 byte no último grupo (2 caracteres reais + 2 padding), e == significa que sobraram 2 bytes (3 caracteres reais + 1 padding). Na variante URL-safe, o padding é geralmente omitido porque o decodificador consegue inferir pelo tamanho da string.

Quando o conhecimento faz diferença

Entender Base64 como um mecanismo — não como mágica — muda como você depura problemas de encoding. Quando um payload JSON chega corrompido, você sabe verificar se houve conversão acidental de + para espaço. Quando um JWT não valida, você sabe checar se a variante URL-safe foi usada corretamente. Quando alguém sugere embutir imagens em Base64 em todas as respostas de API, você tem os números para contra-argumentar: 33% de overhead, tudo em memória, sem possibilidade de cache separado. O formato é simples; as consequências de usá-lo errado não são.

RD
Autor
Rafael Duarte
Desenvolvedor backend com passagem por fintech e SaaS B2B — trabalhou em times que escalaram APIs de zero a milhões de requisições. Carrega cicatrizes de produção suficientes para ter opiniões fortes sobre ferramentas, padrões e decisões de arquitetura. Não é acadêmico: leu a RFC do UUID quando precisou escolher entre v4 e v7 para uma tabela de alta escrita.
Ver perfil