Variáveis de ambiente são a forma universal e segura de gerenciar chaves de API em qualquer linguagem: em desenvolvimento, use um arquivo .env fora do controle de versão; em produção, configure as variáveis diretamente na infraestrutura (Docker, Heroku, Vercel, AWS). Nunca hardcode a chave no código — uma API key exposta em repositório público pode ser encontrada em segundos por bots automatizados.
Introdução
Expor chaves de API no código fonte é um dos erros de segurança mais comuns e perigosos no desenvolvimento de software. Uma API key hardcoded pode ser encontrada em repositórios públicos, binários descompilados ou histórico do Git, resultando em uso não autorizado e cobranças inesperadas. A solução é simples e universal: variáveis de ambiente.
Por que variáveis de ambiente são essenciais
Variáveis de ambiente separam configuração de código, seguindo o princípio dos 12-Factor Apps — metodologia amplamente adotada para aplicações cloud-native, detalhada em 12factor.net.
| Risco | Sem variáveis de ambiente | Com variáveis de ambiente |
|---|---|---|
| Vazamento no Git | API key no histórico para sempre | Código limpo, key fora do repo |
| Ambientes diferentes | Editar código para dev/prod | Trocar variável sem rebuild |
| Rotação de chaves | Deploy para trocar key | Atualizar variável e reiniciar |
| Auditoria | Grep no código fonte | Controle centralizado |
| Compartilhamento | Colegas veem a key | Cada dev tem sua key |
- 12-Factor Apps -- metodologia que define variáveis de ambiente como forma canônica de configuração
- Separação de concerns -- o código define o que fazer, o ambiente define com quais credenciais
- Princípio do menor privilégio -- cada ambiente tem acesso apenas às chaves necessárias
Implementação em cada linguagem
Veja como acessar variáveis de ambiente em Python, JavaScript, Swift, Kotlin e Dart.
# Python - Variáveis de ambiente
import os
# 1. Acesso direto (produção)
api_key = os.environ.get("CPFHUB_API_KEY")
if not api_key:
raise ValueError("CPFHUB_API_KEY não definida")
# 2. Com python-dotenv (desenvolvimento)
from dotenv import load_dotenv
load_dotenv() # Carrega .env do diretório atual
api_key = os.environ["CPFHUB_API_KEY"]
# 3. Com valor padrão (apenas para desenvolvimento)
api_key = os.environ.get("CPFHUB_API_KEY", "dev-key-apenas-local")
// JavaScript/Node.js - Variáveis de ambiente
// 1. Acesso direto (produção)
const apiKey = process.env.CPFHUB_API_KEY;
if (!apiKey) {
throw new Error("CPFHUB_API_KEY não definida");
}
// 2. Com dotenv (desenvolvimento)
require("dotenv").config();
const apiKey = process.env.CPFHUB_API_KEY;
// 3. Com Next.js (server-side apenas)
// Arquivo .env.local
// CPFHUB_API_KEY=sua-chave-aqui
// Acesso: process.env.CPFHUB_API_KEY (disponível em Server Components)
// Swift/iOS - Variáveis de ambiente
// 1. Via Info.plist (recomendado para iOS)
let apiKey = Bundle.main.object(
forInfoDictionaryKey: "CPFHUB_API_KEY"
) as? String ?? ""
// 2. Via xcconfig files (build configuration)
// Config/Debug.xcconfig:
// CPFHUB_API_KEY = sua-chave-dev
// Config/Release.xcconfig:
// CPFHUB_API_KEY = sua-chave-prod
// 3. Via ProcessInfo (para scripts/CLI)
let apiKey = ProcessInfo.processInfo.environment["CPFHUB_API_KEY"] ?? ""
// Kotlin/Android - Variáveis de ambiente
// 1. Via BuildConfig (build.gradle)
// android { defaultConfig {
// buildConfigField("String", "CPFHUB_API_KEY",
// "\"${project.findProperty("CPFHUB_API_KEY")}\"")
// }}
val apiKey = BuildConfig.CPFHUB_API_KEY
// 2. Via gradle.properties (nunca commitar)
// CPFHUB_API_KEY=sua-chave-aqui
// 3. Via System.getenv (backend/CLI)
val apiKey = System.getenv("CPFHUB_API_KEY")
?: throw IllegalStateException("CPFHUB_API_KEY não definida")
// Dart/Flutter - Variáveis de ambiente
// 1. Com flutter_dotenv
import 'package:flutter_dotenv/flutter_dotenv.dart';
Future<void> main() async {
await dotenv.load(fileName: ".env");
final apiKey = dotenv.env['CPFHUB_API_KEY'] ?? '';
runApp(MyApp(apiKey: apiKey));
}
// 2. Com --dart-define (compile-time)
// flutter run --dart-define=CPFHUB_API_KEY=sua-chave
const apiKey = String.fromEnvironment('CPFHUB_API_KEY');
// 3. Via Platform.environment (server-side Dart)
import 'dart:io';
final apiKey = Platform.environment['CPFHUB_API_KEY'] ?? '';
- Python/JS -- as linguagens mais diretas, com acesso nativo e pacotes dotenv maduros
- Swift/Kotlin -- em apps mobile, a key vai no build config ou Info.plist, não em variáveis de ambiente do SO
- Dart/Flutter -- flutter_dotenv para runtime, --dart-define para compile-time
Configurando o arquivo .env corretamente
O arquivo .env é o padrão para desenvolvimento local. Ele nunca deve ser commitado no repositório.
# .env (desenvolvimento local - NUNCA commitar)
CPFHUB_API_KEY=sua-chave-de-desenvolvimento
APP_ENV=development
LOG_LEVEL=debug
# .env.example (commitar como template)
CPFHUB_API_KEY=coloque-sua-chave-aqui
APP_ENV=development
LOG_LEVEL=info
# .gitignore - Sempre incluir
.env
.env.local
.env.*.local
*.xcconfig
gradle.properties
local.properties
| Arquivo | Commitar | Conteúdo |
|---|---|---|
| .env | Nunca | Chaves reais de desenvolvimento |
| .env.example | Sempre | Template sem valores reais |
| .env.production | Nunca | Chaves de produção |
| .gitignore | Sempre | Regras para ignorar .env |
- .env.example -- template que documenta quais variáveis são necessárias sem expor valores
- .gitignore -- primeira linha de defesa contra commits acidentais de chaves
- Validação na inicialização -- falhe rápido se uma variável obrigatória estiver ausente
Ambientes de produção e CI/CD
Em produção, variáveis de ambiente são configuradas na infraestrutura, não em arquivos.
# Python - Validação de variáveis na inicialização
import os
import sys
REQUIRED_VARS = [
"CPFHUB_API_KEY",
"DATABASE_URL",
"APP_ENV",
]
def validar_ambiente():
ausentes = [var for var in REQUIRED_VARS if not os.environ.get(var)]
if ausentes:
print(f"Variáveis de ambiente ausentes: {', '.join(ausentes)}")
sys.exit(1)
# Validar formato da API key
api_key = os.environ["CPFHUB_API_KEY"]
if len(api_key) < 10:
print("CPFHUB_API_KEY parece inválida (muito curta)")
sys.exit(1)
validar_ambiente()
// JavaScript - Validação com schema
function validarAmbiente() {
const schema = {
CPFHUB_API_KEY: { required: true, minLength: 10 },
NODE_ENV: { required: true, values: ["development", "production"] },
};
const erros = [];
for (const [varName, rules] of Object.entries(schema)) {
const value = process.env[varName];
if (rules.required && !value) {
erros.push(`${varName} é obrigatória`);
} else if (value && rules.minLength && value.length < rules.minLength) {
erros.push(`${varName} é muito curta`);
} else if (value && rules.values && !rules.values.includes(value)) {
erros.push(`${varName} deve ser: ${rules.values.join(", ")}`);
}
}
if (erros.length > 0) {
console.error("Erros de configuração:", erros.join("; "));
process.exit(1);
}
}
validarAmbiente();
| Plataforma | Como configurar | Comando/Local |
|---|---|---|
| Docker | ENV ou --env-file | docker run --env-file .env |
| AWS ECS | Task Definition | Console ou CloudFormation |
| Heroku | Config Vars | heroku config:set CPFHUB_API_KEY=x |
| Vercel | Environment Variables | Dashboard do projeto |
| GitHub Actions | Secrets | Settings > Secrets |
- Falha rápida -- validar todas as variáveis na inicialização evita erros confusos em runtime
- Nunca logar chaves -- mesmo em logs de debug, nunca imprima o valor de variáveis sensíveis
- Secret managers -- em produção, considere AWS Secrets Manager, GCP Secret Manager ou HashiCorp Vault
Perguntas frequentes
O que acontece se eu expor minha chave de API da CPFHub.io em um repositório público?
Bots automatizados escaneiam repositórios públicos em busca de API keys e as utilizam imediatamente. Com a chave da CPFHub.io exposta, terceiros podem consumir suas consultas, gerando cobranças de excedente (R$ 0,15/consulta adicional) na sua conta. Rotacione a chave imediatamente em app.cpfhub.io/settings/billing e invalide a chave comprometida no painel.
Qual é a diferença entre .env e variáveis de ambiente de infraestrutura?
O arquivo .env é uma conveniência de desenvolvimento local — nunca deve ir para produção. Em produção, as variáveis são injetadas diretamente pelo ambiente (Docker, Kubernetes, Heroku, Vercel), sem arquivo no disco. Essa separação garante que credenciais de produção nunca fiquem em arquivos que podem ser acidentalmente commitados ou copiados.
Devo usar variáveis de ambiente diferentes para desenvolvimento e produção?
Sim, sempre. Use uma chave de desenvolvimento para testes locais e uma chave de produção exclusiva para o ambiente produtivo. Isso permite rotacionar a chave de produção sem impactar o desenvolvimento e monitorar o consumo de cada ambiente separadamente no painel da CPFHub.io.
Como proteger a chave de API em aplicativos mobile (iOS e Android)?
Em mobile, nunca inclua a chave diretamente no bundle do app — ele pode ser descompilado. A abordagem correta é criar um backend intermediário (BFF — Backend for Frontend) que armazena a chave como variável de ambiente e expõe um endpoint autenticado para o app. O app autentica no seu backend; o backend chama a API da CPFHub.io com a chave protegida no servidor.
Conclusão
Variáveis de ambiente são a forma universal e segura de gerenciar chaves de API em qualquer linguagem e plataforma. A implementação é simples: arquivo .env para desenvolvimento, variáveis de ambiente da infraestrutura para produção, e validação na inicialização para detectar problemas cedo. Independentemente de usar Python, JavaScript, Swift, Kotlin ou Dart, o princípio é o mesmo: nunca hardcode, sempre externalize.
Cadastre-se em cpfhub.io — 50 consultas mensais gratuitas, sem cartão de crédito — e proteja sua chave de API desde o primeiro commit seguindo as boas práticas deste guia.
CPFHub.io
Pronto para integrar a API?
50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.
Sobre a redação
Redação CPFHub.io
Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.



