Comando base64: Básico de Codificação e Decodificação

Comando base64: Básico de Codificação e Decodificação

O que você vai conseguir fazer

  • Codificar e decodificar strings e arquivos com `base64`
  • Distinguir codificação, criptografia e hash
  • Evitar a armadilha do newline do `echo` e a sobrescrita do `>`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • Como codificar e decodificar strings e arquivos com base64
  • Como distinguir codificação, criptografia e hash
  • Como evitar a armadilha do newline que o echo adiciona
  • Opções comuns como -w (wrap) e -d (decode)

Para quem é este artigo: Iniciantes em Linux que viram uma string base64 em um token de API ou anexo de email e se perguntaram "o que é isso?"

As palavras usadas aqui (é aqui que as pessoas confundem)

  • Codificação: mudar a forma de escrever os dados. Não envolve chave. Qualquer pessoa reverte. O base64 é isto.
  • Criptografia: deixar os dados legíveis apenas para quem tem a chave. Sem a chave, o conteúdo continua escondido. Ferramentas como o openssl fazem isso.
  • Hash: gerar um valor curto a partir do conteúdo. Não dá para reverter. Serve para responder "são iguais?". Ferramentas como o sha256sum fazem isso.

Os três produzem uma string de aparência estranha. O que muda é se dá para reverter e se é preciso uma chave. O base64 daqui é do tipo que qualquer pessoa reverte sem chave.

Introdução: A String Misteriosa da Lina

Lina: Linny-senpai, achei uma string estranha como SGVsbG8gV29ybGQ= em um arquivo de configuração. O que é isso? Uma senha criptografada?
Veterano Linny: Bom olho. É uma string codificada com base64. Mas uma coisa importante antes de tudo: isso não é criptografia.
Lina: Não é criptografia? Então qualquer um lê o conteúdo?
Veterano Linny: Exatamente. Basta passar por base64 -d e qualquer um recupera o original. Então não serve para proteger segredos. Hoje vamos ver o básico do base64 e por que ele existe.

Resumo Rápido

  • base64 representa dados binários com apenas 64 caracteres ASCII (A-Z a-z 0-9 + /). O = final é enchimento para ajustar o tamanho
  • Codifique com base64, decodifique com base64 -d
  • Não é criptografia. Qualquer um decodifica. Nunca use para proteger segredos

1. O Que é base64?

Conclusão: base64 converte dados binários em 64 caracteres ASCII. É embalagem para transporte, não criptografia.

Lina: Por que precisamos dessa conversão, afinal?
Veterano Linny: Boa pergunta. E-mail e alguns protocolos só transportam texto (caracteres ASCII) com segurança. Se você empurra binário cru, como uma imagem, ele pode se corromper no caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório..
Lina: Então converter para texto antes deixa o transporte seguro.
Veterano Linny: Isso. O base64 representa qualquer dado usando só 64 caracteres. Não é "criptografia", é embalagem para transporte. O conteúdo não fica escondido, mas a forma viaja em segurança.

Onde o base64 é usado

  • Anexos de e-mail (MIME)
  • Headers de autenticação HTTP Basic
  • Binário embutido em arquivos de configuração / JSON (imagens, certificados)
  • URLs data: (embutir imagens direto no HTML)

2. Codificando uma String

Conclusão: Use um pipe de echo -n para base64. Sem -n, o newline final também é codificado.

Veterano Linny: Vamos codificar uma string de verdade. Vamos converter Hello World.
Lina: Então passamos por pipe para o base64 com |.
$ echo -n "Hello World" | base64
SGVsbG8gV29ybGQ=

Não esqueça o -n em echo -n

Por padrão o echo adiciona um newline no fim. Sem -n, esse único caractere de newline (\n) também é codificado. A string resultante muda.

Lina: Senpai, codifiquei um token de API em base64 e enviei, mas a autenticação falhou. Copiei a string com cuidado.
Veterano Linny: Você passou -n para o echo?
Lina: Não passei. Um newline a mais muda tanto assim?
Veterano Linny: Muda. Vamos comparar as duas saídas. Os últimos caracteres ficam diferentes.
$ echo "Hello World" | base64
SGVsbG8gV29ybGQK
Lina: É verdade. O fim mudou de = para K. Então um newline invisível causou isso.
Veterano Linny: Sim. Um caractere invisível já é outro dado. Por isso vale a regra: para tokens, use echo -n ou printf.

SGVsbG8gV29ybGQ= vs SGVsbG8gV29ybGQK

O final muda: = (sem newline) ou K (com o \n). Ao codificar um token ou senha em base64, essa contaminação por newline é um bug clássico. Sempre use echo -n ou printf.

# printf nao adiciona newline, evitando o problema do -n faltante
$ printf '%s' "Hello World" | base64

3. Decodificando

Conclusão: Use base64 -d (ou --decode). Qualquer um executa, então não há sigilo.

Veterano Linny: Agora o inverso. Vamos trazer SGVsbG8gV29ybGQ= de volta. Basta adicionar -d.
Lina: Decodificar não precisa de uma chave especial?
Veterano Linny: Não precisa. É exatamente por isso que eu disse "não é criptografia" no começo. Qualquer um com o comando vê o conteúdo.
$ echo "SGVsbG8gV29ybGQ=" | base64 -d
Hello World

-d e --decode são a mesma coisa

Tanto base64 -d quanto base64 --decode funcionam. O curto -d é mais comum.

Lina: Então aquela string misteriosa do arquivo de configuração também é legível.
Veterano Linny: Exatamente. Por isso nunca ache que "escondeu" uma chave de API ou senha só por codificar em base64. Para esconder, é preciso criptografia com chave, de uma ferramenta como o openssl.

4. Codificando e Decodificando Arquivos

Conclusão: Passe um nome de arquivo para codificar; redirecione a saída de -d para um arquivo para restaurar.

Veterano Linny: Não são só strings. Você pode passar um arquivo direto. Primeiro vamos criar um arquivo de prática.
# Criar um arquivo de pratica
$ echo "practice" > sample.txt

# Codificar um arquivo e salvar como .b64
$ base64 sample.txt > sample.txt.b64

# Decodificar o .b64 de volta em um arquivo restaurado
$ base64 -d sample.txt.b64 > restored.txt

Binário como imagens ou certificados passa exatamente pelos mesmos passos.

Onde os arquivos caem e o risco de sobrescrita

Lina: O arquivo restaurado é mesmo idêntico ao original?
Veterano Linny: Boa observação. Confira com diff ou sha256sum. Se baterem, a restauração foi perfeita.
# Verificar se o original e o restaurado sao identicos
$ diff sample.txt restored.txt && echo "OK: identicos"
OK: identicos

O tamanho cresce cerca de 1,33x

O base64 transforma 3 bytes em 4 caracteres. A saída codificada fica cerca de 4/3 (uns 33% maior) que o original. Cuidado ao codificar arquivos grandes onde o espaço é apertado.

5. Controlando a Quebra de Linha com -w

Conclusão: base64 quebra a cada 76 caracteres por padrão. Use -w 0 para uma única linha.

Lina: Quando codifiquei um arquivo longo, a saída veio quebrada em várias linhas. Isso é normal?
Veterano Linny: É normal. O base64 insere um newline a cada 76 caracteres (wrapping) por padrão. Isso segue a especificação MIME de e-mail.
Lina: Mas às vezes eu quero uma linha só, para tratar um token em uma única linha.
Veterano Linny: Então use -w 0. -w é de "wrap", e 0 significa sem quebra.
# Sem wrapping (linha unica)
$ base64 -w 0 image.png > oneline.b64

# Quebrar a cada 40 caracteres
$ echo -n "Hello World, this is a longer text" | base64 -w 40

O base64 do macOS não tem -w

-w é uma opção do GNU coreutils (padrão no Linux). O base64 do macOS (BSD) não tem -w e controla a quebra de outro jeito. Este artigo assume Linux (GNU coreutils).

6. Armadilhas Comuns

Conclusão: "confundir com criptografia", "contaminação por newline do echo" e "invalid input ao decodificar" são os três tropeços maiores.

Veterano Linny: Por fim, vou resumir três pontos em que iniciantes tropeçam.

Armadilha 2: contaminação por newline do echo

Como vimos na seção 2, esquecer o echo -n codifica o newline junto. Quando um token codificado em base64 falha na autenticação, suspeite disso primeiro.

Armadilha 3: invalid input ao decodificar

Se um espaço ou caractere estranho entra no copiar e colar, aparece base64: invalid input. O base64 usa exatamente 64 caracteres (A-Z a-z 0-9 + /), e qualquer outro vira erro.

Use -i (--ignore-garbage) para pular os caracteres fora desses 64 e decodificar mesmo assim.

# Ignorar newlines ou espacos estranhos ao decodificar
$ base64 -d -i messy.b64

Templates seguros (copiar e colar)

# Codificar uma string (sem newline adicionado)
printf '%s' "texto" | base64

# Codificar em uma linha (sem wrapping)
base64 -w 0 file.bin

# Decodificar
echo "SGVsbG8=" | base64 -d

7. Mini Exercício: Tente Você Mesmo

Conclusão: Três tarefas (codificar, ida e volta, diferença do newline) fixam o comportamento do base64.

Veterano Linny: Para fixar o que aprendeu, tente estas tarefas na sua máquina.

Crie um diretório de prática vazio e trabalhe dentro dele. Assim você nunca sobrescreve um arquivo que já tinha.

# Prepare um diretorio de pratica e entre nele
$ mkdir -p ~/base64-practice && cd ~/base64-practice

Tarefa 1: Codifique o seu próprio nome com base64, sem newline no fim.

Ver Dica 1 (Direção)

Passe por pipe a saída de um comando que imprime texto. Escolha a forma que não adiciona newline.

Ver Dica 2 (Nome do comando)

Use printf '%s' ou echo -n e depois um pipe para base64.

Ver Resposta
$ printf '%s' "Lina" | base64
TGluYQ==

printf '%s' e echo -n mantêm o newline final de fora.

Tarefa 2: Decodifique a saída da Tarefa 1 e confirme que o original volta.

Ver Dica 1 (Direção)

Use o mesmo comando com uma opção que inverte o sentido.

Ver Dica 2 (Nome do comando)

Use base64 -d.

Ver Resposta
$ echo "TGluYQ==" | base64 -d
Lina

Se o seu nome original aparece igual, a ida e volta deu certo.

Tarefa 3: Codifique tanto echo -n "test" quanto echo "test" e explique em uma linha por que os resultados diferem.

Ver Dica 1 (Direção)

Você não vê, mas um deles envia um caractere a mais no fim.

Ver Dica 2 (Nome do comando)

Rode echo -n "test" | base64 e echo "test" | base64 e compare a saída.

Ver Resposta
$ echo -n "test" | base64
$ echo "test" | base64
dGVzdA==
dGVzdAo=

O echo adiciona um newline (\n) no fim por padrão. echo "test" codifica test\n (5 bytes) e echo -n "test" codifica test (4 bytes). Entrada diferente, string base64 diferente.

Retomando

Conclusão: base64 não serve para esconder dados; é uma embalagem para transportá-los com segurança.

Lina: Agora fez sentido. O base64 não serve para esconder algo, e sim para embalar para transporte.
Veterano Linny: Exato. Criptografia precisa de chave, hash não volta, codificação qualquer um reverte. Sabendo separar os três, está resolvido.
Lina: Aquela string misteriosa do arquivo de configuração não me assusta mais. E entendi por que ela nunca pode guardar senha.

Resumo em Três Linhas

Conclusão: base64 é uma conversão sem chave, e não criptografia nem hash.

  1. base64 é codificação, uma mudança de forma de escrita. Qualquer um reverte com base64 -d
  2. Criptografia precisa de chave. Hash não pode ser revertido. O base64 não é nenhum dos dois
  3. Use echo -n ou printf para strings, e cuidado com a sobrescrita do > ao gravar arquivos

Próximas Leituras