Segurança de Dados Biométricos em Trânsito: Criptografia, Assinaturas e Conformidade
Como proteger dados biométricos de ponto do dispositivo ao cloud até sua aplicação — com TLS, assinaturas HMAC e arquitetura pronta para LGPD.
Introduction
Um template de impressão digital vaza. Diferente de uma senha, você não pode redefini-la. Os dados biométricos dos seus funcionários são irrevogáveis — e protegê-los não é negociável.
Os dados de ponto biométrico incluem templates de impressão digital, vetores de reconhecimento facial, IDs de funcionários e timestamps. Na maioria das jurisdições, isso se qualifica como dados pessoais sensíveis. A LGPD (Brasil), a Portaria 671 do MTE, o RGPD (UE) — todos exigem criptografia em trânsito, controles de acesso e trilhas de auditoria.
Conforme o Art. 5º, II da LGPD, dados biométricos são expressamente classificados como "dados pessoais sensíveis", exigindo tratamento especial sob os Arts. 11-13 da lei.
O Modelo de Ameaças
<svg viewBox="0 0 700 300" xmlns="http://www.w3.org/2000/svg" style="max-width:700px;width:100%;font-family:system-ui,sans-serif">
<rect width="700" height="300" fill="#1a1a2e" rx="12"/>
<text x="350" y="30" fill="#e0e0e0" font-size="17" font-weight="bold" text-anchor="middle">Dados Biométricos — Três Superfícies de Ataque</text>
<rect x="30" y="55" width="195" height="120" rx="8" fill="#3e1e1e" stroke="#ef5350" stroke-width="1"/>
<text x="127" y="80" fill="#ef5350" font-size="15" font-weight="bold" text-anchor="middle">① Dispositivo → Cloud</text>
<text x="127" y="105" fill="#ccc" font-size="14" text-anchor="middle">Man-in-the-middle</text>
<text x="127" y="125" fill="#ccc" font-size="14" text-anchor="middle">Captura de pacotes</text>
<text x="127" y="145" fill="#ccc" font-size="14" text-anchor="middle">Spoofing DNS</text>
<text x="127" y="165" fill="#81c784" font-size="14" text-anchor="middle">Fix: TLS 1.3</text>
<rect x="252" y="55" width="195" height="120" rx="8" fill="#3e1e1e" stroke="#ef5350" stroke-width="1"/>
<text x="350" y="80" fill="#ef5350" font-size="15" font-weight="bold" text-anchor="middle">② Cloud → Sua App</text>
<text x="350" y="105" fill="#ccc" font-size="14" text-anchor="middle">Injeção de webhook falso</text>
<text x="350" y="125" fill="#ccc" font-size="14" text-anchor="middle">Ataques de replay</text>
<text x="350" y="145" fill="#ccc" font-size="14" text-anchor="middle">Sequestro de endpoint</text>
<text x="350" y="165" fill="#81c784" font-size="14" text-anchor="middle">Fix: HMAC-SHA256</text>
<rect x="475" y="55" width="195" height="120" rx="8" fill="#3e1e1e" stroke="#ef5350" stroke-width="1"/>
<text x="572" y="80" fill="#ef5350" font-size="15" font-weight="bold" text-anchor="middle">③ Dados em Repouso</text>
<text x="572" y="105" fill="#ccc" font-size="14" text-anchor="middle">Violação de banco</text>
<text x="572" y="125" fill="#ccc" font-size="14" text-anchor="middle">Roubo de backups</text>
<text x="572" y="145" fill="#ccc" font-size="14" text-anchor="middle">Acesso interno</text>
<text x="572" y="165" fill="#81c784" font-size="14" text-anchor="middle">Fix: AES-256</text>
<rect x="30" y="200" width="640" height="80" rx="8" fill="#1b3a2d" stroke="#81c784" stroke-width="1"/>
<text x="350" y="225" fill="#81c784" font-size="15" font-weight="bold" text-anchor="middle">Cadeia de Segurança PunchConnect</text>
<text x="350" y="250" fill="#ccc" font-size="14" text-anchor="middle">TLS 1.3 (em trânsito) → HMAC-SHA256 (integridade webhook) → AES-256 (em repouso)</text>
<text x="350" y="270" fill="#ccc" font-size="14" text-anchor="middle">Todas as camadas ativadas por padrão — nenhuma configuração necessária</text>
</svg>
Camada 1: Criptografia Dispositivo-Cloud (TLS 1.3)
Toda comunicação entre os dispositivos biométricos e o PunchConnect é criptografada com TLS 1.3:
- Nenhum dado em texto puro sai do dispositivo pela rede
- O certificate pinning previne ataques man-in-the-middle
- O forward secrecy garante que sessões passadas permanecem criptografadas
Você não precisa configurar nada. Ao registrar um dispositivo no painel do PunchConnect, a conexão criptografada se estabelece automaticamente.
Camada 2: Verificação de Assinatura Webhook (HMAC-SHA256)
Quando o PunchConnect entrega dados de ponto para sua aplicação via webhook, como você sabe que realmente veio do PunchConnect? Um atacante que descubra seu endpoint webhook poderia enviar eventos falsos.
Python: Verificar Assinatura do Webhook
import hmacimport hashlibfrom flask import Flask, request, jsonifyapp = Flask(__name__)SEGREDO_WEBHOOK = "whsec_seu_segredo_de_assinatura"def verificar_assinatura(payload: bytes, assinatura: str) -> bool:"""Verificar assinatura webhook do PunchConnect."""esperada = hmac.new(SEGREDO_WEBHOOK.encode(),payload,hashlib.sha256).hexdigest()return hmac.compare_digest(esperada, assinatura)@app.route("/webhooks/ponto", methods=["POST"])def tratar_ponto():assinatura = request.headers.get("X-PunchConnect-Signature", "")if not verificar_assinatura(request.data, assinatura):app.logger.warning(f"Assinatura webhook inválida de {request.remote_addr}")return jsonify({"erro": "Assinatura inválida"}), 401evento = request.jsonfuncionario_id = evento["data"]["employee_id"]horario = evento["data"]["timestamp"]print(f"Ponto verificado: {funcionario_id} às {horario}")return jsonify({"recebido": True}), 200
Node.js: Verificar Assinatura do Webhook
const crypto = require('crypto');const express = require('express');const app = express();app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } }));const WEBHOOK_SECRET = process.env.PUNCHCONNECT_WEBHOOK_SECRET;function verificarAssinatura(payload, assinatura) {const esperada = crypto.createHmac('sha256', WEBHOOK_SECRET).update(payload).digest('hex');return crypto.timingSafeEqual(Buffer.from(esperada),Buffer.from(assinatura));}app.post('/webhooks/ponto', (req, res) => {const assinatura = req.headers['x-punchconnect-signature'];if (!assinatura || !verificarAssinatura(req.rawBody, assinatura)) {console.warn(`⚠️ Assinatura inválida de ${req.ip}`);return res.status(401).json({ erro: 'Assinatura inválida' });}const { data } = req.body;console.log(`✅ Verificado: ${data.employee_id} às ${data.timestamp}`);res.status(200).json({ recebido: true });});app.listen(3000, () => console.log('Listener webhook seguro na porta :3000'));
Camada 3: Dados em Repouso (AES-256)
Todos os dados armazenados na infraestrutura do PunchConnect são criptografados com AES-256: registros de ponto, templates biométricos, configurações de dispositivos, logs de webhooks e backups.
Conformidade LGPD e Portaria 671
Para implantações no Brasil, o PunchConnect atende às exigências da LGPD e da Portaria 671 do Ministério do Trabalho:
| Requisito | LGPD | Portaria 671 | PunchConnect |
|-----------|------|--------------|--------------|
| Criptografia em trânsito | Art. 46 | Requerido | ✅ TLS 1.3 |
| Criptografia em repouso | Art. 46 | Requerido | ✅ AES-256 |
| Controles de acesso | Art. 46 | Requerido | ✅ API keys + RBAC |
| Trilha de auditoria | Art. 37 | Obrigatório | ✅ Logs webhook |
| Dados sensíveis | Art. 11-13 | — | ✅ Apenas templates |
| Eliminação de dados | Art. 18, VI | — | ✅ DELETE /employees/{id} |
| REP-P (registro eletrônico) | — | Requerido | ✅ Compatível |
O PunchConnect se enquadra como REP-P (Registrador Eletrônico de Ponto via Programa) conforme a Portaria 671, atendendo aos requisitos do Art. 74 §2º da CLT para empresas com mais de 20 funcionários. Os fusos horários brasileiros (BRT/AMT/ACT/FNT) são tratados automaticamente pela API.
Eliminar Dados de Funcionário
# LGPD Art. 18, VI — Direito de eliminaçãocurl -X DELETE https://api.punchconnect.com/v1/employees/FUNC001 \-H "Authorization: Bearer SUA_API_KEY"
Prevenção de Ataques de Replay
from datetime import datetime, timezone, timedeltaIDADE_MAXIMA_WEBHOOK = timedelta(minutes=5)@app.route("/webhooks/ponto", methods=["POST"])def tratar_ponto():if not verificar_assinatura(request.data, request.headers.get("X-PunchConnect-Signature", "")):return jsonify({"erro": "Assinatura inválida"}), 401evento = request.json# Verificar frescura do timestamphora_evento = datetime.fromisoformat(evento["timestamp"])idade = datetime.now(timezone.utc) - hora_eventoif idade > IDADE_MAXIMA_WEBHOOK:return jsonify({"erro": "Webhook muito antigo"}), 400# Idempotência — rejeitar IDs de evento duplicadosevent_id = evento["event_id"]if redis_client.exists(f"webhook:{event_id}"):return jsonify({"status": "ja_processado"}), 200redis_client.setex(f"webhook:{event_id}", 86400, "1")processar_ponto(evento["data"])return jsonify({"recebido": True}), 200
FAQ
O PunchConnect armazena imagens de impressões digitais?
Não. O PunchConnect armazena apenas templates de impressão digital — representações matemáticas das características, não imagens reais. Os templates não podem ser revertidos em imagens. Distinção crucial para conformidade LGPD.
Qual versão de TLS o PunchConnect usa?
Todas as conexões usam TLS 1.3. TLS 1.0 e 1.1 não são suportados. TLS 1.2 é aceito como fallback para dispositivos mais antigos.
Posso restringir o acesso API a endereços IP específicos?
Sim. No painel do PunchConnect você pode configurar listas de IP permitidas para suas chaves API.
Como verifico se meu endpoint webhook está seguro?
O PunchConnect oferece uma ferramenta de teste webhook no painel. Envie um evento de teste e verifique: (1) seu servidor recebe via HTTPS, (2) a verificação de assinatura passa, e (3) você consegue rejeitar eventos com assinaturas adulteradas.
O que acontece com os dados se eu cancelar minha conta?
Todos os dados são excluídos em 30 dias após o cancelamento. Você pode exportar seus dados via API antes de cancelar. Conforme com a LGPD.
---
Segurança de dados biométricos não é opcional — é requisito legal. O PunchConnect cuida do mais difícil: TLS 1.3 para trânsito, AES-256 para armazenamento, HMAC-SHA256 para integridade webhook. Seu papel: verificar assinaturas webhook e armazenar chaves API com segurança.
Teste grátis por 7 dias — segurança de nível empresarial desde o primeiro dia, sem cartão de crédito.
Artigos relacionados
Como Conectar ZKTeco ao Odoo: Integração via API Cloud (Sem VPN, Sem Software Local)
10 min read
TutorialIntegração Webhook ZKTeco: Pipelines de Ponto em Tempo Real com API REST
12 min read
TutorialIntegração API de Leitor de Impressão Digital: Guia do Desenvolvedor para Biometria Cloud
8 min read