Análisis Forense

Metadatos de WhatsApp

Datos estructurados almacenados en la base de datos msgstore.db de WhatsApp que registran información sobre cada mensaje: remitente, destinatario, marca temporal del servidor, estado de entrega, hash del medio y flag de reenvío.

32 min de lectura
TL;DR - Metadatos de WhatsApp

WhatsApp aparece con frecuencia en los procedimientos judiciales españoles con prueba digital, aunque la estadística pública no desglosa los asuntos por aplicación. Lo que casi nadie aprovecha es que la discusión suele quedarse en las capturas de pantalla, ignorando que la base de datos msgstore.db contiene decenas de campos de metadatos —identificadores de mensaje, marcas de recepción y lectura, indicadores de reenvío, referencias a la conversación de origen— que son más difíciles de falsificar que el propio texto del mensaje. Bien extraídos y con cadena de custodia documentada, esos metadatos son a menudo la diferencia entre una prueba que se impugna con éxito y una que resiste el contraste pericial.

Dato claveValor
Campos por mensaje25+ en msgstore.db
Base de datos principal Androidmsgstore.db (SQLite)
Base de datos principal iOSChatStorage.sqlite (SQLite)
Cifrado backup AndroidAES-256-GCM (crypt15)
Marca temporalServidor WhatsApp (no dispositivo)
Estados de entrega0=enviado, 4=recibido, 5=leido, 6=reproducido
Recuperación tras borradoPosible via WAL y slack space
Penetración de WhatsApp en España89,3 % de los internautas (ficha de Statista, 2025) — el INE no cuenta usuarios de una app concreta, y una cuota sobre internautas no equivale a un número absoluto de usuarios sin su denominador

Definición en 30 segundos

Los metadatos de WhatsApp son la información que la aplicación registra automáticamente sobre cada mensaje: quién lo envió, cuándo lo envió, si se entregó, si se leyó y qué archivos se adjuntaron. En Android se almacenan en una base de datos SQLite llamada msgstore.db dentro del dispositivo. En iOS, la base de datos equivalente es ChatStorage.sqlite. A diferencia del contenido del mensaje (que puede capturarse con un screenshot manipulable), los metadatos incluyen marcas temporales de recepción y hashes de los archivos adjuntos generados por el sistema, lo que —bien adquiridos y con cadena de custodia— los convierte en evidencia forense de primer nivel en procedimientos judiciales. Según el Tribunal Supremo (STS 300/2015), cuando se impugna la autenticidad de una captura de pantalla la carga de acreditarla se desplaza a quien la aporta, y la prueba pericial —con los metadatos forenses— es el medio que mejor la sostiene.


Qué son los metadatos de WhatsApp y por que importan en juicio

Cuando un abogado presenta capturas de pantalla de WhatsApp como prueba, la parte contraria puede impugnarlas alegando manipulación. Y tiene razón: existen aplicaciones como WhatsFake que generan conversaciones falsas indistinguibles de las reales. En mi experiencia pericial, he analizado casos donde capturas presentadas como “prueba” eran fabricaciones completas. Sin embargo, los metadatos almacenados en la base de datos interna de WhatsApp son otra historia.

Los metadatos son la capa contextual que rodea a cada mensaje; la propia base de datos almacena además el contenido, en un campo aparte (data en el esquema legado, message.text_data en el moderno). Esa capa es la infraestructura probatoria del mensaje: cuándo se envió exactamente (con precisión de milisegundos), desde qué número, a qué número, si se entregó al servidor, si llegó al dispositivo del destinatario, si se leyó, si se reenvió desde otro chat, y el hash SHA-256 del archivo adjunto. Esta información es generada automáticamente por el sistema, no por el usuario, y por eso tiene un valor probatorio superior al contenido en sí.

El Tribunal Supremo español ha establecido que la prueba digital necesita elementos de autenticidad que vayan más allá de la simple captura de pantalla. La STS 629/2025, de 3 de julio (ROJ STS 3341/2025), confirma —no relaja— la línea de la STS 300/2015: la pericial se vuelve necesaria cuando la autenticidad se impugna con indicios concretos, no en todo caso. Los metadatos de WhatsApp, extraídos con una herramienta y versión identificadas, un método validado y cadena de custodia documentada, ayudan a satisfacer esa exigencia de autenticidad, sin que ninguna clase de metadato la cumpla de forma automática. La STS 603/2025 la matizó en sentido práctico: desestimó la nulidad que la defensa pedía contra unas capturas de WhatsApp —una impugnación genérica no basta para excluirlas— sin exigir formalidades como aportar el IMEI.


Los 25+ campos de metadatos en msgstore.db (Android)

La base de datos msgstore.db de WhatsApp utiliza SQLite y su esquema cambia entre versiones: el esquema legado concentra los datos en la tabla messages, mientras que el moderno los normaliza entre message y tablas relacionadas (message_media, message_location, chat, jid). Antes de cualquier consulta hay que inventariar sqlite_master y la versión de la app. Los campos siguientes son los relevantes para el análisis forense, con el nombre que reciben en uno u otro esquema:

Tabla de campos principales

CampoDescripción forenseEjemplo
_idIdentificador único del mensaje (autoincremental)48372
key_remote_jidNúmero del contacto remoto (formato E.164 + @s.whatsapp.net)34624093796@s.whatsapp.net
key_from_meDirección: 0 = recibido, 1 = enviado0
key_idID único del mensaje generado por WhatsApp3EB0A4F2C1D8
statusEstado de entrega (0=enviado, 4=recibido en servidor, 5=leído, 6=reproducido). Valores altos como 13 se han observado en mensajes revocados, pero la base no documenta su semántica: se valida por versión5
timestampMarca temporal del dispositivo (milisegundos Unix)1710432156000
received_timestampMarca temporal de recepción (su origen —servidor o dispositivo— y su semántica se validan por versión; el nombre no lo prueba)1710432157234
dataContenido texto del mensaje”Nos vemos a las 5”
media_wa_typeTipo de medio: 0=texto, 1=imagen, 2=audio, 3=video, 4=contacto, 5=ubicación, 9=documento, 13=sticker1
media_sizeTamaño del archivo adjunto en bytes234567
media_mime_typeTipo MIME del archivoimage/jpeg
media_hashHash SHA-256 del archivo multimedia (base64)aGVsbG8gd29ybGQ=
media_durationDuración en segundos (audio/video)45
media_urlURL de descarga del servidor WhatsApp (temporal, expira en ~30 días)https://mmg.whatsapp.net/
media_captionTexto que acompaña al archivo adjunto”Mira esta foto”
latitudeLatitud de un mensaje de ubicación compartida (la localización de toma de una foto exige analizar su EXIF por separado)37.7749
longitudeLongitud de un mensaje de ubicación compartida-3.7896
forwardedIndicador de reenvío del mensaje recibido (no cuenta el número total de saltos ni acredita autoría)0
starredMensaje marcado como favorito0
quoted_row_idID del mensaje citado (si es respuesta)48370
mentioned_jidsContactos mencionados en el mensaje34612345678@s.whatsapp.net
edit_versionMarca de edición (en el esquema moderno la edición se registra en message_edit_info: referencias e instantes, no el texto anterior)0
original_timestampInstante original si el mensaje fue editado (no conserva el contenido previo)null
ephemeral_durationDuración de mensaje temporal (segundos)86400
thumb_imageMiniatura del archivo multimedia (blob)[BLOB]
read_device_timestampTimestamp de lectura en dispositivo1710432200000
receipt_server_timestampTimestamp de confirmación del servidor1710432157500
message_typeTipo de mensaje del protocolo (0=texto, 2=imagen, 7=sistema; se han observado 15 y 64, sin tabla que documente su semántica)0
chat_row_idID de la conversación a la que pertenece el mensaje127

Tabla de contactos (wa_contacts)

CampoDescripción
jidIdentificador único del contacto (formato E.164@s.whatsapp.net)
display_nameNombre mostrado en la agenda del dispositivo
numberNúmero de teléfono en formato local
statusEstado/bio del contacto (texto “Acerca de”)
status_timestampCuando cambió el estado por última vez (milisegundos Unix)
wa_nameNombre puesto por el propio contacto en WhatsApp
sort_nameNombre usado para ordenar la lista de contactos

Tabla de grupos (group_participants)

CampoDescripción
gjidID del grupo (formato numérico@g.us)
jidID del participante individual
adminRol: 0=miembro, 1=admin, 2=superadmin (creador)
pendingInvitación pendiente (0=miembro activo, 1=pendiente)
sent_sender_keyFlag de distribución de clave de cifrado

Tabla de llamadas (call_log)

CampoDescripción
jidContacto de la llamada
from_me0=recibida, 1=realizada
timestampCuando se inició la llamada
durationDuración en segundos
video_call0=voz, 1=videollamada
call_result0=contestada, 1=pérdida, 2=rechazada

iOS: ChatStorage.sqlite y sus diferencias con msgstore.db

En dispositivos iOS, WhatsApp almacena los mensajes en una base de datos diferente: ChatStorage.sqlite. Aunque la estructura es distinta, contiene información equivalente. Como perito, es fundamental conocer ambas bases de datos ya que en muchos procedimientos se analizan dispositivos de ambas plataformas.

Mapeo de campos Android (msgstore.db) vs iOS (ChatStorage.sqlite)

ConceptoAndroid (msgstore.db)iOS (ChatStorage.sqlite)Tabla iOS
Mensajemessages._idZWAMESSAGE.Z_PKZWAMESSAGE
Remitentekey_remote_jidZWAMESSAGE.ZFROMJIDZWAMESSAGE
Direcciónkey_from_meZWAMESSAGE.ZISFROMMEZWAMESSAGE
TimestamptimestampZWAMESSAGE.ZMESSAGEDATE (referencia Apple: 01/01/2001)ZWAMESSAGE
EstadostatusZWAMESSAGE.ZMESSAGESTATUSZWAMESSAGE
ContenidodataZWAMESSAGE.ZTEXTZWAMESSAGE
Tipo mediomedia_wa_typeZWAMESSAGE.ZMESSAGETYPEZWAMESSAGE
Ruta del mediomedia_hash/rutaZWAMEDIAITEM.ZMEDIALOCALPATH (ruta local del medio, no un hash)ZWAMEDIAITEM
Reenvioforwardedrecuento de reenvío observado en el protobuf ZMETADATA (campo 17), según parser y versiónZWAMESSAGE
Grupokey_remote_jid (terminado en @g.us)ZWAMESSAGE.ZTOJIDZWAMESSAGE
Contactowa_contacts.jidZWACONTACT.ZJIDZWACONTACT
Llamadacall_logZWACALLEVENTZWACALLEVENT

Diferencia crítica de timestamps: Android usa milisegundos Unix (referencia 1 enero 1970), mientras que iOS usa el “Core Data timestamp” de Apple (referencia 1 enero 2001). Para convertir un timestamp iOS a formato legible hay que sumar 978307200 segundos al valor almacenado. Este es un error frecuente en peritajes que he visto corregir en ratificaciones judiciales.


Dónde se almacenan los metadatos: rutas completas

Rutas en Android

ArchivoRutaAcceso requerido
msgstore.db (activa)/data/data/com.whatsapp/databases/msgstore.dbRoot o extracción física
msgstore.db (backup cifrado)/sdcard/WhatsApp/Databases/msgstore.db.crypt15Acceso al almacenamiento
wa.db (contactos)/data/data/com.whatsapp/databases/wa.dbRoot o extracción física
axolotl.db (claves cifrado E2EE)/data/data/com.whatsapp/databases/axolotl.dbRoot o extracción física
chatsettings.db (configuración chats)/data/data/com.whatsapp/databases/chatsettings.dbRoot o extracción física
Medios recibidos/sdcard/WhatsApp/Media/Acceso al almacenamiento
Logs internos/data/data/com.whatsapp/files/Logs/Root o extracción física
Preferencias compartidas/data/data/com.whatsapp/shared_prefs/Root o extracción física
Clave de cifrado (crypt15)/data/data/com.whatsapp/files/encrypted_backup.keyRoot o extracción física

Rutas en iOS

ArchivoRutaAcceso requerido
ChatStorage.sqliteAppDomainGroup-group.net.whatsapp.WhatsApp.shared/ChatStorage.sqliteBackup iTunes/iCloud descifrado
ContactsV2.sqliteAppDomainGroup-group.net.whatsapp.WhatsApp.shared/ContactsV2.sqliteBackup descifrado
CallHistory.sqliteAppDomainGroup-group.net.whatsapp.WhatsApp.shared/CallHistory.sqliteBackup descifrado
MediosMessage/Media/ dentro del dominio de appBackup descifrado
WallpapersLibrary/ dentro del dominio de appBackup descifrado

Diferencia crítica de acceso: En Android, la base de datos activa (msgstore.db) solo es accesible con privilegios root o mediante extracción física. Los backups en /sdcard/ están cifrados (crypt15) y requieren la clave del backup, cuya custodia depende del modo de copia. En iOS, los datos son accesibles a través de un backup completo (con su contraseña) o mediante extracción física. La copia local de Apple no está cifrada por defecto: el usuario activa «Encrypt local backup» y crea una contraseña necesaria para restaurarla.


10 escenarios donde los metadatos prueban más que el contenido

1. Acoso laboral: timeline de mensajes fuera de horario

Los metadatos timestamp y received_timestamp pueden mostrar que un superior envió mensajes a las 23:47, 00:15 y 01:32 de forma sistemática durante meses. El contenido puede ser ambiguo («necesito el informe»), pero el patrón temporal —muchos registros en franja nocturna— es el elemento que un tribunal valora como indicio de acoso, por encima de un mensaje aislado.

2. Ciberbullying: frecuencia y volumen de mensajes

El campo _id autoincremental y los timestamp permiten reconstruir cuándo se envió cada mensaje sin entrar en su contenido: volumen diario, franjas horarias, persistencia a lo largo de semanas y reanudación tras cada bloqueo.

Pero el volumen por sí solo no es la prueba, y conviene no prometerlo. El Pleno de la Sala Segunda, en la STS 324/2017, exige que la conducta «altere gravemente el desarrollo de la vida cotidiana» de la víctima —«cambiar de teléfono, o modificar rutas, rutinas o lugares de ocio»— y que exista «la voluntad de imponer un patrón de conducta sistemático de acoso con vocación de cierta perpetuación temporal»: «no exige planificación, pero sí una metódica secuencia de acciones».

Ahí es donde los metadatos ganan valor sobre el recuento: lo que acreditan es el patrón —la regularidad, la insistencia tras la negativa, la escalada— que es justo el elemento que el tipo penal reclama y que un pantallazo aislado no puede mostrar.

3. Difamación: prueba de reenvío masivo

El campo forwarded indica que un mensaje fue reenviado y no escrito por quien lo tenía en su teléfono; la marca «reenviado muchas veces» señala una cadena de reenvío larga. No acredita, por sí sola, quién creó el contenido, el número total de saltos ni la audiencia. Es un indicio del carácter no original del mensaje, útil junto al resto de la prueba en casos de difamación (arts. 205-207 CP).

4. Estafa: timestamp del servidor vs timestamp del dispositivo

En fraudes donde el estafador alega “nunca envié ese mensaje”, contrastar las distintas marcas temporales del registro (envío y recepción) puede apoyar que el mensaje transitó por la infraestructura de WhatsApp. La procedencia y la fuerza probatoria de cada marca se validan para la versión analizada: el nombre de la columna no prueba por sí solo su origen ni su inmutabilidad.

5. Violencia de género: patrón de control

Los metadatos de mensajes enviados (key_from_me = 1) frente a recibidos (key_from_me = 0) pueden revelar una fuerte asimetría en el volumen. La Ley Orgánica 1/2004 incluye la violencia psicológica; un patrón de control ejercido por medios digitales puede aportar evidencia para su valoración, aunque el art. 1 no enumera literalmente el «control digital».

6. Propiedad intelectual: hash del archivo original

El campo media_hash vincula un archivo con un mensaje. Si la parte demandante envió un documento con hash X el 15 de enero y el demandado registró ese mismo hash el 20 de enero, la coincidencia apoya que ambos manejaron los mismos bytes —dentro de una adquisición y cadena de custodia documentadas—, no por sí sola la fecha ni la autoría. Según el NIST, SHA-256 ofrece 128 bits de resistencia a colisiones y 256 a preimagen: una coincidencia de hash apoya la igualdad de bytes, no la cronología o la autoría.

7. Despido improcedente: mensaje eliminado

Los mensajes revocados se localizan mediante las tablas presentes en la versión examinada (por ejemplo message_revoked); un valor de status o message_type no prueba por sí solo la modalidad de borrado. Los metadatos del mensaje eliminado suelen persistir (remitente, timestamp, tipo de medio) aunque el contenido se borre. Recuperar el contenido desde el WAL es una posibilidad condicionada a que sobrevivan las páginas relevantes, no un resultado seguro.

8. Divorcios: ubicación GPS en fotos compartidas

Los campos latitude y longitude corresponden a los mensajes de ubicación compartida. La ubicación donde se tomó una fotografía es cosa distinta: solo puede valorarse si el archivo conserva sus metadatos EXIF, que se analizan por separado. En procedimientos de divorcio, una y otra pueden ser relevantes, pero no deben confundirse.

9. Amenazas: edición de mensajes

Desde 2023, WhatsApp permite editar mensajes enviados (dentro de una ventana de 15 minutos). En el esquema moderno la edición se registra en message_edit_info, que conserva referencias e instantes pero no el texto anterior. Que un mensaje fue editado sí queda registrado; recuperar la versión previa depende de que sus páginas sobrevivan en el WAL, y no siempre es posible.

10. Mensajes temporales: evidencia de ocultación

El campo ephemeral_duration indica que el remitente configuró mensajes temporales (24 h, 7 días, 90 días). Activarlos tras una citación podría valorarse como conducta obstructiva, pero el art. 264 CP (daños informáticos) exige elementos propios —borrado no autorizado, grave y con resultado grave— que una función nativa no completa por sí sola; su encaje penal depende del caso.


Extracción forense de metadatos: proceso paso a paso

  1. Adquisición del dispositivo con acta de cadena de custodia (ISO 27037). Documentar modelo, IMEI, estado de pantalla, nivel de batería, versión de WhatsApp instalada y si está activado el modo avión.

  2. Extracción física mediante Cellebrite UFED o GrayKey. Genera imagen bit a bit del almacenamiento completo. Calcular hash SHA-256 de la imagen inmediatamente después de la adquisición.

  3. Localización de la base de datos en la imagen forense. En Android: /data/data/com.whatsapp/databases/msgstore.db. En iOS: ChatStorage.sqlite dentro del dominio de grupo de la app.

  4. Descifrado si es necesario. Los backups crypt15 de Android se descifran con la clave del backup (encrypted_backup.key, o una representación de 64 caracteres). Su disponibilidad depende del modo de copia: en la copia cifrada de extremo a extremo con contraseña, WhatsApp declara conocer la existencia de la clave, no la clave misma. La herramienta open source wa-crypt-tools de ElDavoo permite el descifrado con la clave extraída.

  5. Copia de trabajo: Nunca analizar la base de datos original. Crear una copia forense y trabajar sobre ella. Documentar el hash SHA-256 de la copia.

  6. Consultas SQL sobre la base de datos extraída para recuperar los metadatos relevantes al caso. Documentar cada consulta ejecutada.

  7. Correlación cruzada: Si se dispone de ambos dispositivos (emisor y receptor), comparar los received_timestamp del servidor para verificar autenticidad cruzada.

  8. Documentación de cada consulta ejecutada, resultados obtenidos y hashes de verificación en el informe pericial. Incluir capturas de pantalla del entorno SQLite y de los resultados.


Consultas SQL forenses esenciales: 8 queries para el perito

Las 8 consultas siguientes están escritas para el esquema legado (messages, con campos como data, forwarded, latitude). En una base moderna hay que reescribirlas tras inspeccionar las tablas, usando las relaciones messagechatjidmessage_mediamessage_location: varias, tal cual, fallarían o atribuirían semánticas inexistentes. Cada query responde a una pregunta jurídica específica.

Query 1: Mensajes entre dos números en un rango de fechas

SELECT _id, key_remote_jid, key_from_me, status,
       datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha_envio,
       datetime(received_timestamp/1000, 'unixepoch', 'localtime') as fecha_servidor,
       data, media_wa_type, media_hash, forwarded, edit_version
FROM messages
WHERE key_remote_jid = '34612345678@s.whatsapp.net'
  AND timestamp BETWEEN 1704067200000 AND 1706745600000
ORDER BY timestamp ASC;

Uso judicial: Acreditar comunicación entre partes en un período concreto. La doble marca temporal (dispositivo y servidor) demuestra autenticidad.

Query 2: Mensajes eliminados (recuperables via metadatos)

SELECT _id, key_remote_jid, key_from_me,
       datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha,
       media_wa_type, status, message_type
FROM messages
WHERE status = 13 OR message_type = 15
ORDER BY timestamp DESC;

Uso judicial: Demostrar que existieron mensajes que el investigado intentó ocultar. El status 13 y message_type 15 capturan tanto mensajes eliminados “para mí” como “para todos”.

Query 3: Mensajes reenviados (difusión masiva)

SELECT _id, key_remote_jid,
       datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha,
       data, forwarded
FROM messages
WHERE forwarded > 0
ORDER BY forwarded DESC;

Uso judicial: Casos de difamación o distribución no autorizada de contenido. El campo forwarded cuantifica la cadena de reenvío.

Query 4: Archivos adjuntos con hash y geolocalización

SELECT _id, key_remote_jid, key_from_me,
       datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha,
       media_mime_type, media_size, media_hash, media_duration,
       latitude, longitude, media_caption
FROM messages
WHERE media_wa_type > 0
ORDER BY timestamp DESC;

Uso judicial: Vinculación criptográfica de archivos con mensajes concretos. Las coordenadas GPS son relevantes en casos de custodia, violencia de género y propiedad intelectual.

Query 5: Patrón temporal de mensajes (acoso, control)

SELECT
  strftime('%H', datetime(timestamp/1000, 'unixepoch', 'localtime')) as hora,
  COUNT(*) as total_mensajes,
  SUM(CASE WHEN key_from_me = 1 THEN 1 ELSE 0 END) as enviados,
  SUM(CASE WHEN key_from_me = 0 THEN 1 ELSE 0 END) as recibidos
FROM messages
WHERE key_remote_jid = '34612345678@s.whatsapp.net'
GROUP BY hora
ORDER BY hora;

Uso judicial: Demuestra patrón de comportamiento por franja horaria. Fundamental en casos de acoso laboral fuera de horario y violencia de género con control digital.

Query 6: Mensajes editados (posible manipulación)

SELECT _id, key_remote_jid, key_from_me,
       datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha_original,
       datetime(original_timestamp/1000, 'unixepoch', 'localtime') as fecha_edicion,
       data, edit_version
FROM messages
WHERE edit_version > 0
ORDER BY timestamp DESC;

Uso judicial: Detecta mensajes que fueron modificados después de su envío. Si el contenido fue editado tras una denuncia o citación, evidencia posible manipulación de pruebas.

Query 7: Participantes de grupo y sus roles

SELECT gp.gjid as grupo, gp.jid as participante, gp.admin,
       wc.display_name, wc.wa_name,
       CASE gp.admin
         WHEN 0 THEN 'Miembro'
         WHEN 1 THEN 'Admin'
         WHEN 2 THEN 'Superadmin (creador)'
       END as rol
FROM group_participants gp
LEFT JOIN wa_contacts wc ON gp.jid = wc.jid
WHERE gp.gjid = '120363012345@g.us'
ORDER BY gp.admin DESC;

Uso judicial: Identifica todos los participantes de un grupo, sus roles y quienes tenían capacidad de administrar (borrar mensajes ajenos, expulsar miembros).

Query 8: Historial de llamadas con duración

SELECT cl.jid,
       wc.display_name,
       datetime(cl.timestamp/1000, 'unixepoch', 'localtime') as fecha,
       cl.duration as duracion_segundos,
       CASE cl.from_me WHEN 1 THEN 'Realizada' ELSE 'Recibida' END as dirección,
       CASE cl.video_call WHEN 1 THEN 'Video' ELSE 'Voz' END as tipo,
       CASE cl.call_result WHEN 0 THEN 'Contestada' WHEN 1 THEN 'Pérdida' WHEN 2 THEN 'Rechazada' END as resultado
FROM call_log cl
LEFT JOIN wa_contacts wc ON cl.jid = wc.jid
ORDER BY cl.timestamp DESC
LIMIT 100;

Uso judicial: Acredita llamadas realizadas o recibidas. En casos de acoso, las llamadas perdidas reiteradas a horas intempestivas son evidencia complementaria.


Consultas SQL equivalentes para iOS (ChatStorage.sqlite)

Para dispositivos iOS, las queries deben adaptarse a la estructura de ChatStorage.sqlite:

Mensajes entre dos contactos (iOS)

SELECT ZWAMESSAGE.Z_PK,
       ZWAMESSAGE.ZFROMJID,
       ZWAMESSAGE.ZISFROMME,
       ZWAMESSAGE.ZMESSAGESTATUS,
       datetime(ZWAMESSAGE.ZMESSAGEDATE + 978307200, 'unixepoch', 'localtime') as fecha,
       ZWAMESSAGE.ZTEXT,
       ZWAMESSAGE.ZMESSAGETYPE
FROM ZWAMESSAGE
WHERE ZWAMESSAGE.ZFROMJID LIKE '%34612345678%'
   OR ZWAMESSAGE.ZTOJID LIKE '%34612345678%'
ORDER BY ZWAMESSAGE.ZMESSAGEDATE ASC;

Medios adjuntos con ubicación (iOS)

SELECT ZWAMESSAGE.Z_PK,
       datetime(ZWAMESSAGE.ZMESSAGEDATE + 978307200, 'unixepoch', 'localtime') as fecha,
       ZWAMEDIAITEM.ZMEDIALOCALPATH,
       ZWAMEDIAITEM.ZFILESIZE,
       ZWAMEDIAITEM.ZLATITUDE,
       ZWAMEDIAITEM.ZLONGITUDE,
       ZWAMEDIAITEM.ZTITLE
FROM ZWAMESSAGE
JOIN ZWAMEDIAITEM ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE
WHERE ZWAMEDIAITEM.ZLATITUDE != 0
ORDER BY ZWAMESSAGE.ZMESSAGEDATE DESC;

Nota importante: En iOS, el timestamp se almacena como “Apple Epoch” (referencia 1 enero 2001). Sumar 978307200 segundos convierte al Unix Epoch estándar. He visto informes periciales con timestamps erróneos por no aplicar esta conversión, lo que invalida la prueba temporal.


Cifrado extremo a extremo vs metadatos locales

Una confusión frecuente: el cifrado extremo a extremo (E2EE) de WhatsApp, basado en el protocolo Signal (Double Ratchet + Curve25519 + AES-256 + HMAC-SHA256), protege el contenido de los mensajes en tránsito. Ni WhatsApp ni Meta pueden leer los mensajes mientras viajan entre dispositivos. Sin embargo, los metadatos locales almacenados en msgstore.db dentro del dispositivo no están protegidos por E2EE.

AspectoContenido del mensajeMetadatos localesMetadatos del servidor (Meta)
Protección E2EESí (en tránsito)No aplica (almacenamiento local)No aplica
AlmacenamientoEn msgstore.db (texto plano local)En msgstore.db (texto plano local)Servidores Meta (retención no publicada; ver abajo)
Acceso con extracción físicaSiSiNo (requiere comisión rogatoria)
Acceso remoto por MetaNo (E2EE impide)NoSí (IPs, timestamps, contactos)
Modificable por usuarioNo directamente en BDNo directamente en BDNo
Valor probatorioAlto (con extracción forense)Muy alto (generado por sistema)Alto (requiere cooperación judicial)

Datos que Meta puede entregar a las autoridades según su guía oficial, «si están disponibles» y según el tipo de requerimiento (la guía distingue datos básicos de cuenta, información de grupos y agenda «si está disponible», y advierte que no almacena los mensajes una vez entregados):

  • Datos de registro de la cuenta (número, fecha de creación, última conexión)
  • Información del dispositivo y de conexión, cuando conste
  • Información de grupos y agenda del usuario, si está disponible
  • Datos de facturación (si aplica, WhatsApp Business)

La guía contempla además solicitudes de preservación (hasta 90 días, prorrogables) y la retención limitada de mensajes no entregados (hasta 30 días). No publica una retención ordinaria fija de «30–90 días» para todo el conjunto.

Lo que Meta NO puede entregar: Contenido de los mensajes (protegido por E2EE). Por eso la extracción forense del dispositivo es insustituible.


Herramientas de extracción y análisis

HerramientaTipoCapacidad metadatosCoste
Cellebrite UFEDExtracción física + lógicaCompleta (25+ campos, WAL recovery, timeline)Licencia comercial (bajo presupuesto)
Magnet AXIOMAnálisis forenseParsing automático msgstore.db + ChatStorage.sqlite + timeline integradaLicencia comercial (bajo presupuesto)
Oxygen Forensics DetectiveExtracción + análisisDescifrado crypt15, cloud extraction (Google Drive, iCloud)Licencia comercial (bajo presupuesto)
MSAB XRYExtracción + análisisSoporte WhatsApp Android + iOS + backups cloudLicencia comercial (bajo presupuesto)
Belkasoft Evidence CenterAnálisis forenseParsing WhatsApp + 400 artefactos + SQLite ViewerLicencia comercial (bajo presupuesto)
AutopsyAnálisis open sourcePlugin WhatsApp básico, modular con plugins de tercerosGratuito
DB Browser for SQLiteVisor base de datosConsultas manuales SQL, exportación CSVGratuito
wa-crypt-toolsDescifradoDescifrado crypt14/crypt15 con clave extraídaGratuito (GitHub, ElDavoo)
whapaAnálisis WhatsAppParser especializado msgstore.db, generación de reportes HTMLGratuito (GitHub, B16f00t)

Escenario ilustrativo 1: metadatos como prueba principal en un despido

Escenario ilustrativo. Este ejemplo es una composición didáctica de patrones habituales, no un expediente concreto: los datos, las cifras y el desenlace son ficticios y no describen una resolución judicial identificable.

Situación: Un empleado es despedido por “bajo rendimiento”. El trabajador alega que el verdadero motivo es haber rechazado peticiones del jefe fuera de horario laboral. Las capturas de pantalla que presenta son impugnadas como “manipulables”.

Análisis forense de metadatos:

Del msgstore.db del dispositivo del trabajador, los metadatos podrían revelar:

MetadatoHallazgoSignificado
timestampNumerosos mensajes del jefe entre las 22:00 y las 02:00Patrón sistemático fuera de horario
key_from_meRatio 15:1 (jefe:empleado)Comunicación unidireccional, control
status95% con status=5 (leido) en menos de 3 minPresión para respuesta inmediata
read_device_timestampLecturas a las 23:00-01:00Empleado forzado a estar disponible
received_timestampCoincide con servidor WhatsAppAutenticidad verificada
edit_version12 mensajes editados por el jefeIntento de sanitizar contenido
ephemeral_durationActivado 2 días después del despidoPosible destrucción de pruebas

Qué aportarían los metadatos: un patrón temporal sistemático fuera de horario, la asimetría de la comunicación y las marcas de edición y de mensajes temporales, que un tribunal valoraría junto con el resto de la prueba. El desenlace depende de cada procedimiento; este escenario no atribuye ninguna resolución concreta.


Escenario ilustrativo 2: estafa romántica con WhatsApp Business

Escenario ilustrativo. Composición didáctica de patrones habituales; datos, cifras y desenlace ficticios, sin corresponder a un expediente identificable.

Situación: Una víctima de estafa romántica transfirió 28.000 EUR a un estafador que operaba a través de WhatsApp Business simulando ser un inversor financiero. El estafador negó toda comunicación y alegó que la víctima inventó la relación.

Análisis forense de metadatos:

Del msgstore.db y de la tabla business_catalog del dispositivo de la víctima, los metadatos podrían mostrar:

MetadatoHallazgoSignificado
key_remote_jidNúmero vinculado a WhatsApp Business con nombre comercial falsoSuplantación de entidad financiera
timestamp (3 meses)Miles de mensajes intercambiados, con una cadencia diaria altaRelación prolongada y sistemática
media_hash12 documentos PDF compartidos (supuestos contratos)Documentos falsos con hashes verificables
media_wa_type = 5 (ubicación)3 ubicaciones compartidas por estafador: todas falsasGeolocalización fabricada
auto_reply (Business)Respuestas automáticas fuera de horario configuradasOperación profesional, no casual
label_id (Business)Víctima etiquetada como “cliente premium”Sistema de clasificación de víctimas

Query ejecutada para reconstruir el timeline de transferencias:

SELECT datetime(timestamp/1000, 'unixepoch', 'localtime') as fecha,
       data, media_wa_type
FROM messages
WHERE key_remote_jid = '44XXXXXXXXX@s.whatsapp.net'
  AND (data LIKE '%transferencia%'
    OR data LIKE '%bizum%'
    OR data LIKE '%IBAN%'
    OR data LIKE '%enviar dinero%')
ORDER BY timestamp ASC;

Qué aportarían los metadatos: una cronología documentada de la relación y de los envíos, útil como base de una denuncia. Una eventual reclamación bancaria por fallos en los controles antifraude debe fundarse en la norma y el supuesto concretos aplicables; este escenario no atribuye un importe recuperado ni una resolución.


Escenario ilustrativo 3: grupo de WhatsApp y difamación empresarial

Escenario ilustrativo. Composición didáctica de patrones habituales; datos, cifras y desenlace ficticios, sin corresponder a un expediente identificable.

Situación: Un exempleado creó un grupo de WhatsApp con 87 personas (clientes de la empresa) y difundió información falsa sobre la calidad de los productos, causando la baja de 23 clientes y pérdidas estimadas de 180.000 EUR.

Análisis forense de metadatos:

MetadatoHallazgoSignificado
group_participants87 JIDs, 23 coinciden con base de datos de clientesDifusión dirigida a cartera de clientes
admin = 2 (superadmin)JID del exempleado es el creador del grupoAutoría confirmada
forwarded = 0 en los mensajesNo marcados como reenviadosIndicio de que no proceden de una cadena de reenvío (no prueba, por sí solo, la autoría)
media_hash de documentos adjuntosHashes coinciden con documentos internos de la empresaFiltración de información confidencial
timestamp de creación del grupo48 horas después del despidoMotivación retaliativa

Qué aportarían los metadatos: la identificación del creador del grupo, la composición de la audiencia y la coincidencia de los documentos difundidos con material interno, elementos que encajarían en la competencia desleal por denigración (art. 9 LCD) y la revelación de secretos (art. 13 LCD). La calificación y el desenlace dependen del procedimiento; este escenario no atribuye una condena ni un importe.


Ley de Enjuiciamiento Civil (LEC)

  • Art. 299.2 LEC: Los medios de reproducción de la palabra, sonido e imagen y los instrumentos que permiten archivar y conocer datos son medios de prueba admisibles.
  • Art. 382 LEC: reproducción de la palabra, el sonido y la imagen.
  • Art. 384 LEC: instrumentos que permiten archivar, conocer o reproducir palabras, datos, cifras y operaciones. Los metadatos de msgstore.db encajan en esta categoría, valorada según las reglas de la sana crítica.

Ley de Enjuiciamiento Criminal (LECrim)

  • Art. 588 sexies a): Regula el registro de dispositivos informáticos. La extracción de metadatos de un dispositivo ajeno requiere autorización judicial.
  • Art. 588 bis a): principios de especialidad, idoneidad, excepcionalidad, necesidad y proporcionalidad de las medidas de investigación tecnológica.
  • Art. 588 sexies c): la resolución que autoriza el registro de un dispositivo fija sus términos y su alcance.

Jurisprudencia relevante

  • STS 300/2015 (Sala 2.ª, ponente Marchena, ROJ STS 2047/2015, texto íntegro): sentencia fundacional, y conviene citarla por lo que dice. El caso resolvía sobre Tuenti, con doctrina formulada para «cualquiera de los múltiples sistemas de mensajería instantánea», y la pericial no es un requisito general: la impugnación de la autenticidad «desplaza la carga de la prueba hacia quien pretende aprovechar su idoneidad probatoria», y «será indispensable en tal caso la práctica de una prueba pericial». En el propio pleito no llegó a practicarse ninguna: bastó que la víctima pusiera su contraseña a disposición del juez y que el interlocutor declarara en el plenario.

  • STS 629/2025 (Sala de lo Penal), de 3 de julio (ROJ STS 3341/2025): confirma la línea de la STS 300/2015 —no la relaja—: la pericial se vuelve necesaria cuando la autenticidad se impugna con indicios concretos. Los metadatos forenses ayudan a acreditar esa autenticidad, sin cumplir el estándar de forma automática.

  • STS 603/2025 (Sala 2.ª, 1 de julio, ROJ STS 3292/2025, texto íntegro): desestimó la nulidad que la defensa pedía contra unas capturas de WhatsApp —«no procede la nulidad interesada»— y precisó que no hay norma que obligue a aportar el IMEI, ni a transcribir en presencia de las partes, ni a leer los mensajes en sala si ya constan transcritos. La integridad de la transcripción la garantiza el letrado de la Administración de Justicia. (El epígrafe «Nulidad capturas de pantalla» de su ficha nombra el motivo alegado, no el fallo.)

  • STC 115/2013: el Pleno denegó el amparo ante el acceso policial a la agenda de contactos de un móvil sin autorización judicial. No sostiene que todo registro de un terminal la requiera: el acceso al contenido de las comunicaciones sí, por los arts. 588 ter y 588 sexies LECrim.

Código Penal

  • Art. 197 CP: acceder a datos ajenos sin autorización y con la finalidad de descubrir secretos o vulnerar la intimidad puede constituir descubrimiento y revelación de secretos; no basta el mero acceso técnico sin ese elemento.
  • Art. 264 CP: el borrado o la alteración de datos ajenos, sin autorización, de forma grave y con resultado grave, puede constituir daños informáticos; una función nativa como los mensajes temporales no lo completa por sí sola.
  • Art. 270 CP: la distribución no autorizada de obra protegida con ánimo de beneficio económico y en perjuicio de tercero puede ser delito contra la propiedad intelectual; el hallazgo de un hash no acredita, por sí solo, esos elementos.

Preguntas relacionadas

1. ¿Los metadatos de WhatsApp pueden falsificarse?

SQLite no aporta una autenticación criptográfica del origen de la base: su integrity_check valida el formato y la coherencia estructural, pero una modificación lógica válida puede reescribir una base coherente. Aun así, falsificar metadatos de WhatsApp sin dejar rastro es difícil, porque exigiría hacer coherentes a la vez varias tablas interrelacionadas, el WAL, el journal, las secuencias de rowid y las marcas del sistema de archivos. La valoración de una posible manipulación no se apoya en un único «sello», sino en una adquisición reproducible, los hashes de los artefactos, la coherencia entre tablas y la corroboración externa, indicando siempre sus límites.

2. ¿WhatsApp Business tiene metadatos diferentes?

Sí. WhatsApp Business almacena metadatos adicionales en tablas específicas: etiquetas de cliente (labels, con campos label_id y color_id), mensajes automáticos (auto_reply, con horarios y textos configurados), catálogo de productos (business_catalog, con nombre, descripción, precio e imagen de cada producto) y estadísticas de mensajería empresarial. La base de datos sigue siendo msgstore.db pero con tablas adicionales como business_catalog, labels y quick_replies. Estos metadatos adicionales son especialmente relevantes en disputas comerciales, reclamaciones de consumidores (Ley General de Defensa de Consumidores) y casos de estafa donde el estafador opera bajo apariencia de negocio legítimo.

3. ¿Se pueden obtener metadatos de WhatsApp sin acceso físico al teléfono?

Parcialmente, pero con limitaciones significativas. Las opciones sin acceso físico son: (1) backup de Google Drive (requiere credenciales de la cuenta Google, el backup está cifrado con clave del servidor de WhatsApp), (2) backup de iCloud (requiere credenciales Apple o autorización judicial a Apple), (3) comisión rogatoria a Meta (solo entrega metadatos del servidor: IPs, timestamps, contactos, NO contenido de mensajes), (4) WhatsApp Web genera una copia parcial en el IndexedDB del navegador. Sin embargo, para un análisis forense completo admisible en juicio, la extracción del dispositivo con cadena de custodia documentada es lo que sostiene la prueba cuando se impugna — que es el supuesto en el que la STS 300/2015 sitúa la necesidad de pericial.

4. ¿Cuánto tiempo conserva WhatsApp los metadatos?

WhatsApp conserva los metadatos en el dispositivo indefinidamente mientras la aplicación esté instalada y no se borre la conversación. En el servidor, Meta no publica un periodo de retención ordinario; su guía para autoridades distingue mensajes no entregados (hasta 30 días), solicitudes de preservación (hasta 90 días) y datos de cuenta «si están disponibles». Los backups automáticos de Google Drive conservan los datos según la configuración del usuario (diario, semanal, mensual); la ayuda de WhatsApp permite restaurar la última copia correcta disponible, no un historial de copias antiguas. Si el usuario desinstala WhatsApp, los datos persisten en el almacenamiento del dispositivo hasta que se sobrescriben, lo que puede tardar semanas o meses dependiendo del uso del dispositivo.

5. ¿Los metadatos de grupos de WhatsApp son diferentes?

Los mensajes de grupo contienen metadatos adicionales críticos para el análisis forense. El campo key_remote_jid usa el formato de grupo (120363012345@g.us), remote_resource identifica al remitente específico dentro del grupo, y la tabla group_participants refleja los miembros con sus roles y, según la versión, eventos de incorporación/salida. Los mensajes de sistema (message_type = 7) documentan altas, bajas y cambios del grupo. Estos metadatos ayudan a reconstruir participantes y cambios administrativos; ahora bien, atribuir a un mensaje concreto quién lo recibió exige correlacionar la vigencia de la membresía, los destinatarios y la fecha: el listado actual no prueba por sí solo la entrega histórica a todos.

6. ¿Qué diferencia hay entre los metadatos de WhatsApp y los de Telegram?

WhatsApp almacena todos los metadatos localmente en el dispositivo (msgstore.db), lo que facilita la extracción forense con acceso físico. Telegram, en cambio, almacena la mayoría de datos en sus servidores en la nube (excepto los chats secretos, que usan cifrado E2EE y se almacenan solo en el dispositivo). WhatsApp guarda buena parte de los metadatos en el dispositivo, mientras que Telegram mantiene la mayoría en la nube (salvo los chats secretos). Cuál resulta más accesible al perito depende de la versión, el dispositivo, el tipo de adquisición y la jurisdicción; con frecuencia el acceso a los datos de servidor de una u otra exige cooperación de la empresa o comisión rogatoria. No es una regla universal que uno sea siempre «más fácil de peritar» que el otro. Para más detalle sobre Telegram, consulta mi guía de peritaje forense de Telegram.


¿Necesitas que una conversación aguante en un juicio?

Una captura se impugna en cuanto la otra parte quiere. La certificación forense preserva el mensaje con su origen, sus metadatos y su cadena de custodia documentada.

Referencias y fuentes

  1. WhatsApp. WhatsApp Encryption Overview, versión 9 (actualizado el 25 de febrero de 2026). Documentación oficial del cifrado de extremo a extremo; la URL viva reemplaza versiones anteriores. Disponible en: https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf

  2. NIST SP 800-101 Rev. 1. “Guidelines on Mobile Device Forensics”. Instituto Nacional de Estándares y Tecnología, directrices para forense móvil. DOI: 10.6028/NIST.SP.800-101r1

  3. Tribunal Supremo de España. STS 300/2015 (Sala 2.ª). La impugnación de la autenticidad desplaza la carga hacia quien aporta la prueba y hace indispensable, en ese caso, la pericial. ECLI:ES:TS:2015:2047.

  4. Tribunal Supremo de España. STS 629/2025 (Sala de lo Penal), de 3 de julio — ponente Ana María Ferrer García, recurso 10645/2024 — ROJ STS 3341/2025 · ECLI:ES:TS:2025:3341. Confirma la línea de 2015: la pericial se vuelve necesaria cuando la autenticidad se impugna con indicios concretos.

  5. STS 603/2025, de 1 de julio (Sala Segunda, ponente Eduardo de Porres Ortiz de Urbina, recurso 8127/2022) · ECLI:ES:TS:2025:3292. Localizable por su ECLI en el buscador del CENDOJ.

  6. Ley 1/2000 de Enjuiciamiento Civil. Artículos 299, 382 y 384 sobre medios de prueba. BOE núm. 7, de 8 de enero de 2000.

  7. Ley Orgánica 13/2015, de 5 de octubre, de modificación de la LECrim. Artículos 588 bis a y 588 sexies a-c sobre medidas de investigación tecnológica y registro de dispositivos. BOE núm. 239.

  8. ISO/IEC 27037:2012. “Guidelines for identification, collection, acquisition and preservation of digital evidence”. Estándar internacional para adquisición de evidencia digital.

  9. CGPJ. Memoria anual y estadística judicial — recoge actividad de los órganos judiciales (asuntos ingresados, resueltos y en trámite). No publica desglose por tipo de prueba, de modo que ninguna cifra sobre uso de prueba digital procede de esta fuente.

  10. ElDavoo. (2022). “wa-crypt-tools: WhatsApp crypt14/crypt15 decryptor”. Repositorio GitHub para descifrado de backups WhatsApp. https://github.com/ElDavoo/wa-crypt-tools


Última actualización: 5 septiembre 2026 Categoría: Análisis Forense (FOR-045) Nivel técnico: Avanzado Relevancia: Muy alta (WhatsApp aparece con frecuencia en procedimientos judiciales con prueba digital)

Preguntas Frecuentes

Que metadatos almacena WhatsApp en msgstore.db?

WhatsApp almacena decenas de campos por mensaje en su base de datos SQLite, cuyo esquema varía entre versiones (la tabla messages del esquema legado y el moderno message con tablas relacionadas). Incluyen el identificador del contacto (key_remote_jid), marcas temporales, el estado de entrega, referencias al medio adjunto, el indicador de reenvío y, en los mensajes de ubicación, coordenadas.

Son los metadatos de WhatsApp mas fiables que el contenido del mensaje?

Los metadatos se almacenan en la base de datos SQLite del dispositivo y los genera la aplicación, no el usuario, lo que los hace más difíciles de manipular sin dejar rastro que una captura. Conviene precisar: el cifrado AES (crypt15) protege la copia de seguridad, no la base activa; y el nombre de una columna temporal no prueba por sí solo su origen (servidor o dispositivo), que debe validarse en la versión analizada.

Donde se almacenan los metadatos de WhatsApp en Android?

En Android se almacenan en /data/data/com.whatsapp/databases/msgstore.db (requiere root o extracción física). Los backups cifrados están en /sdcard/WhatsApp/Databases/msgstore.db.crypt15.

Se pueden recuperar metadatos de mensajes eliminados de WhatsApp?

A veces. Registros o páginas anteriores pueden sobrevivir temporalmente en el WAL (Write-Ahead Log) o en espacio no asignado, hasta que se hace checkpoint, se recicla o se sobrescribe. Una extracción física puede recuperar metadatos de mensajes borrados, pero no hay una ventana temporal fija: la recuperabilidad depende de cada imagen y se comprueba en ella.

Que herramientas se usan para extraer metadatos de WhatsApp?

Las principales herramientas son Cellebrite UFED y Magnet AXIOM (extracción y parsing, con cobertura dependiente del dispositivo, la versión y el método), Autopsy con plugin WhatsApp, y consultas SQL directas sobre la base de datos extraída.

¿Necesitas un peritaje forense?

Si necesitas ayuda profesional con análisis forense digital, estoy aquí para ayudarte.

Solicitar Consulta Gratuita
Jonathan Izquierdo

Jonathan Izquierdo · Perito Forense

+15 años experiencia · AWS Certified

WhatsApp