Aviso crítico para usuários e desenvolvedores de apps
Texto de produto e docs que você deve exibir
Se o seu app solicita escopos OAuth relacionados a DM (dm.read, dm.write e escopos correlatos), acompanhe a tela de consentimento OAuth com uma linguagem de produto clara:
- As chaves de criptografia permanecem no dispositivo do usuário quando você usa o caminho oficial do SDK de cliente.
- Usuários nunca devem digitar o PIN do X Chat em um site que o encaminhe para um backend.
- Integrações legítimas usam o Chat XDK para que a recuperação apoiada em PIN e a criptografia rodem localmente (para navegadores: WASM + backup seguro de chaves).
- Um app malicioso que obtenha chaves privadas pode exfiltrá-las; hoje não existe um “revogar essa chave” do lado do servidor para uma chave raiz mantida puramente no cliente — projete de forma que os usuários nunca precisem entregar chaves raiz a você.
O que conta como material de chave sensível
Escolha o caminho de chave certo por tipo de app
Apps cliente devem preferir backup seguro de chaves. Servidores e bots costumam usar um blob de chave exportado. Detalhes: Guia de introdução.
Regras para chaves privadas e PINs
Faça
- Colete o PIN apenas em uma UI cliente confiável que alimente o Chat XDK (
unlock/setup) no mesmo dispositivo. - Mantenha as chaves em memória apenas enquanto forem necessárias. Após o unlock, reutilize a mesma instância Chat durante a sessão; chame
lock()oufree()no logout. - Zere os buffers de PIN quando a API permitir (por exemplo, passe um PIN como
Uint8Arrayem JS para poder limpá-lo após ounlock). - Armazene blobs de chave de bots em um secret manager (ou HSM), criptografe em repouso, restrinja IAM, rotacione credenciais de processo com frequência.
- Registre logs com cuidado: nunca registre PINs, chaves privadas, blobs de chave, chaves de conversa desembrulhadas ou respostas completas de backup seguro.
- Defenda o cliente: XSS, extensões maliciosas e dependências comprometidas podem ler chaves em memória mesmo quando o caminho de rede está limpo.
Não faça
- Não envie por e-mail, tire prints ou abra ticket com um PIN ou blob de chave.
- Não coloque chaves privadas ou PINs em query strings, analytics, rastreadores de erro ou logs de CDN.
- Não envie chaves privadas de usuário final “para simplificar o backend”.
- Não confunda revogação de OAuth com revogação de chave. Desconectar um app não apaga chaves que o usuário já exportou ou digitou em um cliente hostil.
- Não armazene a saída bruta de
export_keysemlocalStorageou IndexedDB não criptografado em apps de UI de produção.
Persistência de sessão no navegador
Apps de navegador em produção devem otimizar primeiro pela segurança e depois pela UX:
Demos internos às vezes exportam chaves para o
localStorage por conveniência. Isso é aceitável para protótipos descartáveis; não é um padrão de produção. Prefira:
createChat+unlock(pin)após a recarga.- Contexto em nível de módulo ou de framework guardando a instância desbloqueada para navegação na SPA.
lock()quando a aba fizer logout ou o usuário bloquear o app.
Escopos OAuth vs chaves de criptografia
Estes são planos de controle separados:- OAuth autoriza chamadas de API (listar conversas, publicar texto cifrado, buscar eventos).
- Chaves privadas autorizam o acesso criptográfico ao conteúdo das mensagens.
- Solicitar apenas os escopos de DM de que precisa.
- Explicar por que o acesso a DM é necessário.
- Rodar a criptografia no dispositivo, para que o OAuth nunca se torne um canal para coletar PINs.
- Parar de manter tokens no logout; separadamente, chamar
lock()nas chaves do chat.
Checklist operacional
- Sem campos de PIN ou chave privada nos corpos de requisição do servidor para fluxos de UI
- Backup seguro de chaves (
setup/unlock) para clientes; secret manager para blobs de bots - Instância Chat desbloqueada com escopo de uma única sessão de usuário; limpa no logout
- Logging e APM sem segredos
- Controles de CSP e XSS em qualquer página que possa desbloquear o chat
- Texto voltado ao usuário: nunca compartilhar o PIN com terceiros
- Plano de incidentes: se um blob de bot vazar, rotacionar chaves / registrar novamente e tratar o texto cifrado histórico como exposto ao detentor da chave antiga
Leituras relacionadas
- Criando apps de UI com WASM — arquitetura de cliente
- Primer de criptografia — chaves de identidade, chaves de conversa, backup seguro de chaves
- Guia de introdução — registrar chaves e enviar uma mensagem
- Chat XDK — referência da API
- Fundamentos: Segurança — OAuth e higiene de credenciais de API