Decodifique a Credencial Armazenada: Base64 Não É Criptografia
O desafio
Uma aplicação afirma que 'criptografa' a senha do banco de dados antes de salvá-la, mas o valor armazenado é apenas base64. Recupere a senha a partir do bloco codificado e envie a senha do banco de dados.
O que você vai aprender
- Reconhecer base64 em uma credencial armazenada pelo conjunto de caracteres e pelo preenchimento ==
- Decodificar um bloco base64 em um clique para recuperar a senha em texto claro
- Entender por que base64 não é criptografia e não oferece proteção em repouso
- Perceber que qualquer pessoa que consiga ler um valor armazenado pode decodificar base64 sem precisar de chave
- Saber o que é necessário para proteger de verdade uma credencial armazenada
Habilidades testadas
Pré-requisitos
- A ideia de que aplicações armazenam senhas de banco de dados em algum lugar
- Familiaridade em reconhecer base64 pelo preenchimento == no final
Como funciona
Aplicações precisam de uma senha para se conectar ao banco de dados, e essa senha precisa existir em algum lugar que o app consiga ler na inicialização - um arquivo de configuração, uma variável de ambiente ou uma tabela de configurações. Um padrão comum, porém equivocado, é aplicar base64 à senha antes de armazená-la e descrever isso como "criptografia" para que pareça mais seguro em uma revisão. Não é criptografia. base64 é uma codificação reversível e pública, sem chave, então o valor ofuscado está a apenas uma decodificação de distância da senha real.
Você pode reconhecer base64 em um bloco armazenado da mesma forma que faria em qualquer outro lugar. Ele usa letras maiúsculas e minúsculas e dígitos, pode conter alguns símbolos, e frequentemente termina com um ou dois sinais = de preenchimento. O valor armazenado aqui termina com ==, o que é um forte indício de que a forma externa é base64. Decodificá-lo revela a senha original em texto claro, exatamente como o app a utiliza.
O impacto de segurança é direto. Qualquer um que consiga ler o valor armazenado - seja por meio de uma configuração vazada, um backup, uma linha de log ou um host comprometido - consegue recuperar a senha ativa do banco de dados em um único clique, porque nenhum segredo é necessário para reverter base64. É por isso que armazenar em base64 é um presente para escalonamento de privilégios: transforma acesso de leitura a um arquivo em credenciais completas do banco de dados. Os botões ROT13, hex, URL e reverse esperam formatos de entrada diferentes e são distrações aqui.
Erros comuns
- Acreditar que "criptografado" significa seguro. Chamar base64 de criptografia não dá a ele uma chave. O valor é reversível por qualquer um que consiga lê-lo.
- Escolher o decodificador errado. hex usa apenas
0-9a-fe ROT13 mantém o mesmo comprimento e formato. As letras maiúsculas e minúsculas misturadas, os símbolos e o preenchimento==apontam para base64. - Enviar o bloco codificado. A resposta é a senha decodificada, não a string em base64.
- Assumir que armazenamento em repouso é baixo risco. Uma configuração ou backup legível transforma uma senha em base64 diretamente em acesso ao banco de dados ativo.
Como se proteger
A correção é parar de tratar base64 como proteção e lidar com as credenciais armazenadas de forma adequada. Uma senha de banco de dados que o app precisa usar em tempo de execução deve vir de um cofre de segredos gerenciado, não de um bloco base64 em um arquivo, e o valor nunca deve ser descrito como criptografado a menos que realmente seja.
- Armazene credenciais de serviço em um gerenciador de segredos dedicado, com controle de acesso e registro de auditoria, não em configuração em texto claro.
- Se uma credencial precisar ficar na configuração, criptografe-a com criptografia autenticada usando uma chave que a aplicação busca em um cofre gerenciado, nunca base64.
- Restrinja o acesso de leitura a arquivos de configuração, backups e logs para que o valor armazenado não fique exposto sem necessidade.
- Rotacione qualquer credencial que já tenha sido armazenada em base64, pois ela deve ser tratada como já divulgada.