Segurança e autenticação de webhooks (HMAC)
HMAC autentica que o webhook veio da evob — impede dados forjados no receptor.
Onde acessar
Plataforma > Configurações > Webhooks > [webhook] > Chave secretaPor que validar a autenticidade
Qualquer pessoa que descubra a URL do seu receptor pode enviar um POST forjado simulando um evento da evob — por exemplo, fingir uma compra aprovada para acionar uma matrícula fraudulenta no CRM.
A validação HMAC resolve isso: a evob assina cada payload com uma chave secreta compartilhada. O receptor verifica a assinatura antes de processar — se não bater, o payload é rejeitado.
Como funciona o HMAC
Na evob (ao enviar):- Gera a assinatura: `HMAC-SHA256(payload_body, chave_secreta)`
- Inclui a assinatura no header da requisição: `X-Evob-Signature: sha256=XXXXXXXXX`
- Lê o header `X-Evob-Signature`
- Recalcula o HMAC com o body recebido e a chave secreta
- Compara as duas assinaturas — se forem iguais, o payload é autêntico
- Se forem diferentes, rejeita com HTTP 401
Configurar a chave secreta
- Acesse Webhooks > [webhook] > Chave secreta
- Gere uma chave aleatória (mínimo 32 caracteres) ou use a gerada pelo sistema
- Copie a chave — ela é exibida apenas uma vez
- Configure a mesma chave no receptor para que ele possa verificar a assinatura
Código de verificação no receptor
Node.js:```javascript const crypto = require('crypto')
function verificarAssinatura(payload, signature, secret) { const calculado = 'sha256=' + crypto .createHmac('sha256', secret) .update(payload, 'utf8') .digest('hex') return crypto.timingSafeEqual( Buffer.from(calculado), Buffer.from(signature) ) } ```
Python:```python import hmac, hashlib
def verificar_assinatura(payload, signature, secret): calculado = 'sha256=' + hmac.new( secret.encode(), payload, hashlib.sha256 ).hexdigest() return hmac.compare_digest(calculado, signature) ```
Use `timingSafeEqual` / `compare_digest` em vez de `==` para evitar ataques de timing.
Boas práticas
✅ Faça
- Valide a assinatura HMAC em todos os endpoints que recebem webhooks da evob — sem validação, qualquer requisição POST é aceita, incluindo dados forjados
- Use `compare_digest` ou equivalente seguro para comparar assinaturas — comparação simples com `==` é vulnerável a timing attacks
- Rotacione a chave secreta periodicamente e quando houver suspeita de comprometimento — após trocar a chave no admin, atualize imediatamente no receptor
❌ Não faça
- Expor a chave secreta em código-fonte versionado (Git) — use variáveis de ambiente para armazenar a chave
- Ignorar erros de assinatura em produção — um payload com assinatura inválida deve ser rejeitado com 401 e o incidente logado; pode indicar tentativa de ataque
- Validar apenas o header sem verificar o body — a assinatura cobre o body inteiro; validar só parte dele não garante integridade
Erros comuns
"A validação HMAC está sempre falhando mesmo com a chave correta"
O body da requisição precisa ser lido como raw bytes, não como JSON parseado. Frameworks que parsam o JSON antes da validação alteram o body (espaços, ordem de campos) e invalidam a assinatura. Leia o raw body antes de parsear.
"Onde encontro a chave secreta se perdi?"
A chave não é exibida novamente após a criação. Acesse Webhooks > [webhook] > Chave secreta > Gerar nova chave — isso invalida a chave antiga e gera uma nova. Atualize o receptor com a nova chave imediatamente.
"O Zapier não suporta validação HMAC — como proceder?"
Zapier não expõe o raw body para validação de assinatura em triggers por webhook padrão. Use uma URL secreta como mitigação: gere uma URL com token único para o trigger do Zapier e mantenha-a confidencial. Para segurança máxima, use um servidor intermediário que valida HMAC antes de repassar para o Zapier.
"Posso usar a mesma chave secreta para todos os webhooks?"
Tecnicamente sim, mas não é recomendado — uma chave comprometida afetaria todos os webhooks. Use uma chave distinta por webhook ou por sistema receptor.
Próximos passos
- 📖 Webhooks — conceito e funcionamento
- 📖 Configurar e testar um webhook
- 📖 Retry e depuração de webhooks
- 📖 Conectar LeadLovers via webhook
Foi útil este artigo? 👍 👎 Falar com CS (em produção) · Pergunte ao Vob 🤖 (em produção) Última atualização: 2026-05-07