Cómo difieren los grupos de 1:1
La criptografía sigue siendo: Chat XDK para claves y payloads; X API para crear el grupo, publicar los envoltorios de clave de los participantes, enviar mensajes y cargar eventos.
Crear el grupo y establecer claves
- Genera el ID de grupo con
POST /2/chat/conversations/group/initialize— eldata.conversation_idde la respuesta es el ID con prefijogque usas en todo lo siguiente. - Carga la clave pública de identidad y el
public_key_versionde cada miembro (rutasGETde public-key bajo Encryption keys;GET /2/users/public_keysobtiene varios usuarios en una sola solicitud). Verifica cada registro converify_key_bindingantes de usarlo (consulta la advertencia en Primeros pasos). - Ejecuta
prepare_group_createuna vez, con todos los miembros (incluido tú), el ID con prefijog, y las listas de IDs de miembros/administradores. Una llamada genera la clave de conversación, la envuelve para cada miembro y firma la creación con la identidad de sesión deset_identity— devuelve dos firmas de acción (el cambio de clave de conversación y la creación del grupo). POST /2/chat/conversations/groupcon los miembros/administradores del grupo,conversation_key_version,conversation_participant_keys(SDKencrypted_key→ APIencrypted_conversation_key) y ambasaction_signatures. Los fallos de validación regresan como mensajes estables y legibles por humanos, por ejemplo"Too many members: adding these members would exceed the allowed group size."o"Cannot add all members: one or more of the requested members cannot be added to this conversation.".- Guarda la clave de conversación en bruto y la versión para cifrar/descifrar.
prepare_group_create firma el title y avatar_url que pasas y los incrusta literalmente en el evento group-create. El servidor los verifica contra tu solicitud, así que los valores group_name / group_avatar_url en el cuerpo del POST deben ser idénticos byte a byte a lo que pasaste al SDK — de lo contrario, la llamada falla la validación de firma.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
message_id, encoded_message_event_detail, message_event_signature anidado) es el mismo que el POST de claves en Primeros pasos — claves de conversación.
Cuando cambia la membresía, llama a prepare_group_members_change con los nuevos IDs de miembros más la lista actual (miembros, administradores, miembros pendientes y el título/avatar/TTL actuales si están definidos). Rota la clave de conversación y, como group create, devuelve dos firmas de acción — envía todo con POST a add members (POST /2/chat/conversations/{id}/members). Luego espera tráfico de key-change: trátalo como rotación de clave en Primeros pasos (extract_conversation_keys / decrypt_events, luego cifra con la última versión).
Como prepare_group_members_change genera una clave de conversación nueva envuelta solo para la lista que pasas, los nuevos miembros reciben la nueva versión de clave y no pueden descifrar mensajes enviados con versiones anteriores. Lo contrario no es cierto: la rotación nunca revoca el acceso a versiones anteriores — cualquiera que ya tenga una clave vieja aún puede leer los mensajes cifrados con ella. Si sospechas que una clave de conversación fue expuesta, rota con prepare_conversation_key_change; esto protege solo los mensajes futuros.
Metadatos cifrados del grupo
Algunos campos de la conversación (por ejemplo el name o avatar URL de visualización) pueden llegar cifrados con la clave de conversación. Eso no esencrypt_message; es el par genérico encrypt / decrypt del Chat XDK (string UTF-8 dentro, texto cifrado en base64 fuera, con la clave de conversación en bruto).
Si un campo dado se almacena cifrado lo decide el cliente que lo escribe: prepare_group_create firma y envía el título exactamente como lo proporcionas (la clave de conversación no existe hasta que esa llamada la genera, por lo que un título en el momento de creación no se puede cifrar con ella). Cuando lees una conversación cuyos campos son texto cifrado, descífralos con decrypt y la versión de clave que estaba activa cuando se escribió el campo.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Mensajes y eventos
Enviar y recibir en un grupo es lo mismo que 1:1 una vez que tienes la clave de conversación en bruto:- Enviar:
encrypt_message→ API send-message (Primeros pasos) - Recibir: API de eventos o entrega en tiempo real →
decrypt_event/decrypt_events - Contenido multimedia: Multimedia con el ID de conversación de grupo
Lista de verificación
- Genera el ID con prefijo
gconPOST /2/chat/conversations/group/initialize prepare_group_createcon todos los miembros; POST los envoltorios de clave de los participantes y ambas firmas de acción aPOST /2/chat/conversations/group- Guarda en caché la clave en bruto + versión; actualiza en eventos de cambio de clave
- En cambios de membresía,
prepare_group_members_change(dos firmas) →POST /2/chat/conversations/{id}/members - Descifra los metadatos del grupo con
decryptcuando los campos sean texto cifrado - Envía/recibe con los mismos patrones que 1:1