
keyhog v0.5.47
Escáner de secretos de código abierto en Rust
Sitio web · Documentación · Arquitectura · Motor GPU Vyre
KeyHog: escáner de secretos acelerado por GPU para código, nube y CI
KeyHog es un escáner de secretos de código abierto en Rust que encuentra y verifica claves API, tokens, contraseñas y credenciales filtradas en código fuente, historial de Git, contenedores, almacenamiento en la nube, activos de navegador, contenido de colaboración y sistemas en ejecución.
La mayoría de los escáneres de secretos se limitan a coincidencias de regex en CPU dentro de un checkout del repositorio. KeyHog combina 934 detectores específicos por servicio, decodificación para credenciales ocultas, evidencia y supresión conscientes del contexto, verificación en vivo con proveedores y ejecución de primera clase mediante CUDA, Metal y WGPU a través de Vyre. La calibración mide cada backend elegible de CPU pura en Rust, Hyperscan/SIMD y GPU. El enrutamiento automático utiliza entonces la ruta más rápida con paridad demostrada para el host y la clase de carga de trabajo exactos.
| La GPU es un backend real | Escanea la superficie de ataque real | Separa la señal del ruido | Actúa sobre el resultado |
|---|---|---|---|
| CUDA, Metal nativo y WGPU son pares medidos, no una cadena de respaldo silenciosa. | Escanea historial de Git, capas de Docker, archivos, buckets en la nube, source maps, WASM, capturas HAR, colecciones de Git alojadas y sistemas completos. | Decodifica base64, hex, URL, protobuf, multilínea y configuración estructurada antes de aplicar evidencia, supresión de ejemplos y líneas base. | Verifica credenciales elegibles con APIs de proveedores, emite SARIF o sobres estructurados y preserva la cobertura exacta y la semántica de salida. |
| cargo install --locked keyhog | |||
| keyhog scan . |
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="Escaneo de KeyHog que muestra severidad, evidencia, archivo y línea, remediación, resultados y estado de cobertura" width="900" />
</p>
## Un escáner de secretos construido alrededor de la GPU
KeyHog no entrega unas pocas expresiones regulares a un shader de cómputo genérico.
Su ruta de GPU está construida sobre [Vyre](https://github.com/santhreal/vyre), un sustrato
de cómputo GPU en Rust desarrollado junto con KeyHog. Los disparadores de detectores se compilan en
tablas inmutables residentes en la GPU. Los lotes de origen acotados producen posiciones de coincidencia
completas para el mismo pipeline de confirmación, supresión, evidencia y generación de informes
utilizado por las rutas de CPU y Hyperscan.
- **Tres peers físicos de GPU.** CUDA, Metal nativo y WGPU portátil se
adquieren, miden y reportan de forma independiente.
- **Paridad exacta de resultados.** La calibración rechaza un candidato cuya
identidad de hallazgo difiere de la ruta de referencia. Una respuesta incorrecta más rápida nunca entra
en la tabla de enrutamiento.
- **Evidencia persistente de ruta.** KeyHog registra el binario, el corpus de detectores,
la configuración, la clase de carga de trabajo, el host, el acelerador, el controlador y la evidencia
de tiempos medida. Los escaneos normales no realizan benchmarks en la ruta crítica.
- **Ejecución residente.** Los workers del daemon mantienen el estado compilado de detectores y
aceleradores activo para lotes repetidos de archivos, archivos comprimidos, historial, remotos y en la nube.
- **Sin vía de escape oculta a la CPU.** Un acelerador seleccionado explícitamente que no puede
inicializarse o despacharse falla de forma visible en lugar de devolver hallazgos de CPU bajo
una etiqueta de GPU.
La instalación predeterminada de crates.io utiliza la ruta de CPU pura en Rust portátil, por lo que funciona
en un host Rust limpio. Habilita los tres peers de GPU sin adquirir Hyperscan:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu
Habilita el peer de regex SIMD Hyperscan o Vectorscan:```sh cargo install --locked keyhog --no-default-features --features portable,simd
Ejecuta el diagnóstico del backend de producción y luego inspecciona la ruta medida:```sh
keyhog backend --self-test
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
La guía de backend documenta las tablas residentes, el modelo de despacho acotado, el contrato de paridad y la evidencia reproducible de cruce.
Comenzar
Instalar y ejecutar tu primer escaneo
Los dos comandos anteriores instalan la última versión de crates.io y escanean el árbol actual con la ruta portable de Rust puro.
Fija un entorno de CI a una versión exacta con
cargo install --locked --version '=0.5.86' keyhog. KeyHog requiere Rust 1.89
o más reciente. Consulta la guía de instalación
para los perfiles de GPU, Hyperscan, CI, portable y compilación desde el código fuente.
KeyHog sale con 1 cuando un hallazgo bloquea la política de evidencia activa. La política
predeterminada bloquea los hallazgos likely y confirmed mientras mantiene visibles los
hallazgos review con salida 0; --evidence-policy paranoid bloquea todos los niveles.
Revisa el nivel de evidencia exacto, el código de motivo, el archivo, la línea, el detector y la
remediación de cada hallazgo. Otros códigos distintos de cero describen fallos de entrada, sistema,
verificación o cobertura; consulta la
referencia de códigos de salida.
El contrato completo del proceso es:
| Salida | Significado |
|---|---|
0 éxito | Ningún hallazgo bloquea la política de evidencia activa y no se produjo ningún fallo de cobertura. Los hallazgos de nivel review pueden permanecer visibles bajo la política predeterminada. |
1 hallazgos bloqueantes | Al menos un hallazgo bloquea la política de evidencia activa, pero ninguno se confirmó como activo. |
2 error del operador | Corrige los argumentos, la configuración, el corpus de detectores o la entrada corregible por el operador. |
3 error del sistema | Repara o reintenta el ejecutor. Esto incluye E/S de bajo nivel, servicio de daemon fatal, caché incremental y fallos de SIMD seleccionados explícitamente. |
4 fallo de salud/autocomprobación | Una comprobación de salud de doctor o backend --self-test no fue saludable. |
10 credenciales activas | Al menos una credencial se confirmó como activa. |
11 pánico del escáner | Descarta el resultado del escaneo porque el estado del escáner no es fiable. |
12 fallo de GPU requerido | Una ruta de GPU seleccionada o requerida explícitamente no pudo ejecutarse. |
13 cobertura incompleta | Una fuente solicitada falló o la cobertura de entrada fue incompleta, y ningún resultado de hallazgo tuvo prioridad. |
130 interrumpido | SIGINT o Ctrl-C interrumpió el proceso. |
Filtrar, formatear, controlar:
Crea una línea base antes de usarla como filtro:```sh keyhog scan . --create-baseline .keyhog-baseline.json keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json
El primer comando revisa los hallazgos encontrados y sale con `0` sin imprimirlos. Confirma ese archivo y luego usa el segundo comando para reportar solo las identidades de nuevos hallazgos. Una entrada de línea base coincide con el detector y el valor de la credencial, nunca con la ruta del archivo, por lo que mover un secreto registrado no hace fallar la compuerta, pero rotarlo sí. Las credenciales cambiadas y la cobertura incompleta permanecen visibles. La ruta completa, incluidas las particiones de monorepos, está en [Fallar solo con secretos nuevos](https://santhreal.github.io/keyhog/workflows/ci.html#fail-only-on-new-secrets).
Para el siguiente escaneo, usa el [libro de recetas](https://santhreal.github.io/keyhog/recipes.html) o los comandos copiables en [Elegir el flujo de trabajo correcto](#choose-the-right-workflow). Puedes escanear el historial de Git, imágenes de contenedores, buckets en la nube, colecciones de repositorios, URLs y una máquina completa sin cambiar de herramientas.
### Proteger repositorios para escaneos rápidos previos al commit
Registra un repositorio con el daemon perpetuo de KeyHog para la detección rápida de secretos previa al commit (requiere Unix; en Windows usa `keyhog scan` en proceso):```sh
# 1. Start the daemon (accelerated by CUDA, Metal, WGPU, or SIMD)
keyhog guard up
# 2. Guard your repository (indexes baseline and installs pre-commit hook in one step)
keyhog guard add /path/to/repo
# 3. Every staged commit checks only changed blobs against in-memory attestations
keyhog scan --git-staged
# 4. View all active guarded repositories and their states
keyhog guard list
# 5. Turn the daemon on and off cleanly without losing registrations or durable index
keyhog guard down
Consulta la guía de guardia perpetua y el flujo de trabajo de pre-commit para conocer la configuración completa, el ciclo de vida de la máquina de estados y la automatización de hooks.
Añádelo a GitHub Actions
Crea .github/workflows/keyhog.yml:```yaml
name: keyhog
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
security-events: write
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: santhreal/keyhog@v0
with:
path: .
severity: high
La acción escanea el árbol verificado, falla ante hallazgos de nivel `high` o `critical`, sube SARIF a Code Scanning y conserva el informe como artefacto del flujo de trabajo. Los fallos de instalación, cobertura, backend y publicación del informe también hacen fallar el trabajo.
Consulta la [guía de GitHub Action](https://santhreal.github.io/keyhog/workflows/github-action.html) para entradas, salidas, adopción de línea base, particiones de monorepo, verificación y comportamiento ante fallos. Usa la [guía de CI](https://santhreal.github.io/keyhog/workflows/ci.html) para GitLab, CircleCI, Jenkins, Buildkite y trabajos shell genéricos. Usa la [guía de escaneo masivo](https://santhreal.github.io/keyhog/guides/mass-scanning.html) para organizaciones de repositorios, grupos de Git alojados, buckets en la nube e inventarios particionados.
## Superficies de escaneo que otras herramientas tratan como productos separados
KeyHog escanea bytes en el límite donde pueden filtrarse, no solo archivos fuente rastreados. Usa un informe por límite para que la CI conserve la cobertura exacta y el estado de fallo.
| Superficie de exposición | Ejemplo |
|---|---|
| Artefacto de paquete final | Ejecuta `npm pack` y luego escanea el `.tgz` generado con `keyhog scan package.tgz`. La expansión de archivos comprueba archivos generados, source maps, fixtures y metadatos ausentes del árbol fuente esperado. |
| Aplicación de navegador desplegada | `keyhog scan --url https://app.example.com/assets/app.js` sigue la decodificación acotada de JavaScript, source maps, WASM y respuestas sin convertir el escáner en un rastreador sin límites. |
| Issues, pull requests, discussions, wikis y gists de GitHub | `keyhog scan --github-collaboration owner/repo --github-all` escanea cada superficie de colaboración fuera del checkout. |
| Configuración de agentes de IA y MCP | `keyhog scan ~/.config ~/.claude ~/.codex` aplica el mismo pipeline de detector, decodificación, evidencia e informes a la configuración local de herramientas. |
| Capas de imágenes de contenedor | `keyhog scan --docker-image registry.example.com/team/app:v1` escanea el contenido de la imagen que se ejecutará, incluidos los archivos introducidos durante la compilación. |
| Inventarios de objetos en la nube | `keyhog scan --s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` conserva la paginación del proveedor, los objetos y los límites de bytes en el informe de terminal. |
| Host de desarrollo completo | `sudo keyhog scan-system --space 50G` descubre sistemas de archivos montados e historial de Git alcanzable bajo un presupuesto de almacenamiento estricto. |
Estas rutas comparten un único contrato de detección e informes. Un fallo específico de una fuente no puede convertirse silenciosamente en un escaneo local más limitado.
## Elige el flujo de trabajo adecuado
Elige primero el límite de la fuente. Un preset cambia el trabajo de detección, mientras que un backend cambia la ejecución. Ninguno de los dos expande un escaneo del árbol de trabajo al historial de Git, un inventario de proveedor, almacenamiento en la nube o una auditoría del host.
No existe un atajo honesto de `scan everything`. Una revisión completa del patrimonio ejecuta los límites relevantes a continuación como trabajos separados y conserva cada informe `json-envelope` con su código de salida sin procesar.
| Necesidad | Comienza con | Rendimiento y reutilización | Límite de cobertura |
|---|---|---|---|
| Retroalimentación local rápida | `keyhog scan . --fast --incremental` | Reutiliza hashes de archivos sin cambios. El preset rápido omite trabajo de decodificación, entropía y ML. | Ejecuta la política predeterminada antes del merge porque el modo rápido es intencionalmente más limitado. |
| Escaneo completo del repositorio | `keyhog scan .` | `auto` calibrado y el valor predeterminado de workers por núcleo de CPU. Añade `--incremental` para escaneos repetidos del mismo árbol de confianza. | Solo archivos actuales. No añade historial de Git. |
| Puerta de commit en stage | `keyhog scan --git-staged` o `keyhog hook install` | Lee blobs exactos del índice, por lo que las ediciones sin stage no pueden cambiar el resultado. | Solo contenido en stage. Ejecuta un escaneo del árbol de trabajo por separado cuando los bytes locales sin stage importan. |
| Guardia perpetua del repositorio | `keyhog guard add . --mode repo` y luego `keyhog guard status .` | Registro raíz residente en el daemon con una máquina de 7 estados, caché de atestación limpia y seguimiento de identidad de política. | Requiere un daemon en ejecución. La guardia complementa, no reemplaza, los escaneos en stage y del árbol de trabajo. |
| Puerta de pull request de GitHub | `santhreal/keyhog@v0` | La Action instala, escanea, publica SARIF y un artefacto, y luego conserva el estado de KeyHog. | Una única ruta verificada. Usa el escaneo de inventario de proveedor para una organización. |
| GitLab, Jenkins, Buildkite o CI shell | `keyhog scan . --format json-envelope --output keyhog.json` | Conserva el informe y el código de salida en éxito, hallazgos y errores. Usa `--git-diff <base>` solo para una puerta de líneas modificadas explícitamente más limitada. | Los bytes presentes en el checkout o el diff seleccionado. |
| Adoptar un repositorio con hallazgos conocidos | Crea `.keyhog-baseline.json`, haz commit y luego escanea con `--baseline .keyhog-baseline.json`. | Las identidades existentes permanecen visibles en la línea base mientras solo los hallazgos nuevos hacen fallar la puerta. | Una línea base no suprime credenciales modificadas ni cobertura incompleta. |
| Recuperación recursiva de Git | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | Calibra la política profunda una vez por clase de worker. Ejecuta en proceso. | Un repositorio. `--git-history` cubre solo la ascendencia del checkout actual, por lo que una rama que nunca verificaste se omite sin brecha de cobertura; `--git-blobs` también alcanza blobs colgantes, commits eliminados por amend, stashes, notas, mensajes de tags anotados y refs empaquetados. |
| Inspección de contenedor o archivo | `keyhog scan --docker-image registry/app:v1` o `keyhog scan incoming/` | Conserva un informe envelope para que los miembros omitidos, corruptos, cifrados, inseguros o sobredimensionados sigan siendo visibles. | Solo la imagen o ruta de sistema de archivos seleccionada y los formatos anidados compatibles. |
| Inspección de URL, respuesta o HAR | `keyhog scan --url https://api.example.com/config` o `keyhog scan capture.har` | Usa límites de fuente acotados y conserva el envelope de terminal. | Solo respuestas obtenidas o entradas de captura. Esto no es un rastreador. |
| Inventario de organización o nube | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | Particiona por proveedor, propietario o bucket. Ejecuta particiones independientes de forma concurrente con un informe y estado cada una. | Un inventario de proveedor seleccionado por trabajo. Los límites de paginación u objetos siguen siendo límites de cobertura. |
| Confirmar si los hallazgos elegibles están activos | `keyhog scan . --verify` | La concurrencia del proveedor y los controles de tasa están separados de los workers del escáner. | Envía solicitudes derivadas de credenciales a endpoints declarados del proveedor. No todos los detectores admiten verificación. |
| Escaneo de salud de todo el host | `sudo keyhog scan-system --space 50G` | Usa todos los núcleos de CPU por defecto y escanea el historial de Git descubierto después de los datos del sistema de archivos. | Sistemas de archivos locales montados. Los montajes de red son opcionales y el límite de espacio es estricto. |
| Directorio, historial, archivo, remoto o inventario de nube con GPU en Unix | Calibra autoroute, inicia `keyhog daemon start --mass` y luego ejecuta `keyhog scan --daemon=mass <SOURCE>`. | Transmite lotes acotados a través de un único worker compilado de CPU, Hyperscan, CUDA, Metal o WGPU. Añade `--incremental` para árboles de sistema de archivos cálidos sin cambios. El recibo de terminal informa totales exactos y lotes de GPU, chunks, bytes, cuota de GPU y rendimiento. | Las líneas base, verificación, lockdown, presets, overlays y otros cambios de política del escáner se rechazan antes de la adquisición. El estado incremental se aplica solo a raíces de sistema de archivos locales del daemon. |
### Escanea cada límite de fuente compatible
Usa un comando por límite. Conserva un informe `json-envelope` y el estado de salida sin procesar para cada partición de inventario.
| Fuente o caso de uso | Comando |
|---|---|
| Varias raíces locales | `keyhog scan services/api services/web deploy/` |
| Archivos cambiados continuamente | `keyhog watch services/api deploy/` |
| Bytes en stage, líneas modificadas, historial alcanzable o blobs | `keyhog scan --git-staged`, `--git-diff main`, `--git-history .` o `--git-blobs .` |
| Binarios nativos y strings de firmware | `keyhog scan --binary firmware.bin` (un escaneo de directorio simple omite binarios y aun así sale con `0`) |
| Archivos comprimidos y fuentes comprimidas | `keyhog scan incoming/` (los miembros compatibles se expanden automáticamente) |
| Capas de imágenes Docker | `keyhog scan --docker-image registry/app:v1` |
| JavaScript, source maps, WASM o una respuesta de endpoint | `keyhog scan --url https://api.example.com/config` |
| Capturas de solicitudes y respuestas HTTP | `keyhog scan capture.har` |
| Issues, pull requests, discussions, wikis y gists de GitHub | `keyhog scan --github-collaboration owner/repo --github-all` |
| Inventarios de GitHub, GitLab o Bitbucket | `--github-org ORG`, `--gitlab-group GROUP` o `--bitbucket-workspace WORKSPACE` |
| Inventarios de S3, GCS o Azure Blob | `--s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` |
| Un flujo acotado de otra herramienta | `producer \| keyhog scan --stdin` (usa `set -o pipefail` para que un productor fallido muestre su propio error, no un escaneo de cero bytes) |
Un escaneo de directorio simple no lee binarios nativos. Cada uno se convierte en una brecha de cobertura `binary (extension or content sniff)`, el escaneo aun así sale con `0` y `--no-default-excludes` no lo cambia, así que pasa `--binary` cuando los artefactos compilados están en alcance. Ese flag necesita una compilación con la feature `binary`, que la instalación predeterminada de crates.io tiene y la feature reducida `ci` no.
La extracción de binarios nativos informa credenciales completas que satisfacen el contrato de forma explícita de un detector nombrado. Suprime fragmentos cortos de prefijo y strings genéricas con forma de asignación de secciones de datos compiladas porque esos bytes no conservan el contexto de la fuente.
La obtención de endpoints está acotada y protegida contra SSRF. No es un rastreador. Los endpoints privados en la nube y el reenvío de credenciales requieren sus flags de confianza explícitos. Los tokens de proveedor pertenecen a las variables de entorno documentadas, no a los argumentos de proceso.
Usa el [selector de flujos de trabajo](https://santhreal.github.io/keyhog/capabilities.html) para detalles de fuente y política, la [guía de GitHub Action](https://santhreal.github.io/keyhog/workflows/github-action.html) para la puerta de repositorio mantenida, la [guía de CI directa](https://santhreal.github.io/keyhog/workflows/ci.html) para informes duraderos y manejo de salidas, y la [guía de escaneo masivo](https://santhreal.github.io/keyhog/guides/mass-scanning.html) para particionado y agregación. El [recetario](https://santhreal.github.io/keyhog/recipes.html) cubre contenedores, archivos, URLs, contenido de colaboración de GitHub y fuentes en la nube.
### Velocidad y concurrencia sin conjeturas
Comienza con los valores predeterminados. Cargo no puede ejecutar KeyHog después de `cargo install`, así que ejecuta los comandos a continuación una vez tras instalar una compilación de Cargo multi-backend y de nuevo después de que cambien el host, el binario, el corpus de detectores, el driver o las clases de carga de trabajo:```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
| Control | Úsalo para | Mantén este invariante |
|---|---|---|
--backend auto calibrado | Selección rutinaria de CPU, Hyperscan o GPU. | Un backend explícito es una anulación de diagnóstico, no un valor predeterminado más rápido. |
--threads <N> | Reservar capacidad de CPU en un ejecutor compartido. Los hosts dedicados normalmente deberían dejarlo sin establecer para que KeyHog use los núcleos disponibles. | Cada valor debe ser positivo. Varios procesos KeyHog concurrentes poseen cada uno un grupo de trabajadores, así que divide el presupuesto del host entre las particiones. |
--reader-threads <N> | Canalizaciones de almacenamiento medidas donde el trabajo del lector, no el escaneo, es el cuello de botella. | El valor predeterminado se deriva del grupo de trabajadores de escaneo. Déjalo sin establecer hasta que la creación de perfiles muestre un cuello de botella en el lector. |
--incremental y --incremental-cache <PATH> | Escaneos repetidos del mismo árbol de confianza. | No compartas un índice entre repositorios no relacionados o trabajos no confiables. |
| Particiones de proveedor o repositorio | Escaneo concurrente del patrimonio y reintentos independientes. | Conserva un sobre de terminal y un código de salida sin procesar por partición. No concatenes hallazgos y descartes el estado de cobertura. |
--verify-concurrency, --verify-rate y --verify-batch | Limitar las comprobaciones activas del proveedor independientemente del escaneo de archivos. | La verificación envía solicitudes derivadas de credenciales. Los límites de tasa del proveedor, no el recuento de CPU, controlan esta concurrencia. |
| Daemon masivo | Flujos de directorio, historial, archivo, remoto o nube a escala de TB en un trabajador Unix. | Cada marco se limita a 8 MiB y 1.024 fragmentos. El daemon serializa el estado de los fragmentos y devuelve un recibo de ejecución exacto de CPU/GPU. |
--fast, predeterminado, --deep o --precision | Seleccionar una política explícita de costo de detección y recuperación. | Estos ajustes preestablecidos son mutuamente excluyentes y cambian la cobertura. No son perillas de velocidad intercambiables. |
Inspecciona la política resuelta con keyhog config --effective. Usa --profile
para medir las etapas fijas del escáner y la ejecución completa del operador antes de cambiar
los controles de lector, lote o profundidad de canal. El informe de bajo overhead registra
fuente, backend, caché, carga de trabajo, hilos, entrada, transición de estado, tiempo de CPU,
pico de memoria, SHA-256 exacto del binario, SHA-256 de funciones habilitadas, tripleta objetivo, perfil de
compilación, compilador, asignador, SHA-256 del backend vinculado, SHA-256 del corpus de detectores,
BLAKE3 de detectores habilitados, BLAKE3 del plan compilado, procedencia del detector con hash,
BLAKE3 completo de la configuración resuelta, BLAKE3 de la política de rendimiento, ajuste preestablecido,
estado de protección aplicado, adaptadores de fuente, BLAKE3 del objetivo de fuente con hash,
BLAKE3 de la partición de fuente con hash, bytes brutos de fuente, fanout de unidades de fuente,
bytes derivados de la decodificación, bytes completados de despacho de backend y cubos estables de tamaño/fanout.
Los dominios de bytes que su adaptador de fuente aún no puede distinguir permanecen
explícitamente no disponibles en lugar de convertirse en ceros medidos. El informe no
registra contenido de fuente, valores de credenciales, rutas brutas, URL brutas ni valores brutos de
configuración. Usa --perf-trace solo para contadores de diagnóstico costosos por patrón y por
backend.
Mantén los controles avanzados de canalización sin establecer a menos que una medición reproducible en el
trabajador objetivo muestre una mejora.
Para un escaneo recurrente completo del repositorio:```sh
keyhog scan . --incremental
--format json-envelope --output keyhog.json
Para un runner compartido donde el trabajo tiene asignados cuatro workers de escaneo y un
worker de lectura:```sh
keyhog scan . --threads 4 --reader-threads 1 \
--format json-envelope --output keyhog.json
El segundo comando es un presupuesto de recursos, no un óptimo universal. Mide el host objetivo antes de elegir recuentos explícitos de workers.
Para recuperación profunda y triaje a nivel de sistema, usa sus guías dedicadas porque su cobertura y reglas de finalización difieren de un escaneo de repositorio normal.
Benchmarks del escáner de secretos
Estos paneles comparan la política de detección, las solicitudes de ejecución de CPU y GPU, el comportamiento de la caché incremental y las solicitudes del daemon en caliente. Cada valor se genera a partir de la instantánea de benchmark verificada. La instantánea vincula la versión del escáner, el digest del ejecutable, el digest del detector, el corpus, el host y la marca de tiempo de ejecución. Usa la evidencia completa del benchmark para la procedencia de los competidores y el recall por categoría.
Precisión de detección
KeyHog KeyHog v0.5.70 escaneó el corpus mirror: 15.000 fixtures, 3.000 positivos etiquetados y 2.431.242 bytes de entrada. El manifiesto de la clave de respuestas se excluyó del árbol de escaneo. La fila usa la política predeterminada en la ruta explícita Hyperscan/SIMD en AMD Ryzen 9 9950X 16-Core Processor.
| Precisión | Recall | F1 | Verdaderos positivos | Falsos positivos | Falsos negativos |
|---|---|---|---|---|---|
| 0.9651 | 0.9027 | 0.9328 | 2.708 | 98 | 292 |
El árbol fuente rastreado estaba limpio.
Rutas de ejecución, ajustes preestablecidos y caché
Medido en AMD Ryzen 9 9950X 16-Core Processor con NVIDIA GeForce RTX 5090, 32 núcleos lógicos, 15.000 fixtures, 3.000 positivos etiquetados y 2.431.242 bytes de entrada. Escáner: KeyHog v0.5.70. El árbol fuente rastreado estaba limpio.
Escaneo completo por ruta de ejecución
Todas las filas usan la política de detección predeterminada con caché incremental y daemon desactivado. La fila automática registra la política solicitada, pero el resultado del benchmark no vincula la ruta persistente seleccionada, por lo que no es prueba de enrutamiento. Las filas de GPU incluyen la adquisición y el arranque completo del escáner en este corpus pequeño; no son mediciones de cruce de kernels de GPU.
| Ruta solicitada | Tiempo real | Rendimiento | RSS máximo | F1 |
|---|---|---|---|---|
| Hyperscan/SIMD | 860 ms | 2.70 MB/s | 416 MiB | 0.9328 |
| Pure-Rust CPU | 903 ms | 2.57 MB/s | 509 MiB | 0.9328 |
| CUDA | 2.03 s | 1.14 MB/s | 963 MiB | 0.9328 |
| WGPU | 1.97 s | 1.18 MB/s | 1264 MiB | 0.9328 |
| Automática | 1.46 s | 1.59 MB/s | 634 MiB | 0.9328 |
Política de detección en Hyperscan/SIMD
La ruta, la caché, el estado del daemon, el corpus y el host permanecen fijos. Los ajustes preestablecidos cambian el trabajo de detección, así que compara precisión y recall además del tiempo.
| Política | Tiempo real | Precisión | Recall | F1 | Hallazgos |
|---|---|---|---|---|---|
| Rápida | 737 ms | 0.9700 | 0.8837 | 0.9248 | 2.738 |
| Predeterminada | 860 ms | 0.9651 | 0.9027 | 0.9328 | 2.816 |
| Profunda | 861 ms | 0.9645 | 0.9067 | 0.9347 | 2.845 |
| Precisión | 849 ms | 0.9590 | 0.6397 | 0.7674 | 2.001 |
Reejecución incremental en caliente
El benchmark puebla el índice Merkle BLAKE3 y luego mide el segundo escaneo idéntico. El pequeño árbol sintético cambia poco porque el arranque del escáner domina; mide tu repositorio antes de afirmar una aceleración.
| Política predeterminada Hyperscan/SIMD | Tiempo real | Rendimiento | RSS máximo |
|---|---|---|---|
| Caché desactivada | 860 ms | 2.70 MB/s | 416 MiB |
| Caché incremental en caliente | 617 ms | 3.76 MB/s | 457 MiB |
Solicitudes del daemon en caliente
Un archivo regular determinista de 8 MiB (sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5) se escaneó una vez en proceso y una vez a través de un daemon propio después de una solicitud de calentamiento. El tiempo del daemon es la solicitud del cliente; el RSS del daemon pertenece al servidor residente.
| Ruta explícita | En proceso | Daemon en caliente | Caliente / un solo uso | RSS en proceso | RSS del daemon |
|---|---|---|---|---|---|
| Hyperscan/SIMD | 323 ms | 106 ms | 0.33× | 63 MiB | 74 MiB |
| Pure-Rust CPU | 278 ms | 109 ms | 0.39× | 62 MiB | 66 MiB |
| CUDA | 1.65 s | 232 ms | 0.14× | 674 MiB | 666 MiB |
| WGPU | 1.33 s | 237 ms | 0.18× | 596 MiB | 600 MiB |
Estas filas cubren la ruta de archivo único en caliente. La ruta masiva también acepta lotes acotados de directorios y fuentes remotas; su ruta de sistema de archivos incremental se mide por separado.
Escalado de CPU, lector, almacenamiento, tamaño y partición
Generado por make -C benchmarks readme-scaling desde benchmarks/reports/readme-scaling.json. El arnés ejecutó 3 ensayos medidos después de 1 calentamiento con enrutamiento simd explícito y daemon desactivado. El escalado de workers usa una caché de página de cliente en caliente para aislar el trabajo de CPU. Las filas de lector, tamaño de corpus, almacenamiento y partición solicitan evicción de página limpia con posix_fadvise donde la plataforma lo admite; la instantánea registra la política en cada fila. Cada carga de trabajo es determinista en bytes y sin hallazgos.
Host: AMD Ryzen 9 9950X 16-Core Processor, 32 núcleos lógicos efectivos, 94.140 MiB de RAM, Linux 6.17.0-19-generic. Evidencia: clean, binario 274b045489c4.
Escalado de workers de escaneo
| Workers | Hilos de lector | Tiempo real mediano | Tiempo real p95 | Rendimiento | Aceleración | Eficiencia | RSS máximo mediano |
|---|---|---|---|---|---|---|---|
| 1 | auto | 8.134,4 ms | 8.135,4 ms | 7,9 MiB/s | 1.00x | 100.0% | 47.0 MiB |
| 2 | auto | 4.398,2 ms | 6.906,7 ms | 14,6 MiB/s | 1.85x | 92.5% | 50.3 MiB |
| 4 | auto | 2.392,6 ms | 6.245,2 ms | 26,7 MiB/s | 3.40x | 85.0% | 57.2 MiB |
| 8 | auto | 1.816,3 ms | 6.117,6 ms | 35,2 MiB/s | 4.48x | 56.0% | 63.4 MiB |
| 16 | auto | 1.428,5 ms | 6.867,7 ms | 44,8 MiB/s | 5.69x | 35.6% | 78.4 MiB |
| 32 | auto | 1.862,8 ms | 5.939,1 ms | 34,4 MiB/s | 4.37x | 13.6% | 126.7 MiB |
Escalado del lector del sistema de archivos
| Workers de escaneo | Hilos de lector | Tiempo real mediano | Tiempo real p95 | Rendimiento | Relativo a 1 lector | RSS máximo mediano |
|---|---|---|---|---|---|---|
| 32 | 1 | 1.898,7 ms | 1.922,1 ms | 33,7 MiB/s | 1.00x | 121.3 MiB |
| 32 | 2 | 1.881,7 ms | 1.887,5 ms | 34,0 MiB/s | 1.01x | 122.8 MiB |
| 32 | 4 | 1.874,2 ms | 1.891,2 ms | 34,1 MiB/s | 1.01x | 126.6 MiB |
| 32 | 8 | 1.873,2 ms | 1.885,7 ms | 34,2 MiB/s | 1.01x | 133.4 MiB |
| 32 | 16 | 1.856,8 ms | 1.868,5 ms | 34,5 MiB/s | 1.02x | 153.9 MiB |
| 32 | 32 | 1.877,3 ms | 1.880,4 ms | 34,1 MiB/s | 1.01x | 179.5 MiB |
Escalado del tamaño del corpus
| Corpus | Archivos | Bytes exactos | Tiempo real mediano | Tiempo real p95 | Rendimiento | RSS máximo mediano |
|---|---|---|---|---|---|---|
| pequeño | 256 | 8 MiB | 869,9 ms | 886,1 ms | 9,2 MiB/s | 111.1 MiB |
| mediano | 1.024 | 64 MiB | 1.859,9 ms | 1.874,8 ms | 34,4 MiB/s | 126.3 MiB |
| grande | 2.048 | 256 MiB | 5.214,9 ms | 5.321,7 ms | 49,1 MiB/s | 137.1 MiB |
Escalado de almacenamiento
| Clase de almacenamiento | Sistema de archivos | ID de dispositivo | Tiempo real mediano | Tiempo real p95 | Rendimiento | Relativo al primer almacenamiento | RSS máximo mediano |
|---|---|---|---|---|---|---|---|
| workspace | ext4 | 66305 | 1.847,4 ms | 1.863,4 ms | 34,6 MiB/s | 1.00x | 127.0 MiB |
| local-temp | tmpfs | 116 | 1.870,8 ms | 1.887,3 ms | 34,2 MiB/s | 0.99x | 124.9 MiB |
Escalado de particiones concurrentes
| Procesos | Workers por proceso | Workers agregados | Archivos totales | Bytes totales | Tiempo real mediano | Rendimiento agregado | Aceleración | RSS máximo sumado mediano |
|---|---|---|---|---|---|---|---|---|
| 1 | 32 | 32 | 256 | 8 MiB | 871,9 ms | 9,2 MiB/s | 1.00x | 111.5 MiB |
| 2 | 16 | 32 | 512 | 16 MiB | 404,6 ms | 39,5 MiB/s | 4.31x | 134.0 MiB |
| 4 | 8 | 32 | 1.024 | 32 MiB | 571,1 ms | 56,0 MiB/s | 6.11x | 227.2 MiB |
Estas filas son mediciones, no constantes de ajuste universales. Ejecuta el generador en el host y almacenamiento objetivo. Usa el punto de inflexión donde el rendimiento deja de mejorar y luego reserva CPU y memoria para el runner de CI o la capa de orquestación.
Reproduce los cuatro grupos de benchmarks con make -C benchmarks readme-matrix.
El comando mide la matriz requerida y falla si falta cualquier fila solicitada de CPU,
Hyperscan, CUDA, Metal, WGPU, ajuste preestablecido, caché, daemon, hilo, lector, almacenamiento, tamaño
de corpus o partición. Usa
make -C benchmarks readme-matrix-check para verificar que ambas instantáneas, informes
y el README coincidan.
Elige una configuración de escaneo
Comienza con la política predeterminada y el enrutamiento automático calibrado. Cambia un solo eje solo cuando el flujo de trabajo lo requiera:
| Flujo de trabajo | Política de detección | Ejecución y reutilización | Control adicional |
|---|---|---|---|
| Primer escaneo de repositorio | Predeterminada | auto calibrado; --daemon=auto | Revisa todos los hallazgos antes de agregar supresiones. |
| Escaneo repetido de árbol local o CI | Predeterminada | auto calibrado; --incremental | Persiste la caché incremental solo entre escaneos del mismo árbol de confianza. |
| Bucle de retroalimentación corto | --fast | auto calibrado; --incremental opcional | Acepta cobertura reducida de decodificación, entropía y ML. Ejecuta la política predeterminada antes del merge. |
| Recuperación de mayor recall | --deep | En proceso | Deep es mutuamente excluyente con fast y precision, y no es elegible para daemon. |
| Inventario grande de menor ruido | --precision | En proceso para colecciones de repositorios, historial y fuentes en la nube | El ajuste preestablecido eleva los umbrales de confianza y desactiva el descubrimiento de entropía. Puede omitir credenciales de menor confianza. |
| Inventario de directorio, historial, archivo, remoto o nube a escala de TB en Unix | Predeterminada | keyhog daemon start --mass, luego --daemon=mass | Los lotes permanecen acotados a 8 MiB y 1.024 chunks. Conserva el informe de cobertura terminal y el recibo de ejecución de GPU. |
| Validación de credenciales en vivo | Predeterminada | En proceso | Agrega --verify explícitamente. La verificación envía solicitudes derivadas de credenciales a los proveedores. |
| Escaneo Linux sin swap | Predeterminada más --lockdown | En proceso; caché incremental desactivada | Lockdown rechaza verificación, secretos en texto plano, modo rápido e interruptores que reducen la completitud. |
--fast, --deep y --precision son ajustes preestablecidos de detección mutuamente excluyentes.
--lockdown es un modo de ejecución de cierre seguro, no un cuarto ajuste preestablecido. Los valores
explícitos de --backend son diagnósticos y anulaciones de benchmark. No reemplazan
la evidencia persistente de más rápido-correcto usada por el enrutamiento automático. Consulta
Configuración,
calibración de autoroute,
daemon y escaneos en caliente
y endurecimiento para los
contratos completos.
Cómo funciona KeyHog
KeyHog compila sus 934 detectores en un plan compartido de activación y extracción,
decodifica codificaciones anidadas antes de la coincidencia y aplica puntuación, evidencia
y supresión por detector. La CPU Pure-Rust (cpu-fallback) siempre está disponible.
La ruta Hyperscan (simd-regex) usa Hyperscan cuando esa característica está presente;
las compilaciones portátiles usan la ruta de CPU. CUDA (gpu-cuda-region-presence), Metal
(gpu-metal-region-presence) y WGPU (gpu-wgpu-region-presence) son pares
en un selector de autoroute respaldado por pruebas, no una cadena de respaldo. La calibración mide
cada par elegible y persiste la ruta más rápida cuyos hallazgos completos coinciden
con la ruta de referencia para el binario, detector y estado de configuración exactos,
host, acelerador y clase de carga de trabajo. Una decisión faltante, obsoleta, inválida o incompleta
detiene un escaneo automático antes de la ejecución e informa cómo recalibrar.
Nunca sustituye silenciosamente otro backend.
Consulta Arquitectura para el mapa del repositorio, dirección de dependencias, pipeline de bytes a hallazgo y puntos de entrada de perfilado. Consulta Backends y enrutamiento para los contratos de ejecución y Calibración de autoroute para paridad, identidad de carga de trabajo, ciclo de vida de caché y procedimientos de reparación.
Documentación completa: santhreal.github.io/keyhog - instalación, primer escaneo, formatos de salida, internos de detección, supresiones, verificación, integración pre-commit + CI, referencia de CLI, autoroute, códigos de salida, variables de entorno y contribución. Fuente en docs/.
Instalar KeyHog
Instala la versión actual de crates.io:```sh cargo install keyhog --locked
Compila el checkout del repositorio cuando necesites un cambio no publicado:```sh
cargo install --path crates/cli --locked
Confirmar la compilación instalada:```sh keyhog --version --full keyhog doctor
Usa la [guía de instalación](https://santhreal.github.io/keyhog/install.html) para
los requisitos de la cadena de herramientas de Rust, los perfiles de funciones y las dependencias
de ejecución específicas de la plataforma.
## Qué detecta
934 detectores integrados con validación offline propia de cada detector y acompañantes:
- **Proveedores de nube:** AWS (clave de acceso + secreta + verificación STS),
Azure (clave de suscripción, clave de cuenta de almacenamiento, SAS), GCP (cuenta de servicio,
clave de API), Cloudflare, Heroku, Vercel, Supabase.
- **Procesadores de pago:** Stripe, Braintree, Razorpay, Paddle, Plaid,
Square y PayPal, con comprobaciones propias del detector y acompañantes opcionales u obligatorios.
Una clave secreta de Razorpay requiere su ID de clave cercano.
- **Plataformas de código fuente:** PAT de GitHub (con suma de comprobación CRC32), tokens de GitLab,
contraseñas de aplicación de Bitbucket, tokens de npm (con suma de comprobación), Gitea / Forgejo
/ Codeberg.
- **Autenticación / SSO:** Okta, Auth0, Clerk, JumpCloud, Kinde.
- **Comunicaciones:** Slack, Discord, Twilio, SendGrid, Postmark, Mailgun,
Resend, Loops.
- **IA / ML:** OpenAI (sk-/sk-proj-), Anthropic, Google AI Studio,
Cohere, Mistral, HuggingFace, Replicate. Las credenciales de organización de HuggingFace
incluyen tanto la forma actual `hf_` como los tokens heredados `api_org_`.
- **Gestores de contraseñas:** claves secretas de cuenta de 1Password (`A3-` seguidas de
cinco o seis componentes alfanuméricos en mayúsculas segmentados).
- **Bases de datos:** cadenas de conexión de Postgres, MongoDB Atlas, Supabase
service-role, PlanetScale, Neon, Turso, MySQL, URLs de Redis.
- **Descubrimiento genérico + de entropía:** `API_KEY=<blob-de-alta-entropía>` detecta
credenciales sin detector nombrado, limitado por umbrales de entropía por contexto
+ puntuación ML.
- **Material criptográfico:** claves privadas RSA / EC / SSH, bloques privados PGP,
secretos de firma JWT.
Cada detector se distribuye como un [archivo TOML](https://github.com/santhreal/keyhog/blob/main/detectors) (datos, no código):
metadatos del servicio, patrones de regex, palabras clave, validadores offline, política de entropía y ML,
campos de acompañante y manejador de verificación. Añadir un nuevo detector es un
único cambio de TOML revisable;
la [guía para colaboradores](https://github.com/santhreal/keyhog/blob/main/CONTRIBUTING.md) lo explica paso a paso.
`keyhog explain <id>` vuelca la especificación completa de cualquier detector: patrones, palabras clave,
punto final de verificación, además de una guía de rotación y remediación paso a paso
clave por servicio, de modo que un hallazgo nunca sea una caja negra:
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: volcado de especificación del detector (patrón ghp_[A-Za-z0-9]{36}, palabra clave, URL de verificación) seguido de la guía de rotación de github y la remediación paso a paso" width="860" />
</p>
Explora la creación e inspección de detectores en la
[referencia de detectores](https://github.com/santhreal/keyhog/blob/main/docs/src/detectors.md), o consulta el corpus instalado con
`keyhog detectors --search <término> --verbose`.
## Por qué mayor recall, menos falsos positivos
- **Escaneo con decodificación.** Manifiestos `Secret` de Kubernetes, cuadernos
Jupyter, cargas útiles JWT, entornos envueltos en base64, valores de Helm y blobs
`auth:` de docker-config. El preprocesador estructurado trata las acciones de Helm equilibradas como
valores inertes de tiempo de renderizado y cierra los delimitadores Jupyter faltantes al final del archivo,
de modo que los bytes literales y las celdas de código completas permanecen cubiertos. Decodifica los valores
estructurados en su lugar y alimenta a cada detector posterior con el texto plano. Los detectores
no necesitan reimplementar la decodificación cada uno. Los escaneos con decodificación habilitada también recuperan
expresiones XOR de matriz de bytes JavaScript sin efectos secundarios y AES-256-CBC cuando
todo el material de recuperación está incrustado, incluidos los envoltorios estrictos de frase de contraseña con sal de CryptoJS/OpenSSL. KeyHog nunca ejecuta la fuente.
- **Reensamblaje multilínea.** Continuación `"sk-proj-" + \` en JavaScript,
cadenas multilínea de YAML, continuación con barra invertida en Makefile, salidas
con plantillas Helm / Jinja, todo reensamblado antes de la coincidencia de regex.
- **Validación de acompañantes.** Los acompañantes obligatorios limitan los detectores de alto ruido. Una
clave de API de Twilio sin su secreto de API se omite. Los acompañantes opcionales enriquecen
la puntuación de evidencia o la verificación. La detección de clave de acceso de AWS no requiere
su secreto, pero el secreto es necesario para la verificación en vivo.
- **Resolución entre detectores.** El TOML del detector puede requerir, rechazar o subsumir
hallazgos acotados de otro detector. La resolución permanece determinista independientemente del
orden de entrada, y los objetivos inválidos, las contradicciones o los ciclos de dependencia hacen fallar
la compilación del corpus.
- **Veredictos de evidencia.** Cada hallazgo lleva un nivel exacto `review`, `likely` o
`confirmed` más un código de razón canónico. La suma de comprobación intrínseca o la prueba de gramática,
los acompañantes obligatorios y la verificación en vivo producen evidencia confirmada;
la forma fuerte específica del proveedor en un rol que porta credenciales produce evidencia
probable; los anclajes débiles, las asignaciones genéricas, los candidatos solo por entropía y los
contextos de prueba, documentación, regla o identificador permanecen como evidencia de revisión.
Un `evidence_score` opcional complementa el veredicto cuando se mide.
El umbral predeterminado `0.40` controla el piso de confianza interno del escáner
y sigue siendo configurable con `--min-confidence`.
- **Calibración bayesiana por detector.** `keyhog calibrate --fp generic-api-key`
escribe un posterior Beta(α,β). Los escaneos lo usan solo cuando `--calibration-cache`
o `[system].calibration_cache` apunta a ese archivo, de modo que el ajuste de confianza sea
explícito y reproducible en lugar de depender del estado de caché del host.
## Rendimiento
Usa el arnés reproducible en [`benchmarks/`](https://github.com/santhreal/keyhog/blob/main/benchmarks) para comparar KeyHog,
Betterleaks, Kingfisher, Nosey Parker, TruffleHog y Titus bajo un único
contrato de puntuación. El arnés excluye el manifiesto de verdad fundamental de cada árbol de escaneo.
Las tablas generadas permanecen vacías hasta que existan ejecuciones con el esquema actual. Ejecuta
`make -C benchmarks report` después de la medición. No edites las tablas generadas a mano.
### Tabla de clasificación de detección
<!-- BENCH:leaderboard:start -->
#### Corpus espejo sintético con forma SecretBench
Corpus: **mirror** - 15000 fixtures, 3000 positivos etiquetados, 2,431,242 bytes. Cada escáner puntuado de forma idéntica (regla de solapamiento SecretBench); el manifiesto de la clave de respuestas se excluye del árbol de escaneo.
| Rango | Escáner | F1 | Precisión | Recall | Hallazgos | Tiempo | RSS máximo |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9328** | 0.9651 | 0.9027 | 2816 | 1.05s | 416 MB |
| 2 | TruffleHog | 0.5294 | 1.0000 | 0.3600 | 1080 | 1.59s | 300 MB |
| 3 | Kingfisher | 0.4683 | 0.3877 | 0.5913 | 5255 | 4.81s | 402 MB |
| 4 | Titus | 0.4207 | 0.3381 | 0.5567 | 5151 | 2.86s | 115 MB |
| 5 | Nosey Parker | 0.4186 | 0.3511 | 0.5183 | 4529 | 0.82s | 285 MB |
| 6 | Betterleaks | 0.3498 | 0.2241 | 0.7970 | 11113 | 0.74s | 198 MB |
#### Corpus de reglas de campo propio / territorio local de competidores
Corpus: **homefield** - 2399 fixtures extraídos de suites de reglas de verdad fundamental de competidores (reglas de Betterleaks y Kingfisher; 1,057 positivos etiquetados, 1,342 negativos, 772,974 bytes). Evaluación entre herramientas sobre la verdad fundamental de los competidores.
| Rango | Escáner | F1 | Precisión | Recall | Hallazgos | Tiempo | RSS máximo |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9214** | 0.9582 | 0.8874 | 979 | 0.72s | 384 MB |
| 2 | Betterleaks | 0.9056 | 0.9130 | 0.8984 | 1040 | 0.58s | 192 MB |
| 3 | Kingfisher | 0.8842 | 0.9250 | 0.8468 | 968 | 2.14s | 390 MB |
| 4 | TruffleHog | 0.4812 | 0.9850 | 0.3226 | 345 | 1.22s | 280 MB |
| 5 | Titus | 0.4635 | 0.3810 | 0.5913 | 1640 | 2.15s | 110 MB |
| 6 | Nosey Parker | 0.4520 | 0.3950 | 0.5280 | 1412 | 0.68s | 265 MB |
### Procedencia de resultados
| Escáner | Versión del escáner / digest del ejecutable | Identidad del corpus | Identidad del host | Fecha de ejecución |
|---|---|---|---|---|
| KeyHog | versión: KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Conjunto de detectores: 926 (926-4168e2c6c93a16ca)<br>Objetivo de compilación: x86_64-linux<br>Versión del modelo ML: moe-v1-246a05b92bec9aa3<br>Tarjeta del modelo ML: registrada 2026-07-15; características 55; F1 sintético 0.971 / P 0.945 / R 0.999; F1 real 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; detectores de recall cero 2/32; diferencial de seis escáneres no disponible<br>SHA-256 del ejecutable: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | versión: trufflehog 3.96.0<br>SHA-256 del ejecutable: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | versión: kingfisher 1.94.0<br>SHA-256 del ejecutable: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | versión: Titus v1.1.20 (puerto Go de NoseyParker)<br>SHA-256 del ejecutable: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | versión: noseyparker 0.24.0 Configuración de compilación: Marca de tiempo de compilación: 2025-05-08T21:11:15.600909923Z Marca de tiempo del commit: 2025-05-08T17:04:47.000000000-04:00 Rama del commit: HEAD SHA del commit: 61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Funciones de Cargo: color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release Debug: true Optimización: 3 Triple de destino: x86_64-unknown-linux-gnu Sistema de compilación: SO: Ubuntu Versión del SO: Linux (Ubuntu 22.04) Proveedor de CPU: AuthenticAMD Marca de CPU: AMD EPYC 7763 64-Core Processor Núcleos de CPU: 2 Versión de rustc: 1.86.0 Canal de rustc: stable Triple de host de rustc: x86_64-unknown-linux-gnu Fecha del commit de rustc: 2025-03-31 SHA del commit de rustc: 05f9846f893b09a1be1fc8560e33fc3c815cfecb Versión de LLVM de rustc: 19.1<br>SHA-256 del ejecutable: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | versión: betterleaks version dev<br>SHA-256 del ejecutable: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15,000 fixtures; 3,000 positivos etiquetados; 2,431,242 bytes | SHA-256/12 del hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:43Z |
<!-- BENCH:leaderboard:end -->
### Velocidad y memoria
<!-- BENCH:perf:start -->
#### Corpus espejo sintético con forma SecretBench
| Escáner | Config | Corpus | Tiempo | Rendimiento | RSS máximo |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | mirror | 0.74s | 3.1 MB/s | 198 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.82s | 2.8 MB/s | 285 MB |
| KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.05s | 2.2 MB/s | 416 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.59s | 1.5 MB/s | 300 MB |
| Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.86s | 0.8 MB/s | 115 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.81s | 0.5 MB/s | 402 MB |
#### Corpus de reglas de campo propio / territorio local de competidores
| Escáner | Config | Corpus | Tiempo | Rendimiento | RSS máximo |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | homefield | 0.58s | 1.3 MB/s | 192 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | homefield | 0.68s | 1.1 MB/s | 265 MB |
| KeyHog | `simd-nocache-nodaemon-full` | homefield | 0.72s | 1.1 MB/s | 384 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | homefield | 1.22s | 0.6 MB/s | 280 MB |
| Titus | `default-nocache-nodaemon-no-validate` | homefield | 2.15s | 0.4 MB/s | 110 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | homefield | 2.14s | 0.4 MB/s | 390 MB |
<!-- BENCH:perf:end -->
### Comparación de recall por categoría
<!-- BENCH:gaps:start -->
_Solo corte de recall diagnóstico. La precisión general y el F1 siguen siendo el contrato de comparación; los falsos positivos se cuentan en sus categorías puntuadas._
| Categoría | P/R/F1 de KeyHog | TP/FN de KeyHog | P/R/F1 del mejor competidor | Brecha de recall |
|---|---|---|---|---|
| `generic-high-entropy-string` | 1.000 / 0.434 / 0.606 | 73/95 | Betterleaks 1.000 / 0.798 / 0.887 | +0.363 |
<!-- BENCH:gaps:end -->
### Telemetría de recuperación estática acotada
<!-- BENCH:recovery:start -->
Ejecución seleccionada: escáner **KeyHog** `KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Conjunto de detectores: 926 (926-4168e2c6c93a16ca)<br>Objetivo de compilación: x86_64-linux<br>Versión del modelo ML: moe-v1-246a05b92bec9aa3<br>Tarjeta del modelo ML: registrada 2026-07-15; características 55; F1 sintético 0.971 / P 0.945 / R 0.999; F1 real 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; detectores de recall cero 2/32; diferencial de seis escáneres no disponible`; corpus **mirror** (15,000 fixtures, 2,431,242 bytes); generado `2026-08-11T01:29:39Z`; artefacto `mirror-keyhog-simd-nocache-nodaemon-full.json`.
Esquema de telemetría: `static-recovery-v1`.
| Disposición | Recuento exacto |
|---|---:|
| Compatible | 0 |
| No compatible | 0 |
| Erróneo | 0 |
| Motivo de rechazo | Recuento exacto |
|---|---:|
| _ninguno_ | 0 |
<!-- BENCH:recovery:end -->
### Evidencia Bloom de bigramas
<!-- BENCH:bloom:start -->
Esquema de evidencia: `bloom-evidence-v1`.
| Campo | Resultado exacto |
|---|---|
| Corpus | `samsung-creddata-fx-record-spans-v1` |
| Revisión del corpus | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| SHA-256 del corpus | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| SHA-256 del fixture | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| SHA-256 del ejecutable | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| SHA-256 del corpus de detectores del espacio de trabajo | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| Digest de detectores del escáner | `8d789251e092959f` |
| SHA-256 del corpus de detectores | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| Rechazo Bloom | **110/51794 (0.21%)**; 51684 admitidos |
| Disponibilidad externa | 51794 medidos; 0 explícitamente no disponibles de 51794 declarados; motivos: |
| Hallazgos habilitados vs omitidos | **IDÉNTICOS**; 977/977 hallazgos |
| SHA-256 de identidad de hallazgo | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| Densidad/estado Bloom | 1793/65536 ranuras; `healthy`; saturación en 39322 |
La identidad del hallazgo vincula detector, archivo, línea, intervalo de bytes y SHA-256 de la credencial; las credenciales en texto plano nunca se registran.
<!-- BENCH:bloom:end -->
Reproducción: `make -C benchmarks canonical KEYHOG_BIN=/absolute/path/to/keyhog`
vuelve a ejecutar el conjunto exacto de ejecuciones mirror de KeyHog, Betterleaks, Kingfisher, Nosey Parker, TruffleHog y
Titus, incluido el diferencial Bloom de CredData vinculado al ejecutable,
`make -C benchmarks report` regenera las tablas anteriores y
`benchmarks/reports/`. Consulta [`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/main/benchmarks/README.md)
para los corpus (mirror, territorio local de competidores, Samsung/CredData) y la
matriz de backend/caché/daemon/SO/GPU.
## Trabajadores daemon masivos con GPU
El daemon masivo Unix opcional mantiene caliente un escáner compilado y su
estado de backend calibrado. Los escaneos del sistema de archivos local envían solo la raíz canónica y
los metadatos de la política de fuentes; el daemon lee y procesa por lotes los archivos en su propio
proceso. Las fuentes Git, binarias, remotas y de nube que requieren credenciales
del lado del cliente usan marcos de fragmentos acotados protegidos.```sh
# Terminal 1
keyhog calibrate-autoroute --policy default
keyhog daemon start --mass
# Terminal 2, after the daemon prints its ready line
keyhog scan --daemon=mass /srv/inventory/team-a \
--format json-envelope --output team-a.json
keyhog daemon stop
--daemon=mass es una ruta obligatoria. Nunca reintenta dentro del proceso. Cada lote está limitado a 8 MiB y 1.024 fragmentos, independientemente del tamaño total de la entrada. Preserva el envoltorio de cobertura, el estado de salida y el recibo de ejecución en terminal para cada partición del inventario.
Consulta ciclo de vida del daemon, enrutamiento y recibos y particionado del inventario.
Triage de credenciales en todo el sistema```sh
sudo keyhog scan-system --space 50G sudo keyhog scan-system --include-network --output system-findings.json
`scan-system` es una auditoría acotada del host local, no un reemplazo para la partición de inventarios de repositorios o nube. Se limita por el total de bytes escaneados en lugar de por ruta: `--space` es el límite máximo, y los sistemas de archivos montados en red se omiten a menos que pases `--include-network`. Revisa el comportamiento de montajes, sistemas de archivos de red, límite de espacio y privilegios antes de ejecutarlo. Consulta
[triaje a nivel de sistema](https://santhreal.github.io/keyhog/guides/system-wide-triage.html).
## Bloquear escaneos locales sensibles
`--lockdown` de Linux es un modo de protección de procesos con cierre a prueba de fallos:```sh
keyhog scan . --daemon=off --lockdown
Bloquea la memoria actual y futura, desactiva los volcados de núcleo y la caché incremental, permanece en el proceso y rechaza la verificación, la salida en texto plano, el modo rápido y los modificadores que reducen la integridad. Falla en plataformas no compatibles o si la capacidad de memoria bloqueada es insuficiente. Consulta endurecimiento y manejo de datos.
Usar KeyHog como biblioteca de Rust```rust
use keyhog_core::{Chunk, ChunkMetadata, RawMatch}; use keyhog_scanner::CompiledScanner;
let detectors = keyhog_core::load_embedded_detectors_or_fail()?; let scanner = CompiledScanner::compile(detectors)?; let findings = scanner.scan(&Chunk { data: "TOKEN=sk_live_EXAMPLE…".into(), metadata: ChunkMetadata::default(), })?; let report_safe: Vec<_> = findings.iter().map(RawMatch::to_redacted).collect();
Los métodos de biblioteca predeterminados son referencias de CPU portátiles deterministas. Los
métodos explícitos de backend devuelven errores tipados en lugar de terminar el proceso o
sustituir silenciosamente otro motor. Los fragmentos y coincidencias sin procesar pueden contener
texto plano. Conviértelos con `RawMatch::to_redacted`, o usa los valores finales
`VerifiedFinding`, antes de los límites de JSON, registros, disco o red.
La [guía de arquitectura](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) define la propiedad de los crates,
los contratos de backend, los recibos de recuperación, los ayudantes de fuentes y los límites
seguros de reporte. La documentación de Rust a nivel de crate posee la API completa.
## Configurar la política con precedencia explícita
La política del repositorio vive en `.keyhog.toml`:```toml
verify = false
[scan]
severity = "high"
incremental = true
[system]
gpu = "auto"
El orden de resolución es: valores predeterminados integrados, configuración del usuario, configuración del repositorio, entorno cuando está documentado, y luego anulaciones explícitas de la CLI. Las claves desconocidas y las combinaciones inválidas fallan antes del escaneo. Ejecuta keyhog config --effective para inspeccionar la política resuelta sin exponer las credenciales del proxy. Las entradas posteriores a expires fallan en la carga de la lista de permitidos antes del escaneo.
Consulta configuración y precedencia para cada clave y variables de entorno para credenciales y entradas de tiempo de ejecución.
Arquitectura
KeyHog mantiene la orquestación en el borde y el comportamiento del dominio en bibliotecas:```text sources -> scanner -> suppression/evidence -> reporting -> optional verifier CLI and Action own process, transport, and exit semantics.
Detector definitions remain data under `detectors/`. `keyhog-core` owns
detector and finding types, `keyhog-scanner` owns matching and execution
backends, `keyhog-sources` owns input acquisition, `keyhog-verifier` owns live
checks, and `keyhog-cli` owns operator workflows.
Start with the [architecture guide](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) for the repository
map, dependency direction, bytes-to-finding pipeline, routing ownership, and
profiling entrypoints.
## Inspect and extend the installation```sh
keyhog detectors --search aws --verbose
keyhog explain aws-access-key
keyhog backend --autoroute --json
keyhog completion zsh
La referencia de CLI
enumera cada comando, bandera, valor predeterminado generado y estado de salida. Usa
keyhog --help y keyhog <comando> --help para la versión exacta instalada.
Contribuciones
- ¿Nuevo detector? Coloca un TOML en
detectors/, abre un PR. La guía para contribuidores (CONTRIBUTING.md) contiene el esquema y un ejemplo práctico. - ¿Error / secreto no detectado / falso positivo? Abre un issue con la
forma del secreto redactado y el id del detector; cada informe se convierte en
una prueba permanente bajo
crates/scanner/tests/contracts/. - ¿Comportamiento de lanzamiento? Cada ejecución exitosa de CI en
mainincrementa la versión de parche, genera registros de cambios y publica las seis crates en crates.io. Añade un fragmento opcional bajochanges/para una nota precisa. La guía de lanzamiento cubre la transacción automática y la recuperación de subidas fallidas. - ¿Problema de seguridad en KeyHog en sí? No abras un issue público;
usa informe privado de vulnerabilidades de GitHub.
Si ese formulario no está disponible, envía un correo a
[email protected]; PGP no es necesario.
Registro de cambios. Issues abiertos.
Créditos
KeyHog se basa en trabajos previos de escaneo de secretos. Ideas tomadas de:
- TruffleHog: amplitud de detectores y semántica de verificación
- Betterleaks: eficiencia de tokens y supresión de falsos positivos
- Titus: ergonomía de escaneo y calibración de severidad
Gracias a estos proyectos y a sus contribuidores.
Licencia
Licencia: MIT OR Apache-2.0.
Términos: MIT y Apache-2.0. Esta doble licencia cubre el código y los TOML de detectores. El uso comercial, la incrustación, los forks y los servicios alojados están permitidos bajo cualquiera de las dos licencias.
Historial de estrellas
Generado a partir de observaciones UTC del recuento público de estrellas de GitHub. El repositorio almacena el primer punto y cada transición posterior del recuento. Las reejecuciones del mismo día reemplazan el punto de ese día, y los recuentos sin cambios no generan ningún commit.