Verificar reportes.

Cada reporte del audit trail se firma con Ed25519. Cualquiera puede verificar su autenticidad e integridad de forma independiente y offline, usando solo la clave pública de Vericto — sin secretos y sin confiar en nuestros servidores.

Resumen

Cuando exportas el audit trail en CSV o JSON, Vericto genera además una firma digital desacoplada (un archivo .sig) calculada sobre el contenido exacto del reporte. Esta firma permite comprobar dos cosas:

  • Autenticidad: el reporte fue generado por Vericto y no por un tercero.
  • Integridad: el contenido no fue alterado ni un solo byte desde que se generó.

La verificación es independiente: se hace con la clave pública de Vericto y herramientas estándar (como openssl), sin necesidad de ningún secreto y sin llamar a la API de Vericto. Esto es exactamente lo que un auditor de SOC 2 o ISO 27001 espera de un control de integridad de evidencia.

Descarga tanto el archivo como su firma desde Dashboard → Reportes. Necesitas los dos para verificar: el reporte (.csv/.json) y su firma (.sig).

Por qué se firman (y por qué asimétrica)

Vericto usa Ed25519, un esquema de firma asimétrica: una clave privada (secreta, que nunca sale de nuestros servidores) firma los reportes, y una clave pública (que publicamos abiertamente) permite verificarlos.

La ventaja frente a un checksum con clave simétrica (HMAC) es la verificación por terceros: con una firma asimétrica, un auditor externo verifica el reporte usando solo la clave pública, sin que Vericto le comparta ningún secreto y sin tener que confiar en la palabra de Vericto. La verificación es matemática y reproducible por cualquiera.

Qué descargas

Desde la página Reportes del dashboard, cada reporte listo ofrece dos descargas:

ArchivoDescripción
Reporte (.csv / .json) El audit trail exportado. Queda intacto byte por byte — se abre en Excel, pandas o cualquier herramienta sin modificaciones.
Firma (.sig) Archivo de texto con la firma desacoplada. Es auto-descriptivo e incluye el esquema, el identificador de clave, el hash SHA-256 del contenido y la firma Ed25519 en base64.

Ejemplo del contenido de un archivo .sig:

scheme: ed25519-sha256
key-id: default
sha256: 9f2c1a7b0e5d4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3
signature: MEUCIQC2p...base64...t0Y=

Verificar la firma

El esquema es ed25519-sha256: la firma Ed25519 se calcula sobre el digest SHA-256 del reporte (no sobre el archivo completo, para permitir reportes de cualquier tamaño). Verificar tiene dos pasos: calcular el SHA-256 del archivo y comprobar la firma Ed25519 sobre ese digest. Necesitas el reporte, su .sig y la clave pública de Vericto (ver la sección siguiente).

Con OpenSSL

Extrae la firma, calcula el SHA-256 del reporte como bytes crudos y verifica la firma sobre ese digest:

# 1. Guarda la clave pública de Vericto en vericto-public.pem (ver sección siguiente)

# 2. Extrae la firma base64 del .sig a un archivo binario
grep '^signature:' vericto-audit-abcd1234.csv.sig \
  | sed 's/^signature: //' | base64 -d > report.sig.bin

# 3. Calcula el SHA-256 del reporte como 32 bytes crudos (el mensaje firmado)
openssl dgst -sha256 -binary vericto-audit-abcd1234.csv > report.sha256.bin

# 4. Verifica la firma Ed25519 sobre el digest
openssl pkeyutl -verify \
  -pubin -inkey vericto-public.pem \
  -rawin -in report.sha256.bin \
  -sigfile report.sig.bin

# Salida esperada:
# Signature Verified Successfully

# (Opcional) Confirma que el sha256 del .sig coincide con el del archivo:
openssl dgst -sha256 vericto-audit-abcd1234.csv

La firma cubre el digest SHA-256 del reporte, así que verificarla equivale a verificar el archivo completo: si un solo byte cambia, el SHA-256 cambia y la firma no coincide. El campo sha256: del .sig te deja además comparar el hash a simple vista.

Con Python (cryptography)

from cryptography.hazmat.primitives.serialization import load_pem_public_key
from cryptography.exceptions import InvalidSignature
import base64, re, hashlib

pub = load_pem_public_key(open('vericto-public.pem', 'rb').read())

sig_txt = open('vericto-audit-abcd1234.csv.sig').read()
sig_b64 = re.search(r'^signature:\s*(.+)$', sig_txt, re.M).group(1).strip()
signature = base64.b64decode(sig_b64)

# El mensaje firmado es el digest SHA-256 del archivo (esquema ed25519-sha256).
digest = hashlib.sha256(open('vericto-audit-abcd1234.csv', 'rb').read()).digest()

try:
    pub.verify(signature, digest)   # Ed25519: lanza excepcion si no coincide
    print('OK: firma valida - el reporte es autentico e integro')
except InvalidSignature:
    print('ERROR: firma invalida - el reporte fue alterado o no es de Vericto')

Obtener la clave pública

La clave pública de firma es información no sensible y se publica en un endpoint abierto (sin autenticación):

curl -s https://api.vericto.com/api/v1/meta/export-signing-key

Respuesta:

{
  "scheme": "ed25519",
  "key_id": "default",
  "public_key": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2Vw...\n-----END PUBLIC KEY-----\n"
}

Guarda el valor de public_key en un archivo vericto-public.pem (con los saltos de línea reales) y úsalo en los comandos de verificación.

El campo key-id del .sig indica qué clave firmó el reporte. Si Vericto rota la clave en el futuro, el endpoint seguirá exponiendo la clave activa y podrás solicitar la clave histórica correspondiente al key-id del reporte que estés verificando.

Retención: disponibles por 7 días

Los reportes generados están disponibles para descarga durante 7 días desde su creación. Pasado ese plazo, tanto el archivo como su firma se eliminan de forma permanente del almacenamiento de objetos, y el reporte aparece como Expirado en el dashboard.

Este borrado es real, no solo una etiqueta: un proceso diario elimina los objetos vencidos. Si necesitas conservar un reporte y su firma como evidencia a largo plazo, descárgalos y guárdalos en tu propio repositorio dentro de la ventana de 7 días. La firma Ed25519 seguirá siendo verificable indefinidamente, ya que la clave pública permanece publicada.

Preguntas frecuentes

¿Necesito un secreto de Vericto para verificar?

No. La verificación usa exclusivamente la clave pública, que es abierta. Nunca necesitas —ni deberías pedir— la clave privada.

¿La verificación depende de que la API de Vericto esté disponible?

No. Una vez que tienes la clave pública guardada, la verificación es totalmente offline. Solo necesitas la API para descargar la clave pública la primera vez.

Modifiqué el archivo (aunque sea un espacio) y la verificación falla. ¿Es normal?

Sí, es el comportamiento correcto. La firma cubre los bytes exactos del reporte original. Cualquier cambio —incluso reordenar columnas o reguardar el CSV desde Excel— invalida la firma. Verifica siempre sobre el archivo tal como se descargó.

¿Qué pasa si un reporte no tiene .sig?

Los reportes generados con la firma habilitada siempre incluyen .sig. Reportes muy antiguos (anteriores a la firma Ed25519) podrían no tenerla; en ese caso, vuelve a generar el export para obtener uno firmado.