Português (Brasil)

Ferramentas de desenvolvedor · Codificador e decodificador Base64

Base64 não é criptografia: por que um segredo codificado pode ser lido por qualquer pessoa

· Por que é importante

base64 segurança codificação

Texto codificado em Base64 decodificado instantaneamente sem chave, mostrando o conteúdo do texto simples
Ilustração vetorial original ToolAcre

Base64 não esconde nada: qualquer pessoa com a string pode decodificá-la instantaneamente, sem chave. Esta postagem explica a diferença entre codificação, criptografia e hash, e o que fazer quando você encontrar segredos Base64 em um repositório.

O valor de configuração que parecia embaralhado e decodificado em uma senha de banco de dados – uma descoberta concreta e a rapidez com que ela é revertida

Encontrar Base64 em um arquivo de configuração cria uma falsa sensação de segurança. Um desenvolvedor descobre uma senha de banco de dados que aparece como uma sequência embaralhada como dGlnZXJfZGF0YWJhc2VfYWRtaW4, assume que ela está criptografada e a envia para o repositório junto com o código do aplicativo. Semanas depois, uma análise de segurança revela o texto simples real: tigre_database_admin.

Base64 não esconde nada; é uma codificação, não uma criptografia. A mesma senha invertida torna-se bruta novamente instantaneamente no navegador, sem chave, sem cálculo, sem atraso. Esta postagem explica por que a codificação existe, como ela difere fundamentalmente da criptografia e do hash e o que realmente acontece quando alguém encontra segredos Base64 em um histórico confirmado.

Codificação, criptografia e hash: três trabalhos diferentes — o que cada um garante e qual deles precisa de uma chave

A confusão surge porque o Base64 parece uma proteção. Um humano não pode olhar para dGlnZXJfZGF0YWJhc2VfYWRtaW4 e ler tiger_database_admin. Ele parece obscurecido até que você o execute em um decodificador. Essa ofuscação superficial parece segurança, mas não é. Base64 foi projetado para resolver um problema totalmente diferente: mover dados binários arbitrários através de canais somente texto. E-mail, formulários web mais antigos e sistemas de protocolo de linha não podiam transportar bytes brutos. Base64 converte bytes em caracteres ASCII imprimíveis para que os dados possam passar intactos por esses canais.

Assim que os dados chegaram, o destinatário os decodificou de volta em bytes. A codificação e a decodificação são igualmente simples; eles não exigem chaves, nem entropia, nem biblioteca criptográfica. Codificação, criptografia e hashing atendem a três propósitos distintos e oferecem três garantias diferentes. A codificação transforma os dados em uma representação diferente para que possam passar por um canal específico ou serem usados ​​em um contexto específico. Base64, codificação URL, representação hexadecimal e até aspas de escape em JSON são todas codificações. Eles são reversíveis por qualquer pessoa e não requerem chave secreta.

Por que o Base64 existe - transporte seguro de bytes através de canais de texto, nunca confidencialidade

O objetivo é a compatibilidade de formatos, não a confidencialidade. A criptografia, por outro lado, requer uma chave conhecida apenas pelas partes autorizadas. Somente alguém com a chave correta pode transformar o texto cifrado novamente em texto simples. Sem a chave, a mensagem permanece opaca mesmo para alguém sofisticado o suficiente para atacá-la. O hash é unilateral por design: um hash criptográfico de uma senha não pode ser revertido. É usado para verificar se uma senha corresponde a um hash armazenado sem armazenar a senha em si.

Um segredo do Kubernetes denominado senha do banco de dados que contém base64: dGlnZXJfZGF0YWJhc2VfYWRtaW4 não é realmente secreto. Base64 é a codificação padrão que o Kubernetes usa para armazenamento, não para proteção. Qualquer pessoa com acesso ao banco de dados YAML ou etcd pode decodificar o valor em segundos. Variáveis ​​de ambiente com chaves API codificadas em base64 em um script de inicialização enfrentam o mesmo problema. Um cabeçalho de autenticação básica que envia Authorization: Basic base64_username:password para um servidor pode ser decodificado por qualquer proxy, ferramenta de monitoramento ou observador de rede entre o cliente e o servidor.

Exemplo resolvido: decodificação de uma string 'secreta' no navegador - uma colagem, uma decodificação e o texto simples, sem nenhum servidor envolvido

Se o canal for HTTP em vez de HTTPS, a exposição é ainda maior. Base64 nesses contextos é uma pista falsa: o verdadeiro segredo já foi comprometido ao ser armazenado ou transmitido de forma recuperável. Um exemplo trabalhado torna o problema concreto. Suponha que uma chave API para um serviço de terceiros apareça em um arquivo de configuração como YXBpa2V5XzEyMzQ1Njc4OTAx. Copie esta string no codificador e decodificador Base64 em seu navegador, cole-a no campo de entrada e clique em Decodificar.

A ferramenta retorna apikey_1234567890. Isso aconteceu instantaneamente, no seu navegador, sem contato com o servidor, sem necessidade de chave e sem autenticação realizada. Toda a operação leva menos de um segundo. Agora, suponha que essa mesma chave seja encontrada em um repositório público do GitHub por um agente mal-intencionado. Eles o decodificam com a mesma facilidade, nas ferramentas de sua preferência, e o utilizam para acessar o serviço. Quer a string permaneça oculta em um repositório, viaje por uma rede ou apareça em logs de aplicativos, ela pode ser revelada com uma operação trivial disponível em todas as linguagens de programação e em ferramentas de navegador como esta.

Onde esse erro aparece – segredos do Kubernetes, arquivos .env, cabeçalhos de autenticação básicos e recursos de aplicativos móveis

O erro aparece em todos os lugares porque o Base64 é tão comum que fica associado ao ofuscamento por proximidade. Os desenvolvedores veem dados codificados em Base64, inferem que alguém achou que isso era importante e deixam segredos dessa forma. Um arquivo .env contendo API_KEY=VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 parece para um engenheiro júnior como mais seguro do que API_KEY=Isso não é realmente um segredo, embora a decodificação exija uma operação. Os aplicativos móveis agrupam tokens codificados em Base64 em recursos que qualquer descompilador pode extrair e decodificar. Os backups de banco de dados contêm senhas codificadas em Base64 em campos que devem ser pesquisados, não protegidos.

Em cada caso, alguém confundiu codificação com criptografia e criou um arquivo de segredos de texto simples que está formatado de uma forma que requer uma etapa extra para leitura. O que fazer quando segredos Base64 são descobertos depende do contexto.

O que fazer em vez disso – gerenciadores de segredos, criptografia real em repouso e rotação de tudo o que já foi confirmado

Se o segredo for um token, chave API ou senha e já tiver sido confirmado para controle de versão, trate-o como comprometido. Revogue-o, gere um novo e atualize todos os locais onde foi utilizado. O commit histórico faz parte do registro permanente do repositório mesmo que o segredo seja removido posteriormente em um novo commit; qualquer pessoa com acesso ao histórico do repositório pode encontrá-lo.

Pesquisar repositórios por valores codificados em Base64 agora é uma tática de reconhecimento padrão, portanto, o fato de algo ser Base64 não o torna secreto. Para qualquer operação em andamento, nunca codifique segredos com Base64 e presuma que eles estão protegidos. Utilize um gerenciador de segredos que armazene valores criptografados, com acesso controlado e auditáveis. Armazene apenas a referência ou uma derivação, e não o segredo em si, no código e na configuração do aplicativo. A criptografia real em repouso significa que os dados são criptografados com uma chave armazenada separadamente e são inúteis para quem não possui essa chave.

O que isso não cobre – escolha de um algoritmo de criptografia ou design de gerenciamento de chaves

Um banco de dados que criptografa colunas confidenciais, um gerenciador de segredos que usa criptografia de envelope com chaves em um módulo de segurança de hardware ou um gerenciador de senhas que deriva chaves de criptografia de senhas de usuários, todos oferecem confidencialidade genuína. A criptografia em nível de aplicativo no momento em que os segredos são criados, antes de serem armazenados em qualquer lugar, é ainda mais forte. A rotação de segredos que foram expostos, mesmo que fossem apenas codificados em Base64, elimina a janela de oportunidade para uso indevido. Se um segredo estava em um repositório, verifique os logs para ver quando ele foi acessado e para que foi usado durante a janela de exposição.

Para segurança contínua, utilize tokens de curta duração emitidos por um serviço de autorização, e não segredos estáticos armazenados na configuração. Um token que expira em uma hora é menos valioso para um invasor, mesmo se estiver comprometido. Este artigo não aborda a escolha de um algoritmo de criptografia, design de gerenciamento de chaves ou arquitetura de autenticação. Essas são questões de engenharia mais profundas, com seus próprios padrões e compensações. A questão é mais simples: Base64 não é uma das ferramentas para nenhum desses problemas. É uma conversão de formato para transporte e armazenamento.

Conclusão: trate Base64 como texto simples - como o codificador e decodificador Base64 mostra a mensagem com um clique, sem que o segredo saia da sua guia

Não deixe que a aparência do Base64 em um repositório, um arquivo de configuração ou um log o convença de que os dados estão protegidos. Qualquer ferramenta que possa ler texto pode decodificar Base64, e a operação é instantânea e determinística. Ler uma string codificada em Base64 como texto cifrado é um mal-entendido comum e deixa segredos reais à vista. Os desenvolvedores geralmente percebem isso somente depois de encontrarem segredos do Base64 em produção ou em uma auditoria. Uma nova perspectiva surge quando um engenheiro decodifica uma string de amostra localmente e vê o texto simples original aparecer instantaneamente.

A ferramenta deixa claro que a questão é inevitável: codificação não é criptografia. Uma vez clara essa distinção, o acompanhamento é automático. Cada segredo Base64 na base de código deve ser alternado. Cada local onde o segredo é usado deve ser atualizado. A janela de exposição deve ser avaliada. Para o futuro, os gestores secretos e a criptografia real devem substituir a codificação nesta função. O codificador e decodificador Base64 mostra exatamente o quão rápida e fácil é a reversão, sem que seu segredo saia do navegador. Trate essa facilidade como a verdadeira postura de segurança: se você pode decodificá-la em um segundo, qualquer outra pessoa também pode.