Chaves e backup seguro de chave
Unlock falha (código de acesso inválido)
- Confirme que o código de acesso corresponde ao usado com
setup - Aguarde entre tentativas; os realms limitam a taxa de tentativas incorretas e podem bloquear a recuperação após falhas demais
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Criptografia ou descriptografia falha porque as chaves ou a identidade não estão 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 uma identidade de sessão (e sem um override explícito por chamada) é um erro.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
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 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, de modo que chamadas posteriores dedecrypt_eventeencrypt_*podem omiti-la - Confirme que as chaves de conversa foram adicionadas para aquela versão e que você ainda é um participante (veja Primeiros passos)
O peer não tem chaves públicas
Talvez 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 em Referência da API → Chaves de criptografia.
Descriptografia e assinaturas
Descriptografia falha
- Chave da conversa em bruto obsoleta ou incorreta, ou versão de chave errada
- String
encoded_eventincompleta - O tipo de evento não é uma mensagem criptografada que você possa tratar como conteúdo descriptografável
A assinatura não é verificada
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, não que você precisa ligar a checagem. 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 nem armazenada via
set_signing_keys - O remetente rotacionou as versões — busque suas chaves públicas novamente
- Uma versão de chave abaixo do piso aceito nunca é verificada
set_reject_unverified existe para desabilitar esse padrão (false, não recomendado). Se você o desabilitou anteriormente, restaure o padrão fail-closed:
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Uma resposta traz reply_preview_validation: "Invalid"
Respostas descriptografadas podem trazer reply_preview_validation ("Valid" / "Invalid"; JavaScript usa 'valid' / 'invalid'). Invalid significa que o preview citado dentro da mensagem não corresponde ao evento original assinado que ela incorpora — 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 um preview inválido.
Eventos antigos falham permanentemente na verificação
Erros comosignature missing or no matching signing key ou um mismatch de 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 assinado sobre bytes diferentes (ou nunca assinado) falha em toda carga futura — nenhuma retentativa, atualização de chave ou chamada de API pode consertá-lo. Trate esses eventos como tombstones, não como erros com retentativa. Rotacionar a chave da conversa inicia um histórico limpo e verificável a partir desse ponto; novas mensagens não são afetadas.
Montando o payload de envio
Estes erros são específicos da criptografia do X Chat (não erros HTTP gerais):A API retorna 400 para uma chamada que muda estado
Toda chamada de chat que muda estado — adicionar ou rotacionar chaves de conversa, criar um grupo, adicionar membros — requeraction_signatures no corpo da requisição, validado na borda 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 uma resposta problem-details HTTP 400 imediatamente. Use os métodos prepare do SDK (prepare_conversation_key_change, prepare_group_create, prepare_group_members_change) e envie todas as assinaturas retornadas — criação de grupo e adição de membros retornam duas.
Criptografia e descriptografia de 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 - Infira 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_versiondo seu registro de chave pública - Para histórico incompleto, pagine todas as páginas de eventos para que metadados de mudança de chave não sejam pulados antes de descriptografar