Skip to main content
Esta página cobre problemas que são específicos da criptografia do X Chat e do Chat XDK — chaves, backup seguro de chaves, descriptografia/verificação e construção de payloads criptografados de envio. Para webhooks, OAuth, códigos de status HTTP e limites de taxa, use a documentação geral da X API e de autenticação.

Chaves e backup seguro de chaves

O desbloqueio falha (código de acesso inválido)

  • Confirme que o código de acesso corresponde ao usado com setup
  • Aguarde entre tentativas; realms limitam tentativas incorretas e podem travar a recuperação após muitas falhas

Criptografar ou descriptografar falha porque as chaves ou a identidade não foram definidas

Carregue as chaves privadas primeiro e depois defina a identidade da sessão — seu ID de usuário mais o public_key_version do seu registro no X. Os métodos encrypt_* e prepare_* assinam com ela; chamá-los sem identidade da sessão (e sem uma sobrescrita explícita por chamada) é um erro.

Sua chave pública local nunca corresponde às chaves registradas da conta

Os clientes frequentemente precisam responder “a chave neste dispositivo é uma das chaves registradas para esta conta?” — após uma restauração ou importação, para adotar o public_key_version correto, ou para decidir se o onboarding já aconteceu. Comparar a saída de get_public_keys do Chat XDK com o campo public_key da API como strings sempre falha, mesmo para a mesma chave, porque as duas usam codificações diferentes:
  • A API armazena e retorna a chave exatamente como o registro fez o upload: a codificação DER (SPKI) — a chave crua atrás de um prefixo fixo de identificador de algoritmo
  • O get_public_keys do Chat XDK retorna apenas a chave crua, sem esse prefixo
A mesma chave, duas grafias. Para comparar, decodifique ambas de base64 e verifique se os bytes da API terminam com os bytes do SDK (bytes idênticos também correspondem, caso ambos os lados algum dia mantenham a mesma codificação):
Depois de haver correspondência, adote o public_key_version daquela linha para set_identity. Ao comparar versões (por exemplo, para escolher a chave mais nova), compare numericamente — as versões são timestamps em milissegundos com comprimento de string variável, então uma comparação lexicográfica escolhe a errada.

Chave de conversa ausente para uma mensagem

Um erro como Message encrypted with key version '…' but no matching key found significa que você não tem a chave em bruto para o conversation_key_version daquela mensagem.
  1. Descriptografe o material de chave a partir de conversation_key_change_event (eventos ao vivo) ou meta.conversation_key_events (histórico) com extract_conversation_keys, ou inclua esses blobs em decrypt_events — com set_cache_keys(true) habilitado, decrypt_events também retém a chave verificada mais recente de cada conversa para que chamadas posteriores de decrypt_event e encrypt_* possam omiti-la
  2. Confirme que as chaves de conversa foram adicionadas para essa versão e que você ainda é um participante (veja Guia de introdução)

O par não tem chaves públicas

Pode ser que ele não tenha concluído o onboarding. Depois que ele se registrar, carregue public_key, signing_public_key, identity_public_key_signature e public_key_version a partir de Referência da API → Chaves de criptografia.

Descriptografia e assinaturas

A descriptografia falha

  • Chave de conversa em bruto obsoleta ou errada, ou versão de chave errada
  • String encoded_event incompleta
  • O tipo de evento não é uma mensagem criptografada que você pode tratar como conteúdo descriptografável

A assinatura não verifica

A verificação é fail-closed por padrão (reject_unverified = true): o SDK já rejeita eventos assinados não verificados, então uma falha aqui significa que as entradas de verificação estão erradas, e não que você precisa ativar a verificação. Causas comuns:
  • Entrada de chave de assinatura ausente ou incompleta para o remetente (todos os campos exigidos pelo Chat XDK — veja a referência do Chat XDK)
  • Nenhuma chave de assinatura passada na chamada e nenhuma armazenada via set_signing_keys
  • O remetente rotacionou versões — busque as chaves públicas dele novamente
  • Uma versão de chave abaixo do piso aceito nunca é verificada
  • Em um evento de mudança de chave de grupo, quem assinou já saiu do grupo, então suas chaves não são mais servidas — veja Mudanças de chave de membros que saíram
O setter set_reject_unverified existe para você desabilitar esse padrão (false, não recomendado). Se você o desativou antes, restaure o padrão fail-closed:

Uma resposta carrega reply_preview_validation: "Invalid"

Respostas descriptografadas podem carregar reply_preview_validation ("Valid" / "Invalid"; JavaScript usa 'valid' / 'invalid'). Invalid significa que a pré-visualização citada dentro da mensagem não corresponde ao evento original assinado que ela embute — trate a citação como não confiável e renderize o conteúdo citado apenas a partir do original validado. A mensagem em si é verificada separadamente e continua autêntica; nada é lançado por uma pré-visualização inválida.

Eventos antigos falham permanentemente na verificação

Erros como signature missing or no matching signing key ou uma incompatibilidade ECDSA em eventos antigos são permanentes. Assinaturas são imutáveis e verificadas reconstruindo o payload assinado a partir do próprio evento, então um evento que foi assinado sobre bytes diferentes (ou nunca foi assinado) falha em cada carregamento futuro — nenhuma nova tentativa, atualização de chave ou chamada de API pode curá-lo. Trate esses eventos como lápides, não como erros repetíveis. Rotacionar a chave de conversa inicia um histórico limpo e verificável a partir daquele ponto; novas mensagens não são afetadas.

Construindo o payload de envio

Estes erros são específicos da criptografia do X Chat (não são erros HTTP gerais):

A API retorna 400 para uma chamada que altera estado

Toda chamada de chat que altera estado — adicionar ou rotacionar chaves de conversa, criar um grupo, adicionar membros — requer action_signatures no corpo da requisição, validado na fronteira da API. Uma entrada ausente ou malformada (cada uma precisa de message_id, encoded_message_event_detail e um message_event_signature com signature, public_key_version e signature_version) retorna imediatamente uma resposta HTTP 400 problem-details. Use os métodos prepare do SDK (prepare_conversation_key_change, prepare_group_create, prepare_group_members_change) e envie todas as assinaturas retornadas — criar grupo e adicionar membros retornam duas.

Criptografar e descriptografar mídia

  • Use a mesma chave de conversa (e versão) da mensagem que referencia o anexo
  • Trate respostas de download como texto cifrado até executar decrypt_stream
  • Deduza o tipo MIME após descriptografar; o Content-Type do download frequentemente não é o tipo real da imagem
Detalhes: Mídia.

Depuração segura

Ao investigar falhas de criptografia:
  • Registre apenas IDs de conversa, IDs de evento e versões de chave
  • Não registre texto simples, códigos de acesso, chaves privadas ou blobs de chave completos
  • Confirme que a versão de chave de assinatura passada para set_identity corresponde ao public_key_version no seu registro de chave pública
  • Para histórico incompleto, pagine todas as páginas de eventos para que os metadados de mudança de chave não sejam pulados antes de descriptografar