Saltar para o conteúdo principal
Didit angaria 7,5 milhões de dólares para construir a infraestrutura para identidade e fraude
Didit
Voltar ao blog
Blog · 14 de março de 2026

Reforçar a Segurança de Webhooks com Validação de Assinatura HMAC (PT-PT)

Aprenda a implementar a validação de assinatura HMAC para uma segurança robusta de webhooks nas suas aplicações. Este guia oferece um checklist focado no desenvolvedor, padrões de código e melhores práticas para proteger dados.

Por DiditAtualizado
webhook-security-hmac-signature-validation.png

HMAC é EssencialA validação de assinatura HMAC (Hash-based Message Authentication Code) é um mecanismo crítico para garantir a autenticidade e integridade das cargas de webhook, prevenindo adulteração de dados e ataques de spoofing.

Checklist do DesenvolvedorA implementação bem-sucedida da validação HMAC requer atenção cuidadosa à gestão de chaves secretas, seleção de algoritmos e práticas de codificação consistentes tanto no remetente quanto no recetor.

Proteja Dados SensíveisEspecialmente ao lidar com dados de identidade ou transações financeiras, o HMAC fornece uma camada fundamental de confiança, verificando que os dados se originam de uma fonte legítima e não foram alterados em trânsito.

Melhores Práticas de IntegraçãoUse sempre uma chave secreta forte e única por webhook, armazene-a de forma segura e considere estratégias de rotação para manter altos níveis de segurança da API.

No cenário digital interligado de hoje, os webhooks tornaram-se um pilar fundamental para a comunicação em tempo real entre serviços. Quer esteja a receber notificações sobre o estado de verificação de identidade de um utilizador, uma transação de pagamento ou uma atualização de dados, a integridade e autenticidade destas mensagens são primordiais. No entanto, sem as salvaguardas adequadas, os webhooks podem ser vulneráveis a spoofing e adulteração, comprometendo a segurança da sua aplicação e colocando em risco dados de identidade sensíveis.

É aqui que a validação de assinatura HMAC entra em jogo. O HMAC fornece um mecanismo robusto para verificar se uma carga de webhook se originou genuinamente do remetente esperado e não foi alterada durante a transmissão. Para desenvolvedores que constroem ou integram com sistemas que lidam com informações críticas, compreender e implementar a validação HMAC não é apenas uma boa prática — é uma necessidade para uma forte segurança de webhooks.

Compreender o HMAC para a Segurança de Webhooks

HMAC, ou Hash-based Message Authentication Code, funciona como uma assinatura digital para mensagens. Combina uma função de hash criptográfica (como SHA-256 ou SHA-512) com uma chave secreta para produzir uma etiqueta única para uma mensagem. Quando um webhook é enviado, o remetente calcula uma assinatura HMAC com base na carga e numa chave secreta partilhada, e depois inclui esta assinatura num cabeçalho de pedido (por exemplo, X-Didit-Signature).

Ao receber o webhook, a sua aplicação realiza o mesmo cálculo usando exatamente a mesma carga e chave secreta. Se a assinatura calculada corresponder à fornecida no cabeçalho, pode ter a certeza de que:

  1. O webhook se originou da fonte legítima (autenticação).
  2. A carga não foi adulterada ou corrompida em trânsito (integridade).

Este processo é crucial para a segurança da API, especialmente ao lidar com plataformas como o Didit, que transmitem resultados sensíveis de verificação de identidade. Sem HMAC, um ator malicioso poderia intercetar um webhook, alterar o estado de verificação e potencialmente contornar os seus protocolos de segurança, levando a fraude ou violações de conformidade.

Validação HMAC: Um Checklist para Desenvolvedores

A implementação eficaz da validação HMAC requer adesão a alguns princípios chave:

  1. Gestão Segura da Chave Secreta: A chave secreta partilhada é o componente mais crítico. Deve ser uma string longa e aleatória (por exemplo, 32+ caracteres) e armazenada de forma segura em ambas as extremidades. Nunca a codifique diretamente nem a exponha em repositórios públicos. Use variáveis de ambiente, serviços de gestão de segredos ou ficheiros de configuração encriptados. O Didit, por exemplo, permite gerar e gerir chaves secretas de webhook de forma segura na sua consola de negócios.
  2. Codificação Consistente da Carga: O remetente e o recetor devem usar a mesma representação de bytes da carga para o cálculo do HMAC. Isso geralmente significa usar codificação UTF-8 e garantir espaços em branco consistentes ou canonicalização JSON, se aplicável. Qualquer desvio, mesmo um único byte, resultará numa assinatura incompatível.
  3. Seleção do Algoritmo: Escolha um algoritmo de hash criptográfico forte e moderno, como SHA-256 ou SHA-512. Evite algoritmos mais antigos e fracos. O Didit geralmente usa HMAC-SHA256.
  4. Análise do Cabeçalho da Assinatura: Extraia a assinatura do cabeçalho HTTP apropriado. Esteja atento a potenciais prefixos (por exemplo, sha256=) ou múltiplas assinaturas, se suportado.
  5. Proteção contra Replay Baseada em Tempo: Embora o HMAC valide a autenticidade, não impede ataques de replay (onde um atacante reenvia um webhook antigo e válido). Implemente um carimbo de data/hora no cabeçalho do webhook e rejeite pedidos mais antigos do que um determinado limite (por exemplo, 5 minutos) para mitigar isso.
  6. Comparação em Tempo Constante: Ao comparar a assinatura calculada com a assinatura recebida, use uma função de comparação em tempo constante (por exemplo, crypto.timingSafeEqual em Node.js, hmac.compare_digest em Python). Isso previne ataques de tempo, onde um atacante poderia deduzir informações sobre a chave secreta medindo o tempo de comparação.

Implementação Prática: Padrões de Código para Validação HMAC

Vamos ver como a validação HMAC geralmente funciona na prática em diferentes linguagens de programação. A lógica central permanece a mesma: receber o corpo do pedido bruto, obter o segredo, calcular o HMAC e comparar.

Exemplo em Node.js


const crypto = require('crypto');
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const WEBHOOK_SECRET = process.env.DIDIT_WEBHOOK_SECRET; // Armazenar de forma segura!

// Usar o parser de corpo bruto para o cálculo HMAC
app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf; } }));

app.post('/didit-webhook', (req, res) => {
  const signature = req.headers['x-didit-signature'];
  if (!signature) {
    return res.status(401).send('Nenhum cabeçalho de assinatura encontrado.');
  }

  const expectedSignature = `sha256=${crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(req.rawBody)
    .digest('hex')}`;

  // Usar comparação segura de tempo
  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature))) {
    console.warn('Incompatibilidade de assinatura do Webhook!', { received: signature, expected: expectedSignature });
    return res.status(403).send('Assinatura inválida.');
  }

  console.log('Webhook recebido e validado:', req.body);
  // Processar o seu evento de webhook aqui
  res.status(200).send('OK');
});

app.listen(3000, () => console.log('Recetor de Webhook a ouvir na porta 3000'));

Exemplo em Python (Flask)


import hmac
import hashlib
import os
from flask import Flask, request, abort

app = Flask(__name__)
WEBHOOK_SECRET = os.environ.get('DIDIT_WEBHOOK_SECRET') # Armazenar de forma segura!

@app.route('/didit-webhook', methods=['POST'])
def didit_webhook():
    if not WEBHOOK_SECRET:
        app.logger.error("Variável de ambiente DIDIT_WEBHOOK_SECRET não definida.")
        abort(500)

    signature = request.headers.get('X-Didit-Signature')
    if not signature:
        abort(401, 'Nenhum cabeçalho de assinatura encontrado.')

    # Obter o corpo do pedido bruto
    payload = request.get_data()

    # Calcular a assinatura esperada
    expected_signature = hmac.new(
        WEBHOOK_SECRET.encode('utf-8'),
        payload,
        hashlib.sha256
    ).hexdigest()

    # Comparar assinaturas usando um método seguro de tempo
    if not hmac.compare_digest(f'sha256={expected_signature}', signature):
        app.logger.warning(f"Incompatibilidade de assinatura do Webhook! Recebida: {signature}, Esperada: sha256={expected_signature}")
        abort(403, 'Assinatura inválida.')

    app.logger.info(f"Webhook recebido e validado: {request.json}")
    # Processar o seu evento de webhook aqui
    return 'OK', 200

if __name__ == '__main__':
    app.run(port=3000)

Repare no uso de req.rawBody em Node.js e request.get_data() em Python. É crucial usar o corpo do pedido bruto e não analisado para o cálculo do HMAC, pois quaisquer alterações de formatação por middleware podem invalidar a assinatura.

Como o Didit Ajuda na Segurança de Webhooks

O Didit, como plataforma de identidade tudo-em-um, compreende a importância crítica de proteger o fluxo de dados entre os seus serviços e as suas aplicações. É por isso que o sistema de webhooks do Didit é construído com validação HMAC robusta como uma funcionalidade central. Ao configurar webhooks na Consola de Negócios Didit, ser-lhe-á fornecida uma chave secreta única. O Didit gera então uma assinatura HMAC-SHA256 para cada webhook de saída e inclui-a no cabeçalho X-Didit-Signature.

Ao integrar os webhooks do Didit e validar diligentemente as suas assinaturas HMAC, garante que:

  • Todas as notificações sobre verificação de identidade, resultados de autenticação biométrica ou resultados de triagem AML são autênticas e não adulteradas.
  • A proteção de dados de identidade sensíveis é mantida da origem ao destino.
  • A sua aplicação atua apenas em eventos legítimos, prevenindo atividades fraudulentas ou alterações de estado incorretas.

A abordagem do Didit simplifica o processo, fornecendo documentação clara e geração de assinatura consistente, permitindo que a sua equipa se concentre no processamento dos dados verificados em vez de se preocupar com os mecanismos de segurança subjacentes.

Pronto para Começar?

A implementação da validação de assinatura HMAC é um passo fundamental para a construção de integrações seguras e fiáveis. Ao seguir estas diretrizes e aproveitar as funcionalidades de segurança fornecidas por plataformas como o Didit, pode melhorar significativamente a sua postura de segurança de webhooks e proteger-se contra vulnerabilidades comuns da API.

Explore as soluções abrangentes de verificação de identidade do Didit e os webhooks seguros:

FAQ: Segurança de Webhooks e Validação HMAC

P: O que é a validação de assinatura HMAC e por que é importante para webhooks?

R: A validação de assinatura HMAC (Hash-based Message Authentication Code) é um processo onde um hash criptográfico de uma carga de webhook é gerado usando uma chave secreta partilhada. É crucial para webhooks porque verifica tanto a autenticidade (garantindo que a mensagem veio do remetente esperado) quanto a integridade (confirmando que a mensagem não foi alterada) dos dados, prevenindo ataques de spoofing e adulteração e melhorando a segurança da API.

P: Como armazeno e gerencio as minhas chaves secretas de webhook de forma segura?

R: As chaves secretas de webhook devem ser tratadas como palavras-passe. Armazene-as em variáveis de ambiente, serviços dedicados de gestão de segredos (por exemplo, AWS Secrets Manager, HashiCorp Vault) ou ficheiros de configuração encriptados. Nunca as codifique diretamente, as submeta para controlo de versão ou as exponha em código do lado do cliente. Rode as chaves periodicamente para minimizar o risco de comprometimento e melhorar a proteção de dados de identidade.

P: Quais são as armadilhas comuns a evitar ao implementar a validação HMAC?

R: As armadilhas comuns incluem não usar o corpo do pedido bruto para o cálculo do HMAC (levando a incompatibilidades de assinatura), usar algoritmos de hash fracos, não usar uma comparação em tempo constante para assinaturas (vulnerável a ataques de tempo) e negligenciar a implementação de proteção contra ataques de replay (por exemplo, usando carimbos de data/hora). Garanta a codificação de caracteres consistente (por exemplo, UTF-8) entre remetente e recetor.

P: O HMAC previne ataques de replay?

R: Não, o HMAC por si só apenas garante a autenticidade e integridade de uma única mensagem. Não impede que um ator malicioso reenvie uma mensagem mais antiga e validamente assinada (um ataque de replay). Para mitigar ataques de replay, deve incluir um carimbo de data/hora nas suas cargas e cabeçalhos de webhook, e o seu recetor deve rejeitar quaisquer mensagens que sejam mais antigas do que um limite predefinido (por exemplo, 5 minutos).

Infraestrutura para identidade e fraude.

Uma API para KYC, KYB, Monitorização de Transações e Rastreio de Carteiras. Integre em 5 minutos.

Peça a uma IA para resumir esta página
Validação HMAC para Segurança Robusta de Webhooks.