Pular para o conteúdo

Boas práticas e padrões · Segurança no código · 5 min de leitura

Segredos e chaves: o que nunca vai para o código

Senhas, tokens e chaves de API no repositório ou dentro do app acabam vazando. Guarde no servidor ou num cofre, e no celular use o Keystore (Android) e o Keychain (iOS).

App / site → Seu backend1Cofre / variável de ambiente → Seu backend2Seu backend → API externa3App / site — sem chave secretaApp / sitesem chave secretaSeu backend — autentica o usuárioSeu backendautentica o usuárioCofre / variável de ambiente — a chave fica aquiCofre / variável de ambientea chave fica aquiAPI externa — pagamento, IA, mapasAPI externapagamento, IA, mapas

Arraste para o lado para ver o diagrama inteiro.

Tudo o que vai dentro de um APK, IPA ou bundle JavaScript pode ser extraído. Segredo de verdade só existe no servidor.

O que não fazer

  • Chave no código-fonte ou em arquivo commitado — o histórico do Git guarda para sempre, mesmo depois de apagar.
  • Chave secreta dentro do app (BuildConfig, Info.plist, bundle JS): qualquer pessoa descompila e copia.
  • Segredo em log, em mensagem de erro ou na URL (fica em histórico e proxies).

O que fazer

  • Servidor: variáveis de ambiente ou um cofre (secret manager do provedor, Vault); rotação periódica; uma chave por ambiente.
  • App: só chaves feitas para serem públicas (com restrição por pacote, domínio ou assinatura). Para o resto, o app chama o seu backend.
  • Dados sensíveis no aparelho (tokens de sessão): Android Keystore / EncryptedFile; iOS Keychain. Nunca em SharedPreferences ou UserDefaults sem criptografia.
  • Detecção: scanner de segredos no CI e no pre-commit; se vazou, revogue e gere outra — apagar o commit não basta.

No código: antes e depois

✗ AntesKotlin
object Config {
    const val PAGAMENTO_SECRET = "sk_live_51H..." // vai dentro do APK
}
suspend fun cobrar(valor: Long) = http.post("https://api.pagamentos.com/cobrancas") {
    header("Authorization", "Bearer ${Config.PAGAMENTO_SECRET}")
    setBody(mapOf("valor" to valor))
}
✓ DepoisKotlin
// App: chama o próprio backend com o token da sessão do usuário (guardado no Keystore)
suspend fun cobrar(pedidoId: String) = http.post("https://api.meusite.com/pedidos/$pedidoId/cobrar") {
    header("Authorization", "Bearer ${sessao.tokenAtual()}")
}

// Backend (Ktor): a chave secreta vem do ambiente, nunca do código
val pagamentoSecret = System.getenv("PAGAMENTO_SECRET") ?: error("PAGAMENTO_SECRET não definido")

O app não conhece a chave do provedor; o backend confere quem é o usuário e qual o valor antes de cobrar.

Em resumo

Perguntar à IA

Monte um prompt pronto sobre Segredos e chaves: o que nunca vai para o código na sua linguagem e no seu caso, e abra num chat gratuito.

ChatGPT Claude Perplexity

O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →