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–25a–z→ Valores 26–510–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.

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.

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-"protegida" é 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' 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'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:



