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ósitoAlgoritmoParâmetros
Envelope de chaveRSA-OAEP2048-bit, SHA-256
Conteúdo da mensagemAES-256-GCMChave 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

CampoDescrição
contentCiphertext AES-256-GCM (base64).
ivVetor de inicialização AES-GCM de 96 bits (base64).
authTagTag de autenticação AES-GCM de 128 bits (base64).
encryptedKeyChave AES envolvida pela chave RSA pública do destinatário.
selfEncryptedKeyChave AES envolvida pela própria chave RSA do remetente.
keyIdIdentificador da chave pública do remetente.

Fluxo de Troca de Chaves

  1. O operador gera um par de chaves RSA persistente e registra a chave pública via PUT /api/companies/encryption-key.
  2. O operador cria uma conversa. O backend faz snapshot da chave ativa da empresa.
  3. O cliente abre o deeplink. O navegador gera um par de chaves RSA. A chave privada fica no IndexedDB.
  4. O cliente registra a chave pública via POST /api/conversations/{token}/key.
  5. O ixblix envia um webhook CUSTOMER_JOINED com a chave pública do cliente.
  6. 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