Como validar uma string Base64
- Cole a string em Base64 para verificar. Quebras de linha, cabeçalhos PEM e prefixos
data:podem ficar; eles aparecem como observações e o resto continua sendo analisado. - Leia o veredito no topo. Cada problema aparece com a sua posição, por exemplo “na linha 3, coluna 17 (caractere 169)”.
- Olhe Sua entrada, com os problemas destacados para ver os caracteres problemáticos marcados no lugar.
- Confira A quais variantes de Base64 ela atende? para saber se ela é válida como Base64 padrão, sem preenchimento, URL-safe, MIME ou PEM, e por que não onde falha.
- Clique em Corrigir para mudar para o modo de reparo, que limpa a string.
O que o validador verifica
- Caracteres fora do alfabeto, mostrados com o code point Unicode, para que os invisíveis, como o espaço não separável (U+00A0) ou o espaço de largura zero (U+200B), fiquem visíveis.
- Alfabetos misturados:
+e/do Base64 padrão junto com-e_do Base64URL na mesma string. =no meio, o que quase sempre significa que dois valores codificados foram colados.- Comprimento impossível: depois de remover o preenchimento, um comprimento com resto 1 na divisão por 4 não sai de nenhum codificador. Falta ou sobra um caractere.
- Preenchimento: ausente, em excesso ou incompatível com o comprimento dos dados.
- Bits finais não canônicos no último caractere (RFC 4648 §3.5).
- Espaços e quebras de linha: espaços e tabs, a largura das linhas e se elas terminam em CRLF, LF ou uma mistura.
Detalhes acrescenta o comprimento, o comprimento mod 4, o estado do preenchimento, o alfabeto, o tamanho decodificado e o tipo de conteúdo detectado. A cópia destacada da entrada se limita aos primeiros 20.000 caracteres, mas a análise sempre cobre a string inteira.
Mesma string, decodificadores diferentes
“Válido” depende de quem pergunta. Estas cinco strings passaram por quatro decodificadores comuns (Python 3.13, Node.js 24, o atob do WHATWG e o GNU coreutils 9.7):
| Entrada | Problema | Python b64decode(s, validate=True) | Node Buffer.from(s, "base64") | atob(s) | base64 -d |
|---|---|---|---|---|---|
SGVsbG8gd29ybGQ | falta = | erro | Hello world | Hello world | Hello world |
SGVsbG9= | último caractere não canônico | Hello | Hello | Hello | erro |
SGVsbG8=V29ybGQ= | dois valores colados | erro | Hello (o resto é descartado) | erro | HelloWorld |
SGVsbG8gd | resto 1 | erro | Hello | erro | erro |
SGVs bG8= | um espaço | erro | Hello | Hello | erro |
A célula perigosa é o Node devolvendo Hello sem alarde para a entrada colada e perdendo metade dos dados sem nenhum erro. Por isso esta ferramenta informa cada desvio, inclusive os que o seu decodificador tolera. A tabela de variantes então diz qual formato estrito a string atende.
Uma string válida é mesmo Base64?
abcd, test e 1234 são todos Base64 válido. Cada um decodifica para três bytes de aparência aleatória. Por isso a ferramenta também responde Isto é mesmo Base64? com uma pontuação de 0 a 100 e os motivos por trás dela, cada um marcado como indício a favor ou contra o Base64:
- a favor: preenchimento correto, mistura de maiúsculas e minúsculas com dígitos, grande variedade de caracteres, início
eyJ(Base64 de{", típico de JSON e JWTs), ou bytes que decodificam para um tipo de arquivo conhecido ou texto legível; - contra: só letras (pode ser uma palavra), só dígitos hex (pode ser uma string hex), só dígitos (provavelmente um número), uma única caixa de letras, ou uma string muito curta.
Trate a pontuação como uma pista. É uma heurística, e uma string curta pode enganá-la para qualquer lado.
Verificando Base64 no código
O teste prático mais rigoroso é a ida e volta: decodificar, recodificar e comparar. Ele rejeita espaços, preenchimento ausente e finais não canônicos de uma vez.
import base64
def is_canonical_base64(s):
try:
return base64.b64encode(base64.b64decode(s, validate=True)).decode() == s
except ValueError:
return False
No Node.js, a mesma ideia é Buffer.from(s, "base64").toString("base64") === s. Uma expressão regular como ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$ verifica o alfabeto e o comprimento, mas aceita SGVsbG9= e a string vazia. Para strings URL-safe, converta-as antes ou use o alfabeto correspondente; veja Base64 vs Base64URL. Mensagens de erro de linguagens específicas estão reunidas em Erros de Base64.
Perguntas frequentes
Como saber se uma string é Base64?
A rigor, uma string é Base64 padrão válido se usa só A–Z, a–z, 0–9, + e /, tem comprimento múltiplo de 4 e no máximo dois = no final. Muitas palavras comuns passam nesse teste, então a ferramenta acrescenta uma pontuação de 0 a 100 baseada na aparência da string e no que ela decodifica.
Por que meu Base64 decodifica em uma linguagem e falha em outra?
Os decodificadores diferem no grau de rigor. O Buffer.from do Node aceita quase tudo, o b64decode(s, validate=True) do Python rejeita preenchimento ausente e o base64 -d do GNU rejeita caracteres finais não canônicos. A tabela acima mostra as mesmas cinco strings em quatro decodificadores.
O que é Base64 não canônico?
O último caractere carrega alguns bits não usados que deveriam ser zero. SGVsbG8= e SGVsbG9= decodificam para Hello, mas só o primeiro é canônico. A RFC 4648 permite que os decodificadores rejeitem o segundo, e recodificar nunca o reproduz.
Uma string Base64 válida é segura para decodificar?
A validade não diz nada sobre o conteúdo. A seção Detalhes mostra o tamanho decodificado e o tipo de conteúdo detectado, com um link para o decodificador correspondente, para você saber se é texto, uma imagem ou outra coisa antes de salvar.