Command Palette

Search for a command to run...

Explicação da codificação de base64: codificar e decodificar como um profissional

Explicação da codificação de base64: codificar e decodificar como um profissional

T
Toolz Team
|Jun 18, 2026|15 min ler

Parte da coleção codificação

A primeira versão do conversor Base64 que enviei no Toolz.dev tinha um bug com o qual I' ainda estou um pouco envergonhado. Funcionou perfeitamente em todos os testes que escrevi - codificado, decodificado, de ida e volta, pronto. Então alguém colou texto contendo um emoji e conseguiu isso:

Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.

Eu construí uma ferramenta de codificação de texto e esqueci que o texto inclui, você sabe, A maioria dos textos. Cada script não-latino, cada caractere acentuado, cada emoji - quebrado Meus testes foram todos ASCII porque EU acho que em ASCII. Esse bug me ensinou mais sobre Base64 do que qualquer leitura de especificações fez, e I & #39; vai mostrar-lhe a correção mais tarde, porque ele tropeça quase todo mundo que toca btoa().

Base64 é uma daquelas coisas que os desenvolvedores usam diariamente - dentro de cada JWT, cada anexo de e-mail, cada data: URI - embora raramente olhando sob o capô. Let's olhar sob o capô.

tl;dr: A codificação Base64 converte dados binários em 64 caracteres ASCII seguros para que possa viajar através de canais somente de texto, como JSON, URLs e e-mail - ao custo de ~ 33% de sobrecarga de tamanho. e não Criptografia; qualquer pessoa pode revertê-la instantaneamente. Para codificar ou decodificar agora, use o lado do cliente gratuito conversor de base64 no Toolz.dev - seus dados nunca saem do navegador, o que importa quando você & #39;re decodificando tokens.


O que é a codificação Base64?

Base64 é um esquema de codificação binário para texto: representa bytes arbitrários usando apenas 64 caracteres que sobrevivem a todos os sistemas de texto já construídos. A especificação autoritária é RFC 4648 (2006), embora a codificação remonte à RFC 1421 e ao Privacy Enhanced Mail em 1993 - o Base64 é mais antigo que o navegador da web.

O alfabeto:

  • A–Z → Valores 0–25
  • a–z → Valores 26–51
  • 0–9 → Valores 52–61
  • + → 62, / → 63
  • = → preenchimento (não é um valor, apenas preenchimento)

Por que esses 64? Porque eles sobrevivem sem serem misturados em ASCII, EBCDIC e todos os gateways de e-mail já construídos. Base64 é um tratado de paz com décadas de infraestrutura exclusiva para texto.

O custo do tratado: cada 3 bytes de entrada tornam-se 4 caracteres de saída - um imposto fixo de tamanho de 33%. Mantenha esse número na cabeça; ele decide questões reais de arquitetura.


Como funciona o algoritmo Base64?

Resposta mais curta do que você'd espera: reagrupe bits de 8 s em 6 s, então procure-os em uma tabela. 26 = 64 - that' s de onde vem o nome.

codificação Hi!:

Passo 1 - bytes para bits.

personagem ascii binário
me 72 01001000
eu 105 01101001
! 33 00100001

Concatenado: 010010000110100100100001- 24 bits.

Passo 2 - reagrupe-se em pedaços de 6 bits.

010010 | 000110 | 100100 | 100001
  18   |   6    |   36   |   33

Passo 3 - procure cada valor do alfabeto.

18 → S, 6 → G, 36 → k, 33 → h. por isso Hi! codifica para SGkh.

Esse é o algoritmo inteiro. Nenhuma matemática além de uma tabela de pesquisa.

estofamento Lida com entradas que não são múltiplos de 3 bytes. codificar apenas Hi (2 bytes = 16 bits) e você só pode preencher grupos de 6 bits e dois e um; o codificador zera os bits e anexos = Para sinalizar o quanto é preenchimento:

Hi  → SGk=    (2 bytes remaining → one '=')
H   → SA==    (1 byte remaining  → two '==')
Hi! → SGkh    (multiple of 3     → no padding)

Quando EU implementei isso para o conversor Toolz.dev, o preenchimento era onde todos os meus bugs off-by-one viviam Se você já rolar manualmente o Base64 - para uma entrevista de codificação, digamos - escreva os testes de preenchimento primeiro.

Decodificação é a imagem espelhada: caracteres de volta aos valores de 6 bits, reagrupam-se em bytes de 8 bits, soltam o preenchimento.

Base64 encoding process diagram showing binary conversion, 6-bit grouping, and character mapping


Onde você realmente encontra o Base64?

JWTs - o grande

Cada JSON Web Token tem três segmentos codificados em base64URL unidos por pontos: cabeçalho, carga útil, assinatura. A autenticação de depuração é 50% decodificando isso.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

Decodifique o primeiro segmento e você terá {"alg":"HS256","typ":"JWT"}. O segundo fornece as reivindicações. Meu fluxo de trabalho quando um token se comporta mal: dividir os pontos, decodificar cada parte do conversor de base64, depois cole o JSON no formatador json para lê-lo corretamente. duas pastas, e você sabe se o exp A afirmação é o seu problema.

Vale a pena dizer claramente: as cargas JWT são Legível por qualquer pessoa que possua o token. A assinatura para de adulterar, não ler. Eu revisei as bases de código que colocaram dados confidenciais em reivindicações porque o improviso parece privacidade implícita. não.

JWT being decoded with Base64 converter showing header, payload, and signature parts

dados uri

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

Incorporar pequenos ativos embutidos salva uma solicitação HTTP. Minha regra de construção de interfaces de usuário do WordPress com imagens pesadas: vale a pena abaixo de ~5 KB, com mais de 10 KB, você está inchando o documento em 33% para salvar uma solicitação de multiplexes HTTP/2 de qualquer maneira.

Segredos Kubernetes - e um discurso retórico

apiVersion: v1
kind: Secret
data:
  password: cGFzc3dvcmQ=   # decodes to "password"

Kubernetes Secrets são codificados por Base64, e a falsa segurança que isso implica é alarmante Esse valor decodifica em uma pasta Base64 aqui existe para que os valores binários sobrevivam ao YAML - a formatação Decisão, não de segurança. Se a história de sua segredo termina em "Eles são base64 em etcd", não começou.

o resto da lista

Cabeçalhos de autenticação básicos do HTTP (Authorization: Basic dXNlcjpwYXNz decodifica para simples user:pass- daí HTTPS-somente).Email anexos via MIME. blobs binários dentro JSON cargas úteis, porque JSON não tem tipo binário.


A criptografia base64 é a criptografia? (Não. Por favor, não.)

Vale a sua própria seção porque o equívoco se recusa a morrer.

base64 é um representação, como escrever um número em hexadecimal. nenhuma chave. Nenhum segredo. A decodificação não requer nada além da tabela do alfabeto impressa publicamente no RFC 4648. Qualquer coisa base64-&quot;protegida&quot; é protegida da maneira que uma letra é protegida por ser escrita em letra cursiva.

Se os dados necessitarem de sigilo: criptografar adequadamente (AES-GCM ou Libsódio), então Base64-codificar o texto cifrado se o canal precisa de texto Codificação e criptografia compor bem - eles são apenas & #39; t substitutos.E se você precisa de integridade em vez de sigilo, que & #39; s um hash & #39; s trabalho - o gerador de haxixe Cobre SHA-256 e amigos.


Como Base64 se compara a hexadecimal, codificação de URL e base85?

base64 Hex (base16) URL/codificação por cento ascii85
tamanho superior +33% +100% 0–200%, dependente do conteúdo +25%
alfabeto 64 caracteres 16 caracteres ASCII + %XX fugas 85 caracteres
Saída legível por humanos não Tipo de limites de bytes visíveis Principalmente, para entrada ASCII não
url-seguro por padrão não (+, /, =) sim Sim, por definição não
você vai encontrá-lo em JWTS, MIME, URIs de dados Hashes, endereços MAC, códigos de cores strings de consulta internos de pdf

Como eu escolho: bruxa quando os humanos lerão ou compararão a saída - somas de verificação, resumos, qualquer coisa depurada pelo globo ocular. codificação por cento Para texto de url, nunca binário. base64 para cruzamento binário de um canal de texto - a maioria dos casos reais. ascii85 Nunca voluntariamente; a economia de 8% ainda não justifica as questões de compatibilidade.


O que é o Base64 seguro para url e por que ele existe?

O padrão Base64 tem um problema: + significa "espaço" em strings de consulta, / é o separador de caminho, = delimita parâmetros Coloque um token padrão-Base64 em uma URL e algum middleware, em algum lugar, irá mangle-lo - intermitentemente, e apenas em produção Pergunte-me como EU sei.

A Seção 5 do RFC 4648 define a correção, geralmente chamada de base64url:

padrão url-seguro
+ -
/ _
= estofamento geralmente apenas omitido

Mesmo algoritmo, dois caracteres trocados, preenchimento descartado JWTs usam Base64URL exclusivamente - é exatamente por isso que colar um segmento JWT em um decodificador padrão estrito-Base64 às vezes falha em um stray - ou _. o Conversor Toolz.dev Lida com as duas variantes, porque um decodificador que rejeita metade do Base64 do mundo real não é muito de um decodificador.

Regra geral: se a string codificada tocar em um URL, nome de arquivo ou cabeçalho HTTP, use a variante de URL-safe desde o início. Retrofitting é um achado e substituído mais uma oração.


Como você codifica e decodifica no código?

JavaScript - a armadilha em que caí

Aqui está a versão ingênua, a que enviei:

btoa('Hello')      // "SGVsbG8=" — great!
btoa('café ☕')    // InvalidCharacterError — the bug from my intro

btoa Antecede o manuseio moderno do Unicode e aceita apenas o latim-1. A abordagem moderna correta passa por bytes UTF-8 explicitamente:

// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes));   // "Y2Fmw6kg4piV"

// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
  Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"

(No node.js, pule a cerimônia: Buffer.from(str, 'utf8').toString('base64').)

píton

import base64

encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')

# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')

Python torna a coisa certa óbvia: você ser necessário Passe bytes, para que a etapa de codificar para utf-8 não possa ser esquecida. eu desejo btoa foi projetado com a mesma coluna.

php

$encoded = base64_encode('café ☕');   // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);

// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');

que strtr/rtrim A linha apareceu em todas as bases de código do PHP em que já trabalhei, incluindo o WP Adminify. O PHP nunca obteve uma variante integrada à segurança de URL, então todos nós continuamos escrevendo as mesmas duas linhas.


Perguntas frequentes

Para que serve a codificação Base64?

Ele converte dados binários em texto ASCII para que possa passar por sistemas que lidam apenas com texto: cargas úteis JSON, URLs, e-mail (MIME), cabeçalhos HTTP. Você o encontra com mais frequência em tokens JWT, data: URIs para imagens embutidas, segredos do Kubernetes e cargas úteis de API que transportam arquivos. É um formato de transporte, não um formato de armazenamento ou segurança.

Base64 é o mesmo que criptografia?

Não, e confundir os dois causa incidentes reais de segurança Base64 não tem chave - decodificação requer apenas a tabela do alfabeto público, e leva uma pasta em qualquer decifrador. Criptografe primeiro com um algoritmo real (AES-GCM) e depois codifica o texto cifrado se o canal precisar de texto.

Por que o Base64 aumenta os dados 33%?

Cada caractere Base64 carrega 6 bits de informação, mas ocupa um byte completo de 8 bits, de modo que 3 bytes de entrada sempre se tornam 4 caracteres de saída - 4/3 1.33. It&#39; s um custo fixo do formato, inevitável por design Se o tamanho importa, comprima antes da codificação, nunca depois - a saída codificada parece aleatória e comprime terrivelmente.

Qual é a diferença entre Base64 e Base64URL?

swaps de base64url + para - e / para _, e geralmente deixa cair o = preenchimento, de modo que a saída sobrevive URLs, nomes de arquivos e cabeçalhos sem escapar Mesmo algoritmo caso contrário, definido na RFC 4648 seção 5 JWTs usam Base64URL exclusivamente - e é por isso que decodificadores estritos padrão-Base64 às vezes sufocam sobre eles.

Por que btoa() lança InvalidCharacterError?

Sua string contém caracteres fora do latim-1 - um emoji, um caractere acentuado, qualquer escrita não ocidental. btoa É uma API dos anos 1990 que antecede o manuseio de Unicode sensato. Codifique para UTF-8 bytes primeiro com TextEncoder, então Base64 os bytes; eu enviei esse bug exato em uma ferramenta de produção, então não há julgamento.

Como posso saber se uma string é base64?

Base64 válido apenas usa A–Z, a–z, 0–9, +, / (ou -, _ Para URL-seguro), final opcional =, com um comprimento que & #39; s um múltiplo de 4 quando acolchoado Mas abundância de palavras comuns coincidem com esse padrão também - cafe é válido Base64 que decodifica em bytes de lixo. O teste real é decodificá-lo e verificar se a saída é significativa.

Por que minha string base64 tem uma nova linha perdida no final?

porque echo adiciona um antes base64 sempre vê isso, então echo "hunter2" | base64 Codifica oito bytes, não sete. Use printf ou echo -n em vez disso. Esta é a causa número um dos segredos do Kubernetes que parecem direito no manifesto e falham em tempo de execução: a senha decodificada carrega um trailing invisível \n. o base64 o comando também envolve a saída em 76 colunas em alguns sistemas - passe -w 0 no GNU Coreutils para suprimi-lo.

Como decodificar um token JWT manualmente?

Divida o token em seus dois pontos, pegue o primeiro segmento (cabeçalho) e o segundo (carga útil), e execute cada um por um Decodificador Base64- eles&#39;re Base64URL, então use uma ferramenta que aceite - e _. Em seguida, formate o JSON resultante em um formatador json para ler as afirmações. Nunca cole tokens de produção em ferramentas do lado do servidor; somente do lado do cliente.

Como codificar uma imagem ou arquivo para base64?

Leia o arquivo como bytes, então Base64 esses bytes e anexe um cabeçalho de dados de dados como data:image/png;base64, Assim, um navegador pode renderizar embutido. Em JavaScript, FileReader.readAsDataURL() Faz as duas etapas para você; na linha de comando, base64 logo.png imprime a codificação bruta Mantenha-a em pequenos ativos - o imposto de tamanho de 33% torna o Base64 um ajuste ruim para qualquer coisa grande, e os URIs de big data incham seu HTML ou CSS.

Como decodificar o Base64 em JavaScript, Python ou no terminal?

No JavaScript moderno, decodifique a Unicode-Safely com new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) em vez de nua atob. Em Python, base64.b64decode(str) retorna bytes - chamada .decode('utf-8') para texto. Em um terminal, echo "aGk=" | base64 -d (ou --decode). Todos os três esperam base64 padrão, então traduza -/_ voltar para +// Primeiro, se você estiver lidando com uma string Base64URL.


a lição

Base64 é um truque de embaralhamento de bits de 30 anos que silenciosamente sustenta metade da web moderna - tokens de autenticação, anexos, ativos inline, segredos que são & #39; t-secret. Entenda o reagrupamento de 6 bits, respeite o imposto de 33%, nunca o confunda com criptografia e alcance a variante segura de URL em qualquer lugar em que um URL esteja envolvido Isso & #39; s 95% do domínio prático do Base64.

Para a parte prática, o Conversor de Base64 em Toolz.dev faz codificação padrão e segura para URL inteiramente em seu navegador - construído por alguém que aprendeu a lição Unicode da maneira mais difícil, então você não & #39; tem que.

Mais nesta série: o completo Guia de ferramentas de codificação Abrange o restante dos utilitários de motorista diário, o Guia do Construtor Regex Aborda os outros desenvolvedores de habilidades fingindo ter, e como metade da depuração do Base64 termina em JSON, o Guia definitivo de ferramentas JSON é a próxima leitura natural.


Artigos relacionados:

Frequently Asked Questions

It converts binary data into ASCII text so it can pass through systems that only handle text: JSON payloads, URLs, email (MIME), HTTP headers. You meet it most often in JWT tokens, data: URIs for inline images, Kubernetes Secrets, and API payloads carrying files. It's a transport format, not a storage or security format.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!