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
- Python
- TypeScript
- Rust
- Go
- C#
- Java
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 opublic_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.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
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 opublic_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_keysdo Chat XDK retorna apenas a chave crua, sem esse prefixo
- Python
- TypeScript
- Rust
- Go
- C#
- Java
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 comoMessage 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.
- Descriptografe o material de chave a partir de
conversation_key_change_event(eventos ao vivo) oumeta.conversation_key_events(histórico) comextract_conversation_keys, ou inclua esses blobs emdecrypt_events— comset_cache_keys(true)habilitado,decrypt_eventstambém retém a chave verificada mais recente de cada conversa para que chamadas posteriores dedecrypt_eventeencrypt_*possam omiti-la - 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, carreguepublic_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_eventincompleta - 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
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:
- Python
- TypeScript
- Rust
- Go
- C#
- Java
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 comosignature 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 — requeraction_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-Typedo download frequentemente não é o tipo real da imagem
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_identitycorresponde aopublic_key_versionno 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