Criptografia Ponta a Ponta
Criptografia híbrida RSA + AES-256-GCM. Mensagens são criptografadas no cliente — o servidor nunca vê o texto plano.
Modelo de Ameaça
Confiáveis: O operador (desk/CRM) e o cliente. Cada um possui sua própria chave privada.
Não confiáveis: O backend do ixblix, banco de dados e atacantes de rede. O backend nunca possui uma chave privada e nunca vê texto plano.
O que NÃO é protegido
- Metadados: quem fala com quem, quando e quantas mensagens.
- Armazenamento do operador: o operador é responsável por proteger sua chave privada.
- Dispositivo do cliente: se comprometido, a chave privada pode ser roubada.
Esquema Criptográfico
| Propósito | Algoritmo | Parâmetros |
|---|---|---|
| Envelope de chave | RSA-OAEP | 2048-bit, SHA-256 |
| Conteúdo da mensagem | AES-256-GCM | Chave 256-bit, IV 96-bit, tag 128-bit |
Cada mensagem usa uma chave nova AES-256-GCM. Essa chave AES é então envolvida (criptografada) pela chave pública RSA do destinatário. Isso fornece forward secrecy entre mensagens.
Auto-Leitura
A chave AES de cada mensagem é envolvida duas vezes: uma para o destinatário e uma para a própria chave pública do remetente. Isso permite que cada lado leia suas próprias mensagens enviadas.
Envelope da Mensagem
| Campo | Descrição |
|---|---|
content | Ciphertext AES-256-GCM (base64). |
iv | Vetor de inicialização AES-GCM de 96 bits (base64). |
authTag | Tag de autenticação AES-GCM de 128 bits (base64). |
encryptedKey | Chave AES envolvida pela chave RSA pública do destinatário. |
selfEncryptedKey | Chave AES envolvida pela própria chave RSA do remetente. |
keyId | Identificador da chave pública do remetente. |
Fluxo de Troca de Chaves
- O operador gera um par de chaves RSA persistente e registra a chave pública via
PUT /api/companies/encryption-key. - O operador cria uma conversa. O backend faz snapshot da chave ativa da empresa.
- O cliente abre o deeplink. O navegador gera um par de chaves RSA. A chave privada fica no IndexedDB.
- O cliente registra a chave pública via
POST /api/conversations/{token}/key. - O ixblix envia um webhook
CUSTOMER_JOINEDcom a chave pública do cliente. - Ambos os lados agora podem criptografar mensagens um para o outro.
Exemplo de Criptografia
TypeScript (SDK)
import { encryptToRecipient } from '@ixblix/sdk-js';
const envelope = encryptToRecipient(
'Olá da Acme Corp!',
customerPublicKeySpki,
operatorKey.keyId,
operatorKey.publicKeySpki,
);
// envelope.content — ciphertext em base64
// envelope.iv — IV em base64
// envelope.authTag — tag de autenticação em base64
// envelope.encryptedKey — chave AES envolvida para o cliente em base64
// envelope.selfEncryptedKey — chave AES envolvida para si mesmo em base64
// envelope.keyId — id da chave do operador