TL;DR: Bank Statement Parser procesa todos los datos de forma local, redacta PII por defecto, refuerza el análisis XML contra ataques XXE, ejecuta LLMs localmente vía Ollama y se distribuye con dependencias SHA-256 bloqueadas con hash y un SBOM CycloneDX.
Seguridad por diseño
Bank Statement Parser está diseñado para procesar datos financieros sensibles. Cada decisión de diseño prioriza la seguridad, la privacidad y la auditabilidad.
Cero dependencia de la nube
Todo el procesamiento ocurre localmente dentro de su entorno de ejecución. Los analizadores deterministas no realizan llamadas de red. El pipeline híbrido para PDF usa Ollama para inferencia local de LLM — ningún dato se envía a APIs en la nube. Los analizadores XML están configurados explícitamente con no_network=True, resolve_entities=False y load_dtd=False para impedir cualquier acceso saliente.
Redacción de PII
La información de identificación personal (nombres, IBANs, direcciones postales) se redacta automáticamente en la salida CLI y en modo streaming. Esto está activado por defecto.
- CLI: Los campos sensibles se muestran como
***REDACTED*** - Streaming:
parse_streaming(redact_pii=True)(por defecto) - Exportaciones: CSV/JSON/Excel conservan todos los datos para procesamiento posterior
- Activar: Use
--show-piioredact_pii=Falsecuando necesite datos sin redactar
Seguridad XML (protección XXE)
Todo el análisis XML usa lxml con ajustes reforzados:
resolve_entities=False-- previene ataques de expansión de entidades XMLno_network=True-- bloquea todo acceso de red saliente desde el analizadorload_dtd=False-- previene ataques basados en DTD- Eliminación de namespaces antes del procesamiento — maneja cualquier variante de CAMT.053 de forma segura
Seguridad de archivos ZIP
iter_secure_xml_entries() valida cada miembro ZIP antes de la extracción:
- Límite de tamaño de entrada: 10 MB por entrada (configurable)
- Límite de tamaño total: 50 MB total sin comprimir (configurable)
- Límite de ratio de compresión: 100:1 por defecto — detecta ZIP bombs
- Rechazo de entradas cifradas: Las entradas cifradas se omiten con una advertencia
- Sin escrituras en disco: Los bytes XML pasan directamente al analizador vía
from_bytes()
Prevención de cruce de rutas
La validación de entrada bloquea rutas de archivo peligrosas:
- Bytes nulos, patrones de recorrido de directorio (
../) y enlaces simbólicos se rechazan - Validación de extensión de archivo frente a formatos esperados
- Límites de tamaño de archivo (100 MB por defecto, configurable)
Verificación de saldo (Regla de Oro)
Cada extracción de PDF se verifica con la ecuación: opening balance + credits − debits == closing balance. Los resultados se etiquetan como VERIFIED, DISCREPANCY o FAILED. Las discrepancias pueden revisarse de forma interactiva con --type review.
Salida determinista
Para formatos estructurados (CAMT, PAIN.001, CSV, OFX, QFX, MT940), dado el mismo archivo de entrada, el analizador produce una salida byte a byte idéntica en cada ejecución. Sin aleatoriedad, sin inferencia de modelo, sin muestreo heurístico. Esto es fundamental para:
- Reproducibilidad de auditoría: Ejecute el mismo archivo dos veces y compare la salida
- Cumplimiento normativo: Demostrar procesamiento coherente
- Verificación de CI: 718 pruebas imponen determinismo con cobertura de ramas del 100%
Seguridad de la cadena de suministro
- Dependencias con bloqueo hash SHA-256: Cada paquete en
poetry.locktiene hashes de archivo verificados - CycloneDX SBOM: Cada versión incluye una lista de materiales del software
- Procedencia de compilación de GitHub: La certificación vincula cada artefacto con su commit de origen
- Commits firmados: Todos los commits están firmados con SSH y verificados en CI
- Verificación de dependencias:
scripts/verify_locked_hashes.pyvalida todos los hashes localmente
Verificar localmente
python -m pytest # 718 tests, 100% branch coverage
python scripts/verify_locked_hashes.py # SHA-256 hash verification
git log --show-signature -1 # Verify commit signature