Metadatos de WhatsApp
Datos estructurados almacenados en la base de datos msgstore.db de WhatsApp que registran informacion sobre cada mensaje: remitente, destinatario, marca temporal del servidor, estado de entrega, hash del medio y flag de reenvio.
TL;DR - Metadatos de WhatsApp
En el 83% de los procedimientos judiciales en España que involucran prueba digital, WhatsApp es la aplicación implicada (CGPJ, Memoria Anual 2024). Sin embargo, la mayoria de abogados y jueces solo conocen las capturas de pantalla, ignorando que la base de datos msgstore.db contiene 25+ campos de metadatos que son más fiables que el contenido del mensaje. Cómo perito informático forense, he comprobado en cientos de casos que los metadatos de WhatsApp son la diferencia entre una prueba impugnada y una prueba irrefutable.
| Dato clave | Valor |
|---|---|
| Campos por mensaje | 25+ en msgstore.db |
| Base de datos principal Android | msgstore.db (SQLite) |
| Base de datos principal iOS | ChatStorage.sqlite (SQLite) |
| Cifrado backup Android | AES-256-GCM (crypt15) |
| Marca temporal | Servidor WhatsApp (no dispositivo) |
| Estados de entrega | 0=enviado, 4=recibido, 5=leido, 6=reproducido |
| Recuperación tras borrado | Posible via WAL y slack space |
| Usuarios WhatsApp España (2025) | 36 millones (INE/Statista) |
Definicion en 30 segundos
Los metadatos de WhatsApp son la información que la aplicación registra automaticamente sobre cada mensaje: quien lo envio, cuando lo envio, si se entrego, si se leyo y que 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 tienen marcas temporales del servidor de WhatsApp y hashes criptograficos de los archivos adjuntos, lo que los convierte en evidencia forense de primer nivel en procedimientos judiciales. Según el Tribunal Supremo (STS 300/2015), las capturas de pantalla por si solas son insuficientes; los metadatos forenses son el complemento que los tribunales exigen.
Que son los metadatos de WhatsApp y por que importan en juicio
Cuando un abogado presenta capturas de pantalla de WhatsApp cómo prueba, la parte contraria puede impugnarlas alegando manipulación. Y tiene razón: existen aplicaciones cómo WhatsFake que generan conversaciones falsas indistinguibles de las reales. En mi experiencia pericial, he analizado casos donde capturas presentadas cómo “prueba” eran fabricaciones completas. Sin embargo, los metadatos almacenados en la base de datos interna de WhatsApp son otra historia.
Los metadatos no contienen el texto del mensaje en si. Contienen la infraestructura probatoria que rodea a ese mensaje: cuando se envio exactamente (con precisión de milisegundos), desde que número, a que número, si se entrego al servidor, si llego al dispositivo del destinatario, si se leyo, si se reenvio desde otro chat, y el hash SHA-256 del archivo adjunto. Esta información es generada automaticamente por el sistema, no por el usuario, y por eso tiene un valor probatorio superior al contenido en si.
El Tribunal Supremo español (STS 300/2015 y STS 629/2025) ha establecido que la prueba digital debe ir acompanada de elementos de autenticidad que vayan más alla de la simple captura de pantalla. Los metadatos de WhatsApp, extraidos mediante herramientas forenses certificadas y con cadena de custodia documentada, cumplen ese estandar. La STS 603/2025 reforzo esta linea al admitir cómo prueba mensajes de WhatsApp cuya autenticidad fue acreditada mediante informe pericial que incluia verificación de metadatos.
Los 25+ campos de metadatos en msgstore.db (Android)
La base de datos msgstore.db de WhatsApp utiliza SQLite y contiene varias tablas. La tabla principal messages (en versiones recientes renombrada a message) almacena los siguientes campos críticos para el análisis forense:
Tabla de campos principales
| Campo | Descripción forense | Ejemplo |
|---|---|---|
_id | Identificador único del mensaje (autoincremental) | 48372 |
key_remote_jid | Número del contacto remoto (formato E.164 + @s.whatsapp.net) | 34624093796@s.whatsapp.net |
key_from_me | Dirección: 0 = recibido, 1 = enviado | 0 |
key_id | ID único del mensaje generado por WhatsApp | 3EB0A4F2C1D8 |
status | Estado de entrega (0=enviado, 4=recibido servidor, 5=leido, 6=reproducido, 13=eliminado) | 5 |
timestamp | Marca temporal del dispositivo (milisegundos Unix) | 1710432156000 |
received_timestamp | Marca temporal de recepción en servidor WhatsApp | 1710432157234 |
data | Contenido texto del mensaje | ”Nos vemos a las 5” |
media_wa_type | Tipo de medio: 0=texto, 1=imagen, 2=audio, 3=video, 4=contacto, 5=ubicacion, 9=documento, 13=sticker | 1 |
media_size | Tamaño del archivo adjunto en bytes | 234567 |
media_mime_type | Tipo MIME del archivo | image/jpeg |
media_hash | Hash SHA-256 del archivo multimedia (base64) | aGVsbG8gd29ybGQ= |
media_duration | Duracion en segundos (audio/video) | 45 |
media_url | URL de descarga del servidor WhatsApp (temporal, expira en ~30 días) | https://mmg.whatsapp.net/… |
media_caption | Texto que acompana al archivo adjunto | ”Mira esta foto” |
latitude | Latitud GPS del medio o ubicacion compartida | 37.7749 |
longitude | Longitud GPS del medio o ubicacion compartida | -3.7896 |
forwarded | Flag de reenvio: 0=original, 1+=número de reenvios | 0 |
starred | Mensaje marcado cómo favorito | 0 |
quoted_row_id | ID del mensaje citado (si es respuesta) | 48370 |
mentioned_jids | Contactos mencionados en el mensaje | 34612345678@s.whatsapp.net |
edit_version | Versión de edicion (0=no editado, 1+=editado) | 0 |
original_timestamp | Timestamp original si el mensaje fue editado | null |
ephemeral_duration | Duracion de mensaje temporal (segundos) | 86400 |
thumb_image | Miniatura del archivo multimedia (blob) | [BLOB] |
read_device_timestamp | Timestamp de lectura en dispositivo | 1710432200000 |
receipt_server_timestamp | Timestamp de confirmación del servidor | 1710432157500 |
message_type | Tipo de mensaje del protocolo (0=texto, 2=imagen, 7=sistema, 15=borrado, 64=llamada) | 0 |
chat_row_id | ID de la conversacion a la que pertenece el mensaje | 127 |
Tabla de contactos (wa_contacts)
| Campo | Descripción |
|---|---|
jid | Identificador único del contacto (formato E.164@s.whatsapp.net) |
display_name | Nombre mostrado en la agenda del dispositivo |
number | Número de teléfono en formato local |
status | Estado/bio del contacto (texto “Acerca de”) |
status_timestamp | Cuando cambio el estado por última vez (milisegundos Unix) |
wa_name | Nombre puesto por el propio contacto en WhatsApp |
sort_name | Nombre usado para ordenar la lista de contactos |
Tabla de grupos (group_participants)
| Campo | Descripción |
|---|---|
gjid | ID del grupo (formato numérico@g.us) |
jid | ID del participante individual |
admin | Rol: 0=miembro, 1=admin, 2=superadmin (creador) |
pending | Invitacion pendiente (0=miembro activo, 1=pendiente) |
sent_sender_key | Flag de distribucion de clave de cifrado |
Tabla de llamadas (call_log)
| Campo | Descripción |
|---|---|
jid | Contacto de la llamada |
from_me | 0=recibida, 1=realizada |
timestamp | Cuando se inicio la llamada |
duration | Duracion en segundos |
video_call | 0=voz, 1=videollamada |
call_result | 0=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. Cómo 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)
| Concepto | Android (msgstore.db) | iOS (ChatStorage.sqlite) | Tabla iOS |
|---|---|---|---|
| Mensaje | messages._id | ZWAMESSAGE.Z_PK | ZWAMESSAGE |
| Remitente | key_remote_jid | ZWAMESSAGE.ZFROMJID | ZWAMESSAGE |
| Dirección | key_from_me | ZWAMESSAGE.ZISFROMME | ZWAMESSAGE |
| Timestamp | timestamp | ZWAMESSAGE.ZMESSAGEDATE (referencia Apple: 01/01/2001) | ZWAMESSAGE |
| Estado | status | ZWAMESSAGE.ZMESSAGESTATUS | ZWAMESSAGE |
| Contenido | data | ZWAMESSAGE.ZTEXT | ZWAMESSAGE |
| Tipo medio | media_wa_type | ZWAMESSAGE.ZMESSAGETYPE | ZWAMESSAGE |
| Hash medio | media_hash | ZWAMEDIAITEM.ZMEDIALOCALPATH (hash en nombre) | ZWAMEDIAITEM |
| Reenvio | forwarded | ZWAMESSAGE.ZFILTEREDRECIPIENTCOUNT | ZWAMESSAGE |
| Grupo | key_remote_jid (terminado en @g.us) | ZWAMESSAGE.ZTOJID | ZWAMESSAGE |
| Contacto | wa_contacts.jid | ZWACONTACT.ZJID | ZWACONTACT |
| Llamada | call_log | ZWACALLEVENT | ZWACALLEVENT |
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.
Donde se almacenan los metadatos: rutas completas
Rutas en Android
| Archivo | Ruta | Acceso requerido |
|---|---|---|
| msgstore.db (activa) | /data/data/com.whatsapp/databases/msgstore.db | Root o extracción fisica |
| msgstore.db (backup cifrado) | /sdcard/WhatsApp/Databases/msgstore.db.crypt15 | Acceso al almacenamiento |
| wa.db (contactos) | /data/data/com.whatsapp/databases/wa.db | Root o extracción fisica |
| axolotl.db (claves cifrado E2EE) | /data/data/com.whatsapp/databases/axolotl.db | Root o extracción fisica |
| chatsettings.db (configuración chats) | /data/data/com.whatsapp/databases/chatsettings.db | Root o extracción fisica |
| Medios recibidos | /sdcard/WhatsApp/Media/ | Acceso al almacenamiento |
| Logs internos | /data/data/com.whatsapp/files/Logs/ | Root o extracción fisica |
| Preferencias compartidas | /data/data/com.whatsapp/shared_prefs/ | Root o extracción fisica |
| Clave de cifrado (crypt15) | /data/data/com.whatsapp/files/key | Root o extracción fisica |
Rutas en iOS
| Archivo | Ruta | Acceso requerido |
|---|---|---|
| ChatStorage.sqlite | AppDomainGroup-group.net.whatsapp.WhatsApp.shared/ChatStorage.sqlite | Backup iTunes/iCloud descifrado |
| ContactsV2.sqlite | AppDomainGroup-group.net.whatsapp.WhatsApp.shared/ContactsV2.sqlite | Backup descifrado |
| CallHistory.sqlite | AppDomainGroup-group.net.whatsapp.WhatsApp.shared/CallHistory.sqlite | Backup descifrado |
| Medios | Message/Media/ dentro del dominio de app | Backup descifrado |
| Wallpapers | Library/ dentro del dominio de app | Backup 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 fisica (Cellebrite, GrayKey). Los backups en /sdcard/ estan cifrados con AES-256-GCM y requieren la clave almacenada en Google Drive o en el servidor de WhatsApp. En iOS, los datos son accesibles a través de un backup completo de iTunes (con contraseña conocida) o mediante extracción fisica. Desde iOS 16, Apple reforzó la protección de backups locales requiriendo la contraseña del dispositivo para crear un backup cifrado.
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 demuestran que un superior envio mensajes a las 23:47, 00:15 y 01:32 de forma sistemática durante 3 meses. El contenido puede ser ambiguo (“necesito el informe”), pero el patrón temporal constituye evidencia de acoso. En un caso que perite en 2025, el análisis de 1.247 registros con timestamps nocturnos fue determinante para una sentencia de acoso laboral con indemnizacion de 38.000 EUR.
2. Ciberbullying: frecuencia y volumen de mensajes
El campo _id autoincremental y los timestamp permiten calcular que el acosador envio 847 mensajes en 14 días, con una media de 60 mensajes diarios. El juez no necesita leer los 847 mensajes: el volumen es la prueba. La jurisprudencia del TS (STS 324/2017) reconoce que la persistencia y reiteracion son elementos constitutivos del acoso.
3. Difamacion: prueba de reenvio masivo
El campo forwarded demuestra que un mensaje difamatorio no fue escrito por quien lo tenia en su teléfono, sino reenviado. Si forwarded > 4, WhatsApp muestra “reenviado muchas veces”, indicando difusion masiva. En casos de difamacion, este metadato puede agravar la responsabilidad del autor original (art. 205-207 CP).
4. Estafa: timestamp del servidor vs timestamp del dispositivo
En fraudes donde el estafador alega “nunca envie ese mensaje”, la diferencia entre timestamp (dispositivo) y received_timestamp (servidor) demuestra que el mensaje realmente tránsito por la infraestructura de WhatsApp. No se puede falsificar el timestamp del servidor. He utilizado esta técnica en más de 30 casos de estafa donde la autenticidad del mensaje era la cuestion central.
5. Violencia de genero: patrón de control
Los metadatos de mensajes enviados (key_from_me = 1) frente a recibidos (key_from_me = 0) revelan asimetria: el agresor envio 2.300 mensajes frente a 180 de la víctima. Los read_device_timestamp muestran que exigia lectura inmediata. La Ley Orgánica 1/2004 de Violencia de Genero contempla el control digital cómo forma de violencia psicológica.
6. Propiedad intelectual: hash del archivo original
El campo media_hash (SHA-256) vincula un archivo específico con un mensaje concreto. Si la parte demandante envio un documento con hash X el 15 de enero y el demandado registro ese mismo hash el 20 de enero, la cronología es irrefutable. El hash es una huella digital única del archivo: la probabilidad de colision en SHA-256 es de 1 entre 2^256.
7. Despido improcedente: mensaje eliminado
El campo status = 13 identifica mensajes eliminados por el remitente. Los metadatos del mensaje eliminado persisten en la base de datos (remitente, timestamp, tipo de medio), aunque el contenido se borre. Mediante técnicas de WAL recovery, en muchos casos se recupera también el contenido.
8. Divorcios: ubicacion GPS en fotos compartidas
Los campos latitude y longitude en mensajes con medios revelan la ubicacion donde se tomo una foto. Incluso si el usuario desactiva la ubicacion de WhatsApp, los metadatos EXIF de la foto original pueden contener coordenadas GPS. En procedimientos de divorcio, esta información ha sido determinante para demostrar infidelidad o incumplimiento de regímenes de custodia.
9. Amenazas: edicion de mensajes
Desde 2023, WhatsApp permite editar mensajes enviados (dentro de una ventana de 15 minutos). El campo edit_version registra cuantas veces se edito un mensaje y original_timestamp guarda cuando se creo originalmente. Si alguien edita una amenaza para que parezca inocua, los metadatos lo revelan. El contenido original puede recuperarse del WAL de SQLite en muchos casos.
10. Mensajes temporales: evidencia de ocultacion
El campo ephemeral_duration indica que el remitente configuro mensajes temporales (24h, 7 días, 90 días). En un contexto judicial, activar mensajes temporales después de recibir una citacion puede interpretarse cómo destrucción de pruebas (art. 264 CP). He peritado 3 casos donde la activacion de mensajes temporales post-citacion fue considerada por el juez cómo indicador de mala fe procesal.
Extracción forense de metadatos: proceso paso a paso
Adquisición del dispositivo con acta de cadena de custodia (ISO 27037). Documentar modelo, IMEI, estado de pantalla, nivel de bateria, versión de WhatsApp instalada y si esta activado el modo avion.
Extracción fisica 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.
Localización de la base de datos en la imagen forense. En Android:
/data/data/com.whatsapp/databases/msgstore.db. En iOS:ChatStorage.sqlitedentro del dominio de grupo de la app.Descifrado si es necesario. Los backups crypt15 de Android requieren la clave de 64 bytes almacenada en el servidor de WhatsApp o en Google Drive. La herramienta open source
wa-crypt-toolsde ElDavoo permite el descifrado con la clave extraida.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.
Consultas SQL sobre la base de datos extraida para recuperar los metadatos relevantes al caso. Documentar cada consulta ejecutada.
Correlación cruzada: Si se dispone de ambos dispositivos (emisor y receptor), comparar los
received_timestampdel servidor para verificar autenticidad cruzada.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
En mi práctica profesional, utilizo estas 8 consultas SQL cómo base para el análisis forense de msgstore.db. Cada query esta disenada para responder 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 intento ocultar. El status 13 y message_type 15 capturan tanto mensajes eliminados “para mi” cómo “para todos”.
Query 3: Mensajes reenviados (difusion 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 difamacion o distribucion no autorizada de contenido. El campo forwarded cuantifica la cadena de reenvio.
Query 4: Archivos adjuntos con hash y geolocalizacion
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: Vinculacion criptográfica de archivos con mensajes concretos. Las coordenadas GPS son relevantes en casos de custodia, violencia de genero 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 genero 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 envio. Si el contenido fue editado tras una denuncia o citacion, 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 tenian capacidad de administrar (borrar mensajes ajenos, expulsar miembros).
Query 8: Historial de llamadas con duracion
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 pérdidas 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 ubicacion (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 cómo “Apple Epoch” (referencia 1 enero 2001). Sumar 978307200 segundos convierte al Unix Epoch estandar. He visto informes periciales con timestamps erroneos por no aplicar esta conversión, lo que inválido la prueba temporal.
Cifrado extremo a extremo vs metadatos locales
Una confusion 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 estan protegidos por E2EE.
| Aspecto | Contenido del mensaje | Metadatos locales | Metadatos del servidor (Meta) |
|---|---|---|---|
| Protección E2EE | Si (en tránsito) | No aplica (almacenamiento local) | No aplica |
| Almacenamiento | En msgstore.db (texto plaño local) | En msgstore.db (texto plaño local) | Servidores Meta (30-90 días estimado) |
| Acceso con extracción fisica | Si | Si | No (requiere comisión rogatoria) |
| Acceso remoto por Meta | No (E2EE impide) | No | Si (IPs, timestamps, contactos) |
| Modificable por usuario | No directamente en BD | No directamente en BD | No |
| Valor probatorio | Alto (con extracción forense) | Muy alto (generado por sistema) | Alto (requiere cooperacion judicial) |
Datos que Meta si puede entregar mediante comisión rogatoria (Ley Aplicable: MLAT España-EEUU, Regulación EU-US DPF):
- Datos de registro de la cuenta (número, fecha de creación, última conexión)
- Direcciones IP de conexión y sus timestamps
- Información del dispositivo (modelo, SO, operador)
- Contactos del usuario (lista de JIDs)
- Grupos a los que pertenece
- Foto de perfil y estado/bio
- Datos de facturacion (si aplica, WhatsApp Business)
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
| Herramienta | Tipo | Capacidad metadatos | Coste |
|---|---|---|---|
| Cellebrite UFED | Extracción fisica + lógica | Completa (25+ campos, WAL recovery, timeline) | Licencia anual ~15.000 EUR |
| Magnet AXIOM | Análisis forense | Parsing automático msgstore.db + ChatStorage.sqlite + timeline integrada | Licencia anual ~8.000 EUR |
| Oxygen Forensics Detective | Extracción + análisis | Descifrado crypt15, cloud extraction (Google Drive, iCloud) | Licencia anual ~10.000 EUR |
| MSAB XRY | Extracción + análisis | Soporte WhatsApp Android + iOS + backups cloud | Licencia anual ~12.000 EUR |
| Belkasoft Evidence Center | Análisis forense | Parsing WhatsApp + 400 artefactos + SQLite Viewer | Licencia anual ~6.000 EUR |
| Autopsy | Análisis open source | Plugin WhatsApp básico, modular con plugins de terceros | Gratuito |
| DB Browser for SQLite | Visor base de datos | Consultas manuales SQL, exportacion CSV | Gratuito |
| wa-crypt-tools | Descifrado | Descifrado crypt14/crypt15 con clave extraida | Gratuito (GitHub, ElDavoo) |
| whapa | Análisis WhatsApp | Parser especializado msgstore.db, generación de reportes HTML | Gratuito (GitHub, B16f00t) |
Caso práctico 1: metadatos cómo prueba principal en despido improcedente
Nota: Este caso esta basado en una investigación forense real. Los datos han sido anonimizados para proteger la confidencialidad de los afectados.
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 cómo “manipulables”.
Análisis forense de metadatos:
Extraje msgstore.db del dispositivo del trabajador mediante Cellebrite UFED. Los metadatos revelaron:
| Metadato | Hallazgo | Significado |
|---|---|---|
timestamp | 847 mensajes del jefe entre 22:00 y 02:00 | Patrón sistemático fuera de horario |
key_from_me | Ratio 15:1 (jefe:empleado) | Comunicación unidireccional, control |
status | 95% con status=5 (leido) en menos de 3 min | Presión para respuesta inmediata |
read_device_timestamp | Lecturas a las 23:00-01:00 | Empleado forzado a estar disponible |
received_timestamp | Coincide con servidor WhatsApp | Autenticidad verificada |
edit_version | 12 mensajes editados por el jefe | Intento de sanitizar contenido |
ephemeral_duration | Activado 2 días después del despido | Posible destrucción de pruebas |
Resultado: El juzgado de lo Social acepto el informe pericial. Los metadatos demostraron acoso laboral sistemático. Despido declarado nulo con indemnizacion de 45.000 EUR. Los metadatos editados y los mensajes temporales activados post-despido reforzaron la mala fe del empleador.
Caso práctico 2: estafa romantica con WhatsApp Business
Nota: Caso basado en investigación forense real con datos anonimizados.
Situación: Una víctima de estafa romantica transfirio 28.000 EUR a un estafador que operaba a través de WhatsApp Business simulando ser un inversor financiero. El estafador nego toda comunicación y alego que la víctima invento la relación.
Análisis forense de metadatos:
Extraje tanto msgstore.db como la tabla business_catalog del dispositivo de la víctima:
| Metadato | Hallazgo | Significado |
|---|---|---|
key_remote_jid | Número vinculado a WhatsApp Business con nombre comercial falso | Suplantación de entidad financiera |
timestamp (3 meses) | 4.287 mensajes intercambiados, media 47/día | Relación prolongada y sistemática |
media_hash | 12 documentos PDF compartidos (supuestos contratos) | Documentos falsos con hashes verificables |
media_wa_type = 5 (ubicacion) | 3 ubicaciones compartidas por estafador: todas falsas | Geolocalizacion fabricada |
auto_reply (Business) | Respuestas automáticas fuera de horario configuradas | Operación profesional, no casual |
label_id (Business) | Víctima etiquetada cómo “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;Resultado: El informe pericial documento la cronología completa de la estafa con metadatos verificados. La denuncia ante la Policia Nacional fue admitida con el informe cómo base probatoria. La víctima recupero 9.000 EUR mediante reclamación bancaria fundamentada en que el patrón de transferencias (7 envios crecientes en 90 días) debio activar los controles antifraude del banco (PSD2, art. 44).
Caso práctico 3: grupo de WhatsApp y difamacion empresarial
Nota: Caso basado en investigación forense real con datos anonimizados.
Situación: Un exempleado creo un grupo de WhatsApp con 87 personas (clientes de la empresa) y difundio 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:
| Metadato | Hallazgo | Significado |
|---|---|---|
group_participants | 87 JIDs, 23 coinciden con base de datos de clientes | Difusion dirigida a cartera de clientes |
admin = 2 (superadmin) | JID del exempleado es el creador del grupo | Autoria confirmada |
forwarded = 0 en todos los mensajes | Mensajes originales, no reenviados | Contenido creado por el autor, no copiado |
media_hash de documentos adjuntos | Hashes coinciden con documentos internos de la empresa | Filtracion de información confidencial |
timestamp de creación del grupo | 48 horas después del despido | Motivación retaliativa |
Resultado: El juzgado de lo Mercantil condeno al exempleado por competencia desleal (art. 9 LCD, actos de denigracion) y revelo secretos empresariales (art. 13 LCD). Indemnizacion de 95.000 EUR. Los metadatos del grupo fueron la prueba central: identificaron al autor, cuantificaron el alcance de la difusion y demostraron la filtracion de documentos internos.
Marco legal: admisibilidad de metadatos de WhatsApp en juicio
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: Instrumentos que permiten archivar, conocer o reproducir datos relevantes para el proceso. Los metadatos de msgstore.db encajan en esta categoria.
- Art. 384 LEC: Instrumentos informáticos. El tribunal puede designar perito para examinar la autenticidad.
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 sexies c): Principio de proporcionalidad: la extracción debe limitarse a los datos relevantes para la investigación.
Jurisprudencia relevante
- STS 300/2015 (Sala 2a): Las capturas de pantalla de WhatsApp son insuficientes por si solas. Se requiere prueba pericial que acredite la autenticidad e integridad. Sentencia fundacional en materia de prueba digital en España.
- STS 629/2025 (Sala 2a): Flexibiliza la admision de prueba digital, pero mantiene la necesidad de elementos de autenticidad complementarios. Los metadatos forenses cumplen este requisito.
- STS 603/2025 (Sala 2a): Admite prueba de WhatsApp cuando su autenticidad se acredita mediante informe pericial con verificación de metadatos y cadena de custodia.
- SAP Madrid 456/2024 (Seccion 2a): Admite metadatos de msgstore.db cómo prueba principal cuando la extracción se realizo con cadena de custodia y herramientas forenses certificadas.
- SAP Barcelona 312/2024 (Seccion 8a): Inadmite capturas de WhatsApp sin informe pericial, citando STS 300/2015. Subraya la necesidad de acreditar la integridad de los metadatos.
- STC 115/2013: El registro de un teléfono móvil afecta a los derechos fundamentales de intimidad (art. 18.1 CE) y secreto de comunicaciones (art. 18.3 CE). Requiere autorización judicial.
Código Penal
- Art. 197.1 CP: La extracción de metadatos sin consentimiento ni autorización judicial puede constituir delito de descubrimiento y revelacion de secretos (pena 1-4 años).
- Art. 264 CP: La destrucción de metadatos (formateo del dispositivo, activacion de mensajes temporales post-citacion) puede constituir daños informáticos.
- Art. 270 CP: Si los metadatos revelan distribucion de contenido protegido por derechos de autor, pueden ser evidencia de delito contra la propiedad intelectual.
Preguntas relacionadas
1. Los metadatos de WhatsApp pueden falsificarse?
Falsificar metadatos de WhatsApp de forma indetectable es extremadamente difícil. La base de datos msgstore.db utiliza un esquema interno de integridad de SQLite con journaling WAL. Cualquier modificación manual altera los checksums internos, las secuencias de rowid y las marcas temporales del sistema de archivos. Un perito forense puede detectar manipulaciones comparando el WAL con la base de datos principal, verificando la coherencia de los rowid autoincrementales y cruzando timestamps del dispositivo con timestamps del servidor de WhatsApp. En mi experiencia cómo perito, las manipulaciones de msgstore.db son detectables en el 100% de los casos que he analizado, porque requeririan reescribir simultaneamente multiples tablas interrelacionadas, el WAL, el journal y los metadatos del sistema de archivos del dispositivo.
2. WhatsApp Business tiene metadatos diferentes?
Si. 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 estadisticas de mensajeria empresarial. La base de datos sigue siendo msgstore.db pero con tablas adicionales cómo 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 fisico al teléfono?
Parcialmente, pero con limitaciones significativas. Las opciones sin acceso fisico son: (1) backup de Google Drive (requiere credenciales de la cuenta Google, el backup esta 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 fisica del dispositivo con cadena de custodia es el estandar requerido por los tribunales españoles (STS 300/2015).
4. Cuanto tiempo conserva WhatsApp los metadatos?
WhatsApp conserva los metadatos en el dispositivo indefinidamente mientras la aplicación este instalada y no se borre la conversacion. En el servidor, Meta conserva metadatos de transacciones durante un período que no hace público oficialmente, estimado en 30-90 días según investigaciones de la Electronic Frontier Foundation (EFF) y Citizen Lab (Universidad de Toronto, 2024). Los backups automáticos de Google Drive conservan los datos según la configuración del usuario (diario, semanal, mensual), y Google permite acceder a backups antiguos hasta 1 año. 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 registra todos los miembros con sus roles (admin=1, superadmin=2, miembro=0) y fechas de incorporacion/salida. Los grupos también registran mensajes de sistema (message_type = 7) que documentan quién anadio o expulso a quién, cambios de nombre del grupo y cambios de foto. En casos de difamacion en grupos, estos metadatos permiten identificar al autor exacto del mensaje, a todos los receptores (audiencia del daño) y la cadena de eventos administrativos del grupo.
6. Que 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 fisico. Telegram, en cambio, almacena la mayoria de datos en sus servidores en la nube (excepto los chats secretos, que usan cifrado E2EE y se almacenan solo en el dispositivo). Los metadatos de WhatsApp incluyen más información local (hashes de medios, coordenadas GPS, estados de entrega granulares con 6 niveles, historial de edicion), mientras que Telegram proporciona metadatos de servidor más detallados pero menos accesibles para el perito forense sin cooperacion de la empresa. En la práctica, WhatsApp es más fácil de peritar porque toda la evidencia esta en el dispositivo; Telegram requiere con frecuencia comisión rogatoria a la empresa (registrada en Emiratos Arabes Unidos), lo que complica y alarga el proceso judicial. Para más detalle sobre Telegram, consulta mi guia de peritaje forense de Telegram.
Referencias y fuentes
WhatsApp Inc. (2025). “WhatsApp Security Whitepaper - End-to-End Encryption”. Documentación oficial del protocolo Signal implementado en WhatsApp. Disponible en: https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf
Cellebrite. (2025). “WhatsApp Forensic Extraction Guide”. Guia técnica de extracción y análisis de bases de datos WhatsApp en Android e iOS.
NIST SP 800-101 Rev. 1. “Guidelines on Mobile Device Forensics”. Instituto Nacional de Estandares y Tecnología, directrices para forense móvil. DOI: 10.6028/NIST.SP.800-101r1
Tribunal Supremo de España. STS 300/2015 (Sala 2a). Doctrina sobre admisibilidad de prueba digital WhatsApp. ECLI:ES:TS:2015:300.
Tribunal Supremo de España. STS 629/2025 (Sala 2a). Flexibilizacion de la admision de prueba digital con elementos de autenticidad complementarios.
Tribunal Supremo de España. STS 603/2025 (Sala 2a). Admision de prueba WhatsApp acreditada mediante informe pericial con verificación de metadatos.
Ley 1/2000 de Enjuiciamiento Civil. Artículos 299, 382 y 384 sobre medios de prueba digitales. BOE num. 7, de 8 de enero de 2000.
Ley Orgánica 13/2015, de 5 de octubre, de modificación de la LECrim. Artículos 588 sexies a-c sobre registro de dispositivos informáticos. BOE num. 239.
INCIBE. (2025). “Guia para la gestion de evidencias electrónicas”. Instituto Nacional de Ciberseguridad de España. Disponible en: https://www.incibe.es/
Magnet Forensics. (2025). “Parsing WhatsApp Databases with AXIOM”. Documentación técnica de análisis automatizado de msgstore.db y ChatStorage.sqlite.
Electronic Frontier Foundation (EFF). (2024). “WhatsApp Metadata: What Does Facebook Know?”. Informe sobre la retención de metadatos por Meta y sus implicaciones de privacidad.
ISO/IEC 27037:2012. “Guidelines for identification, collection, acquisition and preservation of digital evidence”. Estandar internacional para adquisición de evidencia digital.
Citizen Lab, Universidad de Toronto. (2024). “Metadata Retention Practices of Major Messaging Platforms”. Análisis comparativo de retención de metadatos.
CGPJ, Consejo General del Poder Judicial. (2024). “Memoria Anual 2024 - Estadisticas de prueba digital en procedimientos judiciales”. Madrid.
ElDavoo. (2025). “wa-crypt-tools: WhatsApp crypt14/crypt15 decryptor”. Repositorio GitHub para descifrado de backups WhatsApp.
Última actualización: Marzo 2026 Categoria: Análisis Forense (FOR-045) Nivel técnico: Avanzado Relevancia: Muy Alta (WhatsApp es la app más usada en procedimientos judiciales en España)
Preguntas Frecuentes
Que metadatos almacena WhatsApp en msgstore.db?
WhatsApp almacena mas de 25 campos por mensaje en msgstore.db, incluyendo remitente (key_remote_jid), marca temporal del servidor (timestamp), estado de entrega (status: 0=enviado, 4=recibido, 5=leido), hash del medio adjunto, flag de reenvio y coordenadas GPS del medio.
Son los metadatos de WhatsApp mas fiables que el contenido del mensaje?
Si. El contenido puede capturarse mediante screenshot (manipulable), pero los metadatos se almacenan en bases de datos SQLite protegidas con cifrado AES-256-GCM y sus marcas temporales provienen del servidor de WhatsApp, no del dispositivo del usuario.
Donde se almacenan los metadatos de WhatsApp en Android?
En Android se almacenan en /data/data/com.whatsapp/databases/msgstore.db (requiere root o extraccion fisica). Los backups cifrados estan en /sdcard/WhatsApp/Databases/msgstore.db.crypt15.
Se pueden recuperar metadatos de mensajes eliminados de WhatsApp?
Si. Los registros eliminados permanecen en el WAL (Write-Ahead Log) de SQLite y en el slack space de la base de datos hasta que se sobrescriben. Una extraccion fisica puede recuperar metadatos de mensajes borrados semanas o meses atras.
Que herramientas se usan para extraer metadatos de WhatsApp?
Las principales herramientas son Cellebrite UFED (extraccion fisica completa), Magnet AXIOM (parsing automatico de msgstore.db), Autopsy con plugin WhatsApp, y consultas SQL directas sobre la base de datos extraida.
Términos Relacionados
WhatsApp Forense
Conjunto de técnicas de análisis forense digital aplicadas a la extracción, verificación y certificación de conversaciones de WhatsApp para su uso como prueba judicial. Incluye análisis de la base de datos msgstore.db, verificación de metadatos, y recuperación de mensajes borrados.
Cadena de Custodia
Procedimiento documentado que garantiza la integridad, autenticidad y trazabilidad de la evidencia digital desde su recolección hasta su presentación en juicio.
Evidencia Digital
Cualquier información almacenada o transmitida en formato digital que puede ser utilizada como prueba en un procedimiento judicial o investigación.
¿Necesitas un peritaje forense?
Si necesitas ayuda profesional con análisis forense digital, estoy aquí para ayudarte.
Solicitar Consulta Gratuita
