Torna agli aggiornamenti
New releaseJul 28, 2026

keyhog v0.5.47

Scanner di segreti open-source in Rust

Condividi

KeyHog GPU-accelerated open-source secret scanner for code, Git history, cloud, containers, browser assets, and CI

KeyHog su crates.io  Documentazione KeyHog  CI  MIT OR Apache-2.0  Stelle GitHub e cronologia stelle di proprietà del repository

Sito web · Documentazione · Architettura · Motore GPU Vyre

KeyHog: scanner di segreti accelerato via GPU per codice, cloud e CI

KeyHog è uno scanner di segreti open-source in Rust che trova e verifica chiavi API, token, password e credenziali esposte in codice sorgente, cronologia Git, container, storage cloud, asset del browser, contenuti collaborativi e sistemi in esecuzione.

La maggior parte degli scanner di segreti si ferma alle corrispondenze regex su CPU in un checkout del repository. KeyHog combina 934 rilevatori specifici per servizio, decodifica per credenziali occultate, prove contestuali con soppressione, verifica live tramite provider, ed esecuzione di prima classe su CUDA, Metal e WGPU tramite Vyre. La calibrazione misura ogni backend CPU puro-Rust idoneo, Hyperscan/SIMD e GPU. Il routing automatico utilizza quindi il percorso più veloce con parità dimostrata per l'esatto host e classe di carico di lavoro.

La GPU è un backend realeScansiona la superficie d'attacco effettivaSepara il segnale dal rumoreAgisci sul risultato
CUDA, Metal nativo e WGPU sono peer misurati, non una catena di fallback silenziosa.Scansiona cronologia Git, layer Docker, archivi, bucket cloud, source map, WASM, catture HAR, raccolte Git ospitate e interi sistemi.Decodifica base64, hex, URL, protobuf, multilinea e configurazione strutturata prima di applicare prove, soppressione di esempi e baseline.Verifica le credenziali idonee con le API dei provider, emetti SARIF o envelope strutturati e preserva copertura esatta e semantica di uscita.
cargo install --locked keyhog
keyhog scan .
<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="Scansione KeyHog che mostra gravità, evidenza, file e riga, rimedio, risultati e stato di copertura" width="900" />
</p>

## Uno scanner di segreti costruito attorno alla GPU

KeyHog non affida poche espressioni regolari a un generico compute shader.
Il suo percorso GPU è basato su [Vyre](https://github.com/santhreal/vyre), un
substrato di calcolo GPU in Rust sviluppato insieme a KeyHog. I trigger dei
rilevatori vengono compilati in tabelle immutabili residenti nella GPU. Lotti
di sorgenti limitati producono posizioni di corrispondenza complete per la
stessa pipeline di conferma, soppressione, evidenza e reporting utilizzata
dai percorsi CPU e Hyperscan.

- **Tre peer GPU fisici.** CUDA, Metal nativo e WGPU portabile vengono
  acquisiti, misurati e riportati in modo indipendente.
- **Parità esatta dei risultati.** La calibrazione rifiuta un candidato la cui
  identità di rilevamento differisce dal percorso di riferimento. Una risposta
  errata più veloce non entra mai nella tabella di routing.
- **Evidenza persistente del percorso.** KeyHog registra il binario, il corpus
  dei rilevatori, la configurazione, la classe di carico di lavoro, l'host,
  l'acceleratore, il driver e l'evidenza temporale misurata. Le scansioni
  normali non eseguono benchmark nel percorso critico.
- **Esecuzione residente.** I worker daemon mantengono caldi lo stato compilato
  dei rilevatori e dell'acceleratore per lotti ripetuti di file, archivi,
  cronologia, remoti e cloud.
- **Nessuna via di fuga CPU nascosta.** Un acceleratore selezionato
  esplicitamente che non riesce a inizializzarsi o a eseguire il dispatch
  fallisce in modo visibile invece di restituire risultati CPU sotto
  un'etichetta GPU.

L'installazione predefinita da crates.io utilizza il percorso CPU portabile
puramente in Rust, quindi funziona su un host Rust pulito. Abilita i tre peer
GPU senza acquisire Hyperscan:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu

Abilita il peer regex SIMD Hyperscan o Vectorscan:```sh cargo install --locked keyhog --no-default-features --features portable,simd

Esegui la diagnostica del backend di produzione, quindi ispeziona la route misurata:```sh
keyhog backend --self-test
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json

La guida al backend documenta le tabelle residenti, il modello di dispatch limitato, il contratto di parità e le prove riproducibili di crossover.

Per iniziare

Installa ed esegui la tua prima scansione

I due comandi sopra installano l'ultima release di crates.io e scansionano l'albero corrente con il percorso portabile puramente in Rust.

Blocca un ambiente CI a una release esatta con cargo install --locked --version '=0.5.86' keyhog. KeyHog richiede Rust 1.89 o successivo. Consulta la guida all'installazione per i profili GPU, Hyperscan, CI, portabile e di build da sorgente.

KeyHog esce con codice 1 quando un risultato blocca la policy di evidenza attiva. La policy predefinita blocca i risultati likely e confirmed mantenendo visibili i risultati review con uscita 0; --evidence-policy paranoid blocca ogni livello. Esamina il livello di evidenza esatto, il codice motivo, il file, la riga, il rilevatore e la correzione di ogni risultato. Altri codici diversi da zero descrivono errori di input, di sistema, di verifica o di copertura; consulta il riferimento dei codici di uscita.

Il contratto di processo completo è:

UscitaSignificato
0 successoNessun risultato blocca la policy di evidenza attiva e non si è verificato alcun errore di copertura. I risultati di livello review possono rimanere visibili con la policy predefinita.
1 risultati bloccantiAlmeno un risultato blocca la policy di evidenza attiva, ma nessuno è stato confermato come live.
2 errore dell'operatoreCorreggi gli argomenti, la configurazione, il corpus di rilevatori o l'input correggibile dall'operatore.
3 errore di sistemaRipara o riprova l'esecutore. Include I/O di basso livello, servizio daemon fatale, cache incrementale ed errori SIMD selezionati esplicitamente.
4 errore di salute/self-testUn controllo di salute doctor o backend --self-test non era sano.
10 credenziali liveAlmeno una credenziale è stata confermata come live.
11 panico dello scannerScarta il risultato della scansione perché lo stato dello scanner non è affidabile.
12 errore GPU richiestoUn percorso GPU selezionato o richiesto esplicitamente non ha potuto essere eseguito.
13 copertura incompletaUna sorgente richiesta è fallita o la copertura dell'input era incompleta e nessun esito di risultato ha avuto precedenza.
130 interrottoSIGINT o Ctrl-C ha interrotto il processo.

Filtra, formatta, blocca:

Crea una baseline prima di usarla come filtro:```sh keyhog scan . --create-baseline .keyhog-baseline.json keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json

Il primo comando salva le findings esaminate ed esce con `0` senza stamparle.
Esegui il commit di quel file, poi usa il secondo comando per segnalare solo le nuove identità delle findings. Una voce di baseline corrisponde al rilevatore e al valore della credenziale, mai al percorso del file, quindi spostare un segreto registrato non fa fallire il gate, ma ruotarlo sì. Le credenziali modificate e la copertura incompleta restano visibili. Il percorso completo, incluse le partizioni dei monorepo, è [Fail only on new secrets](https://santhreal.github.io/keyhog/workflows/ci.html#fail-only-on-new-secrets).

Per la scansione successiva, usa il [recipes cookbook](https://santhreal.github.io/keyhog/recipes.html) o i comandi copiabili in [Choose the right workflow](#choose-the-right-workflow). Puoi scansionare la cronologia Git, le immagini dei container, i bucket cloud, le raccolte di repository, gli URL e un'intera macchina senza cambiare strumento.

### Proteggi i repository per scansioni pre-commit rapide

Registra un repository con il daemon perpetuo di KeyHog per la rilevazione rapida dei segreti pre-commit (richiede Unix; su Windows usa `keyhog scan` in-process):```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

Vedi la guida alla guardia perpetua e il workflow pre-commit per la configurazione completa, il ciclo di vita della macchina a stati e l'automazione degli hook.

Aggiungilo 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

L'azione esegue la scansione dell'albero estratto, fallisce in caso di risultati a livello `high` o `critical`, carica il SARIF su Code Scanning e conserva il report come artefatto del workflow. Anche gli errori di installazione, copertura, backend e pubblicazione del report causano il fallimento del job.

Consulta la [guida all'azione GitHub](https://santhreal.github.io/keyhog/workflows/github-action.html) per input, output, adozione della baseline, partizioni monorepo, verifica e comportamento in caso di errore. Usa la [guida CI](https://santhreal.github.io/keyhog/workflows/ci.html) per GitLab, CircleCI, Jenkins, Buildkite e job shell generici. Usa la [guida alla scansione di massa](https://santhreal.github.io/keyhog/guides/mass-scanning.html) per organizzazioni di repository, gruppi Git ospitati, bucket cloud e inventari partizionati.

## Superfici di scansione che altri strumenti trattano come prodotti separati

KeyHog esegue la scansione dei byte nel punto in cui possono fuoriuscire, non solo dei file sorgente tracciati. Usa un report per ogni confine, così la CI conserva la copertura esatta e lo stato di errore.

| Superficie di esposizione | Esempio |
|---|---|
| Artefatto del pacchetto finale | Esegui `npm pack`, poi scansiona il `.tgz` prodotto con `keyhog scan package.tgz`. L'espansione dell'archivio controlla file generati, source map, fixture e metadati assenti dall'albero sorgente previsto. |
| Applicazione browser distribuita | `keyhog scan --url https://app.example.com/assets/app.js` segue la decodifica limitata di JavaScript, source-map, WASM e risposte senza trasformare lo scanner in un crawler illimitato. |
| Issue GitHub, pull request, discussioni, wiki e gist | `keyhog scan --github-collaboration owner/repo --github-all` esegue la scansione di ogni superficie collaborativa al di fuori del checkout. |
| Configurazione di agenti AI e MCP | `keyhog scan ~/.config ~/.claude ~/.codex` applica lo stesso pipeline di rilevamento, decodifica, evidenza e report alla configurazione locale degli strumenti. |
| Layer di immagini container | `keyhog scan --docker-image registry.example.com/team/app:v1` esegue la scansione del contenuto dell'immagine che verrà eseguito, inclusi i file introdotti durante la build. |
| Inventari di oggetti cloud | `keyhog scan --s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` conserva la paginazione del provider, gli oggetti e la copertura dei limiti di byte nel report del terminale. |
| Intero host di sviluppo | `sudo keyhog scan-system --space 50G` rileva i filesystem montati e la cronologia Git raggiungibile sotto un budget di archiviazione rigido. |

Questi percorsi condividono un unico contratto di rilevamento e report. Un errore specifico della sorgente non può trasformarsi silenziosamente in una scansione locale più ristretta.

## Scegli il workflow giusto

Scegli prima il confine della sorgente. Un preset cambia il lavoro di rilevamento, mentre un backend cambia l'esecuzione. Nessuno dei due estende una scansione dell'albero di lavoro alla cronologia Git, a un inventario del provider, allo storage cloud o a un audit dell'host.

Non esiste una scorciatoia onesta per `scan everything`. Una revisione completa del patrimonio esegue i confini pertinenti di seguito come job separati e conserva ogni report `json-envelope` con il suo codice di uscita grezzo.

| Esigenza | Inizia con | Throughput e riutilizzo | Confine di copertura |
|---|---|---|---|
| Feedback locale rapido | `keyhog scan . --fast --incremental` | Riutilizza gli hash dei file invariati. Il preset fast salta il lavoro di decodifica, entropia e ML. | Esegui la policy predefinita prima del merge perché fast è intenzionalmente più ristretto. |
| Scansione completa del repository | `keyhog scan .` | `auto` calibrato e default worker basato su core CPU. Aggiungi `--incremental` per scansioni ripetute dello stesso albero attendibile. | Solo file correnti. Non aggiunge la cronologia Git. |
| Gate di commit staged | `keyhog scan --git-staged` o `keyhog hook install` | Legge i blob esatti dell'indice, quindi le modifiche non staged non possono cambiare il risultato. | Solo contenuto staged. Esegui una scansione dell'albero di lavoro separatamente quando i byte locali non staged contano. |
| Guardia perpetua del repository | `keyhog guard add . --mode repo` poi `keyhog guard status .` | Registro root residente nel daemon con macchina a 7 stati, cache di attestazione pulita e tracciamento dell'identità della policy. | Richiede un daemon in esecuzione. La guardia integra, non sostituisce, le scansioni staged e dell'albero di lavoro. |
| Gate per pull request GitHub | `santhreal/keyhog@v0` | L'azione installa, esegue la scansione, pubblica SARIF e un artefatto, poi conserva lo stato di KeyHog. | Un percorso estratto. Usa la scansione dell'inventario del provider per un'organizzazione. |
| GitLab, Jenkins, Buildkite o shell CI | `keyhog scan . --format json-envelope --output keyhog.json` | Conserva il report e il codice di uscita su successo, risultati ed errori. Usa `--git-diff <base>` solo per un gate esplicitamente più ristretto sulle righe modificate. | I byte presenti nel checkout o il diff selezionato. |
| Adotta un repository con risultati noti | Crea `.keyhog-baseline.json`, committalo, poi esegui la scansione con `--baseline .keyhog-baseline.json`. | Le identità esistenti restano visibili nella baseline mentre solo i nuovi risultati fanno fallire il gate. | Una baseline non sopprime credenziali modificate o copertura incompleta. |
| Recupero Git ricorsivo | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | Calibra la policy deep una volta per classe di worker. Esegui in-process. | Un repository. `--git-history` copre solo l'ascendenza del checkout corrente, quindi un branch mai estratto viene mancato senza gap di copertura; `--git-blobs` raggiunge anche blob orfani, commit rimossi con amend, stash, note, messaggi di tag annotati e ref impacchettati. |
| Ispezione di container o archivi | `keyhog scan --docker-image registry/app:v1` o `keyhog scan incoming/` | Conserva un report envelope così i membri saltati, corrotti, crittografati, non sicuri o sovradimensionati restano visibili. | Solo l'immagine o il percorso filesystem selezionato e i formati annidati supportati. |
| Ispezione di URL, risposta o HAR | `keyhog scan --url https://api.example.com/config` o `keyhog scan capture.har` | Usa limiti di sorgente limitati e conserva l'envelope del terminale. | Solo risposte recuperate o voci di cattura. Non è un crawler. |
| Inventario di organizzazione o cloud | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | Partiziona per provider, proprietario o bucket. Esegui partizioni indipendenti in concorrenza con un report e uno stato ciascuna. | Un inventario del provider selezionato per job. I limiti di paginazione o oggetti restano confini di copertura. |
| Conferma se i risultati idonei sono attivi | `keyhog scan . --verify` | La concorrenza del provider e i controlli di frequenza sono separati dai worker dello scanner. | Invia richieste derivate dalle credenziali agli endpoint dichiarati del provider. Non tutti i rilevatori supportano la verifica. |
| Scansione sanitaria dell'intero host | `sudo keyhog scan-system --space 50G` | Usa tutti i core CPU per impostazione predefinita e scansiona la cronologia Git rilevata dopo i dati del filesystem. | Filesystem montati locali. I mount di rete sono opt-in e il tetto di spazio è rigido. |
| Directory, cronologia, archivio, remoto o inventario cloud con GPU su Unix | Calibra l'autoroute, avvia `keyhog daemon start --mass`, poi esegui `keyhog scan --daemon=mass <SOURCE>`. | Trasmette batch limitati attraverso un worker compilato CPU, Hyperscan, CUDA, Metal o WGPU. Aggiungi `--incremental` per alberi filesystem caldi invariati. La ricevuta del terminale riporta totale esatto e batch GPU, chunk, byte, quota GPU e throughput. | Baseline, verifica, lockdown, preset, overlay e altre modifiche alla policy dello scanner vengono rifiutate prima dell'acquisizione. Lo stato incrementale si applica solo alle radici filesystem locali del daemon. |

### Scansiona ogni confine di sorgente supportato

Usa un comando per confine. Conserva un report `json-envelope` e lo stato di uscita grezzo per ogni partizione dell'inventario.

| Sorgente o caso d'uso | Comando |
|---|---|
| Più radici locali | `keyhog scan services/api services/web deploy/` |
| File modificati in continuazione | `keyhog watch services/api deploy/` |
| Byte staged, righe modificate, cronologia raggiungibile o blob | `keyhog scan --git-staged`, `--git-diff main`, `--git-history .` o `--git-blobs .` |
| Binari nativi e stringhe firmware | `keyhog scan --binary firmware.bin` (una scansione di directory semplice salta i binari ed esce comunque con `0`) |
| Archivi e sorgenti compressi | `keyhog scan incoming/` (i membri supportati si espandono automaticamente) |
| Layer di immagini Docker | `keyhog scan --docker-image registry/app:v1` |
| JavaScript, source map, WASM o risposta di un endpoint | `keyhog scan --url https://api.example.com/config` |
| Catture di richieste e risposte HTTP | `keyhog scan capture.har` |
| Issue GitHub, pull request, discussioni, wiki e gist | `keyhog scan --github-collaboration owner/repo --github-all` |
| Inventari GitHub, GitLab o Bitbucket | `--github-org ORG`, `--gitlab-group GROUP` o `--bitbucket-workspace WORKSPACE` |
| Inventari S3, GCS o Azure Blob | `--s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` |
| Uno stream limitato da un altro strumento | `producer \| keyhog scan --stdin` (usa `set -o pipefail` così un producer fallito fa emergere il proprio errore, non una scansione a zero byte) |

Una scansione di directory semplice non legge i binari nativi. Ognuno diventa un gap di copertura `binary (estensione o sniff del contenuto)`, la scansione esce comunque con `0` e `--no-default-excludes` non lo cambia, quindi passa `--binary` quando gli artefatti compilati sono in scope. Quel flag richiede una build con la feature `binary`, che l'installazione crates.io predefinita ha e la feature snella `ci` non ha.

L'estrazione di binari nativi riporta credenziali complete che soddisfano il contratto di forma esplicito di un rilevatore nominato. Sopprime frammenti brevi di prefisso e stringhe generiche a forma di assegnazione dalle sezioni dati compilate perché quei byte non conservano il contesto sorgente.

Il recupero degli endpoint è limitato e schermato da SSRF. Non è un crawler. Gli endpoint cloud privati e l'inoltro delle credenziali richiedono i loro flag di fiducia espliciti. I token del provider appartengono alle variabili d'ambiente documentate, non agli argomenti di processo.

Usa il [selettore di workflow](https://santhreal.github.io/keyhog/capabilities.html) per i dettagli di sorgente e policy, la [guida all'azione GitHub](https://santhreal.github.io/keyhog/workflows/github-action.html) per il gate di repository mantenuto, la [guida CI diretta](https://santhreal.github.io/keyhog/workflows/ci.html) per report durevoli e gestione dell'uscita, e la [guida alla scansione di massa](https://santhreal.github.io/keyhog/guides/mass-scanning.html) per partizionamento e aggregazione. Il [ricettario](https://santhreal.github.io/keyhog/recipes.html) copre container, archivi, URL, contenuto collaborativo GitHub e sorgenti cloud.

### Velocità e concorrenza senza congetture

Inizia con le impostazioni predefinite. Cargo non può eseguire KeyHog dopo `cargo install`, quindi esegui i comandi seguenti una volta dopo aver installato una build Cargo multi-backend e di nuovo dopo che host, binario, corpus di rilevatori, driver o classi di carico di lavoro cambiano:```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
ControlUsalo perMantieni questo invariante
--backend auto calibratoSelezione di routine di CPU, Hyperscan o GPU.Un backend esplicito è un override diagnostico, non un default più veloce.
--threads <N>Riservare capacità CPU su un runner condiviso. Gli host dedicati normalmente dovrebbero lasciarlo non impostato così KeyHog usa i core disponibili.Ogni valore deve essere positivo. Più processi KeyHog concorrenti possiedono ciascuno un pool di worker, quindi dividi il budget dell'host tra le partizioni.
--reader-threads <N>Pipeline di storage misurate dove il lavoro del reader, non la scansione, è il collo di bottiglia.Il default deriva dal pool di worker di scansione. Lascialo non impostato finché il profiling non mostra un collo di bottiglia del reader.
--incremental e --incremental-cache <PATH>Scansioni ripetute dello stesso albero fidato.Non condividere un singolo indice tra repository non correlati o job non fidati.
Partizioni di provider o repositoryScansione concorrente dell'estate e retry indipendenti.Preserva un envelope terminale e un codice di uscita grezzo per partizione. Non concatenare i risultati e scartare lo stato di copertura.
--verify-concurrency, --verify-rate e --verify-batchLimitare i controlli live del provider indipendentemente dalla scansione dei file.La verifica invia richieste derivate dalle credenziali. I rate limit del provider, non il numero di CPU, governano questa concorrenza.
Daemon di massaFlussi di directory, cronologia, archivi, remoti o cloud su scala TB su un singolo worker Unix.Ogni frame è limitato a 8 MiB e 1.024 chunk. Il daemon serializza lo stato dei frammenti e restituisce una ricevuta esatta di esecuzione CPU/GPU.
--fast, default, --deep o --precisionSelezionare una policy esplicita di costo di rilevamento e recall.Questi preset si escludono a vicenda e cambiano la copertura. Non sono manopole di velocità intercambiabili.

Ispeziona la policy risolta con keyhog config --effective. Usa --profile per misurare le fasi fisse dello scanner e l'esecuzione completa dell'operatore prima di modificare i controlli di reader, batch o profondità del canale. Il report a basso overhead registra sorgente, backend, cache, workload, thread, input, transizioni di stato, tempo CPU, picco di memoria, SHA-256 esatto del binario, SHA-256 delle funzionalità abilitate, tripletta target, profilo di build, compilatore, allocatore, SHA-256 del backend collegato, SHA-256 del corpus del rilevatore, BLAKE3 dei rilevatori abilitati, BLAKE3 del piano compilato, provenienza del rilevatore con hash, BLAKE3 completo della configurazione risolta, BLAKE3 della policy di prestazioni, preset, stato di protezione applicato, adapter di sorgente, BLAKE3 della sorgente-target con hash, BLAKE3 della partizione sorgente con hash, byte grezzi della sorgente, fanout delle unità sorgente, byte derivati dalla decodifica, byte completati dal dispatch del backend e bucket stabili di dimensione/fanout. I domini di byte che il loro adapter di sorgente non può ancora distinguere rimangono esplicitamente non disponibili invece di diventare zeri misurati. Il report non registra contenuto della sorgente, valori delle credenziali, percorsi grezzi, URL grezzi o valori grezzi di configurazione. Usa --perf-trace solo per contatori diagnostici costosi per pattern e backend. Lascia i controlli avanzati della pipeline non impostati a meno che una misurazione riproducibile sul worker di destinazione non mostri un miglioramento.

Per una scansione ricorrente completa del repository:```sh keyhog scan . --incremental
--format json-envelope --output keyhog.json

Per un runner condiviso in cui al job vengono allocati quattro worker scanner e un
worker reader:```sh
keyhog scan . --threads 4 --reader-threads 1 \
  --format json-envelope --output keyhog.json

Il secondo comando è un budget di risorse, non un ottimo universale. Misura l'host di destinazione prima di scegliere conteggi espliciti di worker.

Per il recupero profondo e il triage a livello di sistema, usa le loro guide dedicate perché la loro copertura e le regole di completamento differiscono da una scansione normale del repository.

Benchmark dello scanner per segreti

Questi pannelli confrontano la policy di rilevamento, le richieste di esecuzione CPU e GPU, il comportamento della cache incrementale e le richieste del daemon caldo. Ogni valore è generato dallo snapshot del benchmark controllato. Lo snapshot vincola la versione dello scanner, il digest dell'eseguibile, il digest del rilevatore, il corpus, l'host e il timestamp di esecuzione. Usa le prove complete del benchmark per la provenienza dei concorrenti e il richiamo per categoria.

Accuratezza del rilevamento

KeyHog KeyHog v0.5.70 ha scansionato il corpus mirror: 15.000 fixture, 3.000 positivi etichettati e 2.431.242 byte di input. Il manifest della chiave di risposta è stato escluso dall'albero di scansione. La riga usa la policy predefinita sul percorso esplicito Hyperscan/SIMD su AMD Ryzen 9 9950X 16-Core Processor.

PrecisioneRichiamoF1Veri positiviFalsi positiviFalsi negativi
0.96510.90270.93282.70898292

L'albero sorgente tracciato era pulito.

Percorsi di esecuzione, preset e cache

Misurato su AMD Ryzen 9 9950X 16-Core Processor con NVIDIA GeForce RTX 5090, 32 core logici, 15.000 fixture, 3.000 positivi etichettati e 2.431.242 byte di input. Scanner: KeyHog v0.5.70. L'albero sorgente tracciato era pulito.

Scansione completa per percorso di esecuzione

Tutte le righe usano la policy di rilevamento predefinita con cache incrementale e daemon disattivato. La riga automatica registra la policy richiesta, ma il risultato del benchmark non vincola il percorso persistente selezionato, quindi non è una prova di routing. Le righe GPU includono l'acquisizione e l'avvio completo dello scanner su questo piccolo corpus; non sono misurazioni di crossover del kernel GPU.

Percorso richiestoWallThroughputRSS di piccoF1
Hyperscan/SIMD860 ms2,70 MB/s416 MiB0.9328
CPU Pure-Rust903 ms2,57 MB/s509 MiB0.9328
CUDA2,03 s1,14 MB/s963 MiB0.9328
WGPU1,97 s1,18 MB/s1264 MiB0.9328
Automatico1,46 s1,59 MB/s634 MiB0.9328

Policy di rilevamento su Hyperscan/SIMD

Il percorso, la cache, lo stato del daemon, il corpus e l'host rimangono fissi. I preset cambiano il lavoro di rilevamento, quindi confronta precisione e richiamo oltre al tempo.

PolicyWallPrecisioneRichiamoF1Risultati
Veloce737 ms0.97000.88370.92482.738
Predefinita860 ms0.96510.90270.93282.816
Profonda861 ms0.96450.90670.93472.845
Precisione849 ms0.95900.63970.76742.001

Rerun incrementale caldo

Il benchmark popola l'indice Merkle BLAKE3, quindi cronometra la seconda scansione identica. Il piccolo albero sintetico cambia poco perché l'avvio dello scanner domina; misura il tuo repository prima di affermare un'accelerazione.

Policy predefinita Hyperscan/SIMDWallThroughputRSS di picco
Cache disattivata860 ms2,70 MB/s416 MiB
Cache incrementale calda617 ms3,76 MB/s457 MiB

Richieste del daemon caldo

Un file regolare deterministico da 8 MiB (sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5) è stato scansionato una volta in-process e una volta tramite un daemon di proprietà dopo una richiesta di riscaldamento. Il tempo del daemon è la richiesta del client; l'RSS del daemon appartiene al server residente.

Percorso esplicitoIn processDaemon caldoCaldo / one-shotRSS in-processRSS daemon
Hyperscan/SIMD323 ms106 ms0,33×63 MiB74 MiB
CPU Pure-Rust278 ms109 ms0,39×62 MiB66 MiB
CUDA1,65 s232 ms0,14×674 MiB666 MiB
WGPU1,33 s237 ms0,18×596 MiB600 MiB

Queste righe coprono il percorso caldo a file singolo. Il percorso di massa accetta anche batch limitati di directory e sorgenti remote; il suo percorso incrementale del filesystem è misurato separatamente.

Scalabilità di CPU, lettore, storage, dimensione e partizione

Generato da make -C benchmarks readme-scaling da benchmarks/reports/readme-scaling.json. L'harness ha eseguito 3 prove misurate dopo 1 riscaldamento con routing simd esplicito e daemon disattivato. La scalabilità dei worker usa una cache di pagina client calda per isolare il lavoro della CPU. Le righe di lettore, dimensione del corpus, storage e partizione richiedono l'evizione della pagina pulita con posix_fadvise dove la piattaforma lo supporta; lo snapshot registra la policy su ogni riga. Ogni carico di lavoro è byte-deterministico e privo di risultati.

Host: AMD Ryzen 9 9950X 16-Core Processor, 32 core logici effettivi, 94.140 MiB di RAM, Linux 6.17.0-19-generic. Evidenza: clean, binario 274b045489c4.

Scalabilità dei worker di scansione

WorkerThread del lettoreWall medianoWall p95ThroughputSpeedupEfficienzaRSS di picco mediano
1auto8.134,4 ms8.135,4 ms7,9 MiB/s1,00x100,0%47,0 MiB
2auto4.398,2 ms6.906,7 ms14,6 MiB/s1,85x92,5%50,3 MiB
4auto2.392,6 ms6.245,2 ms26,7 MiB/s3,40x85,0%57,2 MiB
8auto1.816,3 ms6.117,6 ms35,2 MiB/s4,48x56,0%63,4 MiB
16auto1.428,5 ms6.867,7 ms44,8 MiB/s5,69x35,6%78,4 MiB
32auto1.862,8 ms5.939,1 ms34,4 MiB/s4,37x13,6%126,7 MiB

Scalabilità del lettore del filesystem

Worker di scansioneThread del lettoreWall medianoWall p95ThroughputRelativo a 1 lettoreRSS di picco mediano
3211.898,7 ms1.922,1 ms33,7 MiB/s1,00x121,3 MiB
3221.881,7 ms1.887,5 ms34,0 MiB/s1,01x122,8 MiB
3241.874,2 ms1.891,2 ms34,1 MiB/s1,01x126,6 MiB
3281.873,2 ms1.885,7 ms34,2 MiB/s1,01x133,4 MiB
32161.856,8 ms1.868,5 ms34,5 MiB/s1,02x153,9 MiB
32321.877,3 ms1.880,4 ms34,1 MiB/s1,01x179,5 MiB

Scalabilità della dimensione del corpus

CorpusFileByte esattiWall medianoWall p95ThroughputRSS di picco mediano
piccolo2568 MiB869,9 ms886,1 ms9,2 MiB/s111,1 MiB
medio1.02464 MiB1.859,9 ms1.874,8 ms34,4 MiB/s126,3 MiB
grande2.048256 MiB5.214,9 ms5.321,7 ms49,1 MiB/s137,1 MiB

Scalabilità dello storage

Classe di storageFilesystemID dispositivoWall medianoWall p95ThroughputRelativo al primo storageRSS di picco mediano
workspaceext4663051.847,4 ms1.863,4 ms34,6 MiB/s1,00x127,0 MiB
local-temptmpfs1161.870,8 ms1.887,3 ms34,2 MiB/s0,99x124,9 MiB

Scalabilità delle partizioni concorrenti

ProcessiWorker per processoWorker aggregatiFile totaliByte totaliWall medianoThroughput aggregatoSpeedupRSS di picco sommato mediano
132322568 MiB871,9 ms9,2 MiB/s1,00x111,5 MiB
2163251216 MiB404,6 ms39,5 MiB/s4,31x134,0 MiB
48321.02432 MiB571,1 ms56,0 MiB/s6,11x227,2 MiB

Queste righe sono misurazioni, non costanti di tuning universali. Esegui il generatore sull'host e sullo storage di destinazione. Usa il punto di flesso in cui il throughput smette di migliorare, quindi riserva CPU e memoria per il runner CI o il livello di orchestrazione.

Riproduci tutti e quattro i gruppi di benchmark con make -C benchmarks readme-matrix. Il comando misura la matrice richiesta e fallisce se qualsiasi riga richiesta di CPU, Hyperscan, CUDA, Metal, WGPU, preset, cache, daemon, thread, lettore, storage, dimensione del corpus o partizione non è disponibile. Usa make -C benchmarks readme-matrix-check per verificare che entrambi gli snapshot, i report e il README concordino.

Scegli una configurazione di scansione

Inizia con la policy predefinita e il routing automatico calibrato. Cambia un solo asse solo quando il flusso di lavoro lo richiede:

Flusso di lavoroPolicy di rilevamentoEsecuzione e riutilizzoControllo aggiuntivo
Prima scansione del repositoryPredefinitaauto calibrato; --daemon=autoRivedi tutti i risultati prima di aggiungere soppressioni.
Albero locale ripetuto o scansione CIPredefinitaauto calibrato; --incrementalPersisti la cache incrementale solo tra scansioni dello stesso albero affidabile.
Ciclo di feedback breve--fastauto calibrato; --incremental opzionaleAccetta una copertura ridotta di decodifica, entropia e ML. Esegui la policy predefinita prima del merge.
Recupero a richiamo più alto--deepIn processDeep è mutuamente esclusivo con fast e precision, e non è idoneo al daemon.
Inventario ampio a basso rumore--precisionIn process per raccolte di repository, cronologia e sorgenti cloudIl preset alza i livelli minimi di confidenza e disabilita la scoperta dell'entropia. Può perdere credenziali a confidenza inferiore.
Inventario di directory, cronologia, archivio, remoto o cloud su scala TB su UnixPredefinitakeyhog daemon start --mass, poi --daemon=massI batch rimangono limitati a 8 MiB e 1.024 chunk. Conserva il report di copertura del terminale e la ricevuta di esecuzione GPU.
Validazione live delle credenzialiPredefinitaIn processAggiungi --verify esplicitamente. La verifica invia richieste derivate dalle credenziali ai provider.
Scansione Linux senza swapPredefinita più --lockdownIn process; cache incrementale disabilitataLockdown rifiuta la verifica, i segreti in chiaro, la modalità veloce e gli switch che riducono la completezza.

--fast, --deep e --precision sono preset di rilevamento mutuamente esclusivi. --lockdown è una modalità di esecuzione fail-closed, non un quarto preset. I valori espliciti di --backend sono override diagnostici e di benchmark. Non sostituiscono l'evidenza persistente del percorso più veloce-corretto usata dal routing automatico. Vedi Configurazione, calibrazione autoroute, daemon e scansioni calde, e hardening per i contratti completi.

Come funziona KeyHog

KeyHog compila i suoi 934 rilevatori in un piano condiviso di trigger ed estrazione, decodifica le codifiche annidate prima del matching e applica punteggio, evidenza e soppressione per rilevatore. La CPU Pure-Rust (cpu-fallback) è sempre disponibile. Il percorso Hyperscan (simd-regex) usa Hyperscan quando quella funzionalità è presente; le build portabili usano il percorso CPU. CUDA (gpu-cuda-region-presence), Metal (gpu-metal-region-presence) e WGPU (gpu-wgpu-region-presence) sono pari in un selettore autoroute basato su prove, non una catena di fallback. La calibrazione misura ogni peer idoneo e persiste il percorso più veloce i cui risultati completi corrispondono al percorso di riferimento per l'esatto binario, lo stato di rilevatore e configurazione, host, acceleratore e classe di carico di lavoro. Una decisione mancante, obsoleta, non valida o incompleta ferma una scansione automatica prima dell'esecuzione e segnala come ricalibrare. Non sostituisce mai silenziosamente un altro backend.

Vedi Architettura per la mappa del repository, la direzione delle dipendenze, la pipeline da byte a risultato e i punti di ingresso di profilazione. Vedi Backend e routing per i contratti di esecuzione e Calibrazione autoroute per parità, identità del carico di lavoro, ciclo di vita della cache e procedure di riparazione.

Documentazione completa: santhreal.github.io/keyhog - installazione, prima scansione, formati di output, interni di rilevamento, soppressioni, verifica, integrazione pre-commit + CI, riferimento CLI, autoroute, codici di uscita, variabili d'ambiente e contributi. Sorgente in docs/.


Installa KeyHog

Installa la release corrente di crates.io:```sh cargo install keyhog --locked

Costruisci il checkout del repository quando ti serve una modifica non ancora rilasciata:```sh
cargo install --path crates/cli --locked

Conferma la build installata:```sh keyhog --version --full keyhog doctor

Use la [guida all'installazione](https://santhreal.github.io/keyhog/install.html) per
i requisiti della toolchain Rust, i profili di funzionalità e le dipendenze
runtime specifiche per piattaforma.


## Cosa rileva

934 rilevatori incorporati con validazione offline e companion di proprietà del rilevatore:

- **Provider cloud:** AWS (access key + secret + verifica STS),
  Azure (subscription key, storage account key, SAS), GCP (service account,
  API key), Cloudflare, Heroku, Vercel, Supabase.
- **Processori di pagamento:** Stripe, Braintree, Razorpay, Paddle, Plaid,
  Square e PayPal, con controlli di proprietà del rilevatore e companion
  opzionali o obbligatori. Una Razorpay key secret richiede la key ID adiacente.
- **Forge di sorgenti:** PAT GitHub (con checksum CRC32), token GitLab,
  password app Bitbucket, token npm (con checksum), Gitea / Forgejo
  / Codeberg.
- **Auth / SSO:** Okta, Auth0, Clerk, JumpCloud, Kinde.
- **Comunicazioni:** Slack, Discord, Twilio, SendGrid, Postmark, Mailgun,
  Resend, Loops.
- **AI / ML:** OpenAI (sk-/sk-proj-), Anthropic, Google AI Studio,
  Cohere, Mistral, HuggingFace, Replicate. Le credenziali dell'organizzazione
  HuggingFace includono sia la forma corrente `hf_` sia i token legacy `api_org_`.
- **Gestori di password:** chiavi segrete dell'account 1Password (`A3-` seguite da
  cinque o sei componenti segmentate alfanumeriche maiuscole).
- **Database:** stringhe di connessione Postgres, MongoDB Atlas, Supabase
  service-role, PlanetScale, Neon, Turso, MySQL, URL Redis.
- **Generico + scoperta per entropia:** `API_KEY=<blob-ad-alta-entropia>` rileva
  credenziali senza un rilevatore nominato, limitato da soglie di entropia
  per contesto + punteggio ML.
- **Materiale crittografico:** chiavi private RSA / EC / SSH, blocchi privati
  PGP, segreti di firma JWT.

Ogni rilevatore è distribuito come [file TOML](https://github.com/santhreal/keyhog/blob/main/detectors) (dati, non codice):
metadati del servizio, pattern regex, parole chiave, validatori offline, policy
di entropia e ML, campi companion e gestore di verifica. Aggiungere un nuovo
rilevatore è una singola modifica TOML revisionabile;
la [guida per i contributori](https://github.com/santhreal/keyhog/blob/main/CONTRIBUTING.md) ne illustra il percorso.

`keyhog explain <id>` scarica la specifica completa di qualsiasi rilevatore:
pattern, parole chiave, endpoint di verifica, oltre a una guida alla rotazione
e alla remediation passo-passo associata al servizio, così un risultato non è
mai una scatola nera:

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: dump della specifica del rilevatore (pattern ghp_[A-Za-z0-9]{36}, parola chiave, URL di verifica) seguito dalla guida alla rotazione GitHub e dalla remediation passo-passo" width="860" />
</p>

Consulta la creazione e l'ispezione dei rilevatori nel
[riferimento dei rilevatori](https://github.com/santhreal/keyhog/blob/main/docs/src/detectors.md), oppure interroga il corpus
installato con `keyhog detectors --search <termine> --verbose`.

## Perché maggiore recall, meno falsi positivi

- **Scansione con decodifica.** Manifest `Secret` Kubernetes, notebook
  Jupyter, payload JWT, env avvolti in base64, valori Helm e blob `auth:`
  di docker-config. Il preprocessore strutturato tratta le azioni Helm
  bilanciate come valori inerti a tempo di render e chiude i delimitatori
  Jupyter mancanti a fine file, così i byte letterali e le celle di codice
  complete restano coperti. Decodifica i valori strutturati in posizione e
  fornisce il testo in chiaro a ogni rilevatore a valle. I rilevatori non
  devono reimplementare ciascuno la decodifica. Le scansioni con decodifica
  abilitata recuperano anche espressioni JavaScript XOR di byte-array e
  AES-256-CBC senza effetti collaterali quando tutto il materiale di recupero
  è incorporato, incluse le rigide wrapper CryptoJS/OpenSSL con passphrase
  salata. KeyHog non esegue mai il sorgente.
- **Riassemblaggio multilinea.** Continuazione `"sk-proj-" + \` in JavaScript,
  stringhe multilinea YAML, continuazione con backslash nei Makefile, output
  templati Helm / Jinja, tutto riassemblato prima del matching regex.
- **Validazione companion.** I companion obbligatori limitano i rilevatori ad
  alto rumore. Una API key Twilio senza il suo API secret viene saltata. I
  companion opzionali arricchiscono il punteggio delle evidenze o la verifica.
  Il rilevamento dell'access-key AWS non richiede il suo secret, ma il secret è
  necessario per la verifica live.
- **Risoluzione tra rilevatori.** Il TOML del rilevatore può richiedere,
  rifiutare o assorbire risultati delimitati di un altro rilevatore. La
  risoluzione resta deterministica rispetto all'ordine di input, e target
  non validi, contraddizioni o cicli di dipendenza fanno fallire la compilazione
  del corpus.
- **Verdetti delle evidenze.** Ogni risultato porta un livello esatto `review`,
  `likely` o `confirmed` più un codice motivo canonico. Checksum intrinseco o
  prova grammaticale, companion obbligatori e verifica live producono evidenze
  confermate; una forma forte specifica del fornitore in un ruolo che contiene
  credenziali produce evidenze probabili; ancoraggi deboli, assegnazioni
  generiche, candidati solo per entropia e contesti di test, documentazione,
  regole o identificatori restano evidenze di review.
  Un `evidence_score` opzionale integra il verdetto quando misurato.
  La soglia predefinita `0.40` controlla il pavimento di confidenza interno
  dello scanner e resta configurabile con `--min-confidence`.
- **Calibrazione bayesiana per rilevatore.** `keyhog calibrate --fp generic-api-key`
  scrive un posteriore Beta(α,β). Le scansioni lo usano solo quando
  `--calibration-cache` o `[system].calibration_cache` punta a quel file, così
  la regolazione della confidenza è esplicita e riproducibile invece di
  dipendere da stato di cache host casuale.

## Prestazioni

Usa l'harness riproducibile in [`benchmarks/`](https://github.com/santhreal/keyhog/blob/main/benchmarks) per confrontare
KeyHog, Betterleaks, Kingfisher, Nosey Parker, TruffleHog e Titus sotto un
unico contratto di punteggio. L'harness esclude il manifest ground-truth da
ogni albero di scansione. Le tabelle generate restano vuote finché non esistono
esecuzioni con schema corrente. Esegui `make -C benchmarks report` dopo la
misurazione. Non modificare a mano le tabelle generate.

### Classifica di rilevamento

<!-- BENCH:leaderboard:start -->
#### Corpus mirror sintetico a forma SecretBench
Corpus: **mirror** - 15000 fixture, 3000 positivi etichettati, 2.431.242 byte. Ogni scanner è stato valutato in modo identico (regola di sovrapposizione SecretBench); il manifest con la chiave di risposta è escluso dall'albero di scansione.

| Rank | Scanner | F1 | Precision | Recall | Findings | Wall | Peak RSS |
|---|---|---|---|---|---|---|---|
| 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 di regole homefield / home-turf dei concorrenti
Corpus: **homefield** - 2399 fixture raccolte dalle suite di regole ground-truth dei concorrenti (regole Betterleaks e Kingfisher; 1.057 positivi etichettati, 1.342 negativi, 772.974 byte). Valutazione incrociata tra strumenti sul ground truth dei concorrenti.

| Rank | Scanner | F1 | Precision | Recall | Findings | Wall | Peak RSS |
|---|---|---|---|---|---|---|---|
| 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 |
### Provenienza dei risultati

| Scanner | Versione scanner / digest eseguibile | Identità corpus | Identità host | Data esecuzione |
|---|---|---|---|---|
| KeyHog | versione: KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Set rilevatori: 926 (926-4168e2c6c93a16ca)<br>Target di build: x86_64-linux<br>Versione modello ML: moe-v1-246a05b92bec9aa3<br>Scheda modello ML: registrata 2026-07-15; feature 55; F1 sintetico 0.971 / P 0.945 / R 0.999; F1 reale 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; rilevatori a recall zero 2/32; differenziale a sei scanner non disponibile<br>SHA-256 eseguibile: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | versione: trufflehog 3.96.0<br>SHA-256 eseguibile: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | versione: kingfisher 1.94.0<br>SHA-256 eseguibile: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | versione: Titus v1.1.20 (porting Go di NoseyParker)<br>SHA-256 eseguibile: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | versione: noseyparker 0.24.0 Configurazione di build: Timestamp build:    2025-05-08T21:11:15.600909923Z Timestamp commit:   2025-05-08T17:04:47.000000000-04:00 Ramo commit:      HEAD SHA commit:         61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Funzionalità Cargo:     color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release Debug:              true Ottimizzazione:       3 Target triple:      x86_64-unknown-linux-gnu Sistema di build: OS:                 Ubuntu Versione OS:         Linux (Ubuntu 22.04) Vendor CPU:         AuthenticAMD Marca CPU:          AMD EPYC 7763 64-Core Processor Core CPU:          2 Versione rustc:      1.86.0 Canale rustc:      stable Host triple rustc:  x86_64-unknown-linux-gnu Data commit rustc:  2025-03-31 SHA commit rustc:   05f9846f893b09a1be1fc8560e33fc3c815cfecb Versione LLVM rustc: 19.1<br>SHA-256 eseguibile: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | versione: betterleaks versione dev<br>SHA-256 eseguibile: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 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 -->

### Velocità e memoria

<!-- BENCH:perf:start -->
#### Corpus mirror sintetico a forma SecretBench

| Scanner | Config | Corpus | Wall | Throughput | Peak RSS |
|---|---|---|---|---|---|
| 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 di regole homefield / home-turf dei concorrenti

| Scanner | Config | Corpus | Wall | Throughput | Peak RSS |
|---|---|---|---|---|---|
| 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 -->

### Confronto recall per categoria

<!-- BENCH:gaps:start -->
_Solo fetta di recall diagnostico. Precision complessiva e F1 restano il contratto di confronto; i falsi positivi sono conteggiati nelle loro categorie con punteggio._

| Categoria | KeyHog P/R/F1 | KeyHog TP/FN | Miglior concorrente P/R/F1 | Gap di 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 -->

### Telemetria di recupero statico delimitato

<!-- BENCH:recovery:start -->
Esecuzione selezionata: scanner **KeyHog** `KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Set rilevatori: 926 (926-4168e2c6c93a16ca)<br>Target di build: x86_64-linux<br>Versione modello ML: moe-v1-246a05b92bec9aa3<br>Scheda modello ML: registrata 2026-07-15; feature 55; F1 sintetico 0.971 / P 0.945 / R 0.999; F1 reale 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; rilevatori a recall zero 2/32; differenziale a sei scanner non disponibile`; corpus **mirror** (15.000 fixture, 2.431.242 byte); generato `2026-08-11T01:29:39Z`; artefatto `mirror-keyhog-simd-nocache-nodaemon-full.json`.

Schema telemetria: `static-recovery-v1`.

| Disposizione | Conteggio esatto |
|---|---:|
| Supportato | 0 |
| Non supportato | 0 |
| Errato | 0 |

| Motivo di rifiuto | Conteggio esatto |
|---|---:|
| _nessuno_ | 0 |
<!-- BENCH:recovery:end -->

### Evidenze Bloom bigram

<!-- BENCH:bloom:start -->
Schema evidenze: `bloom-evidence-v1`.

| Campo | Risultato esatto |
|---|---|
| Corpus | `samsung-creddata-fx-record-spans-v1` |
| Revisione corpus | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| SHA-256 corpus | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| SHA-256 fixture | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| SHA-256 eseguibile | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| SHA-256 corpus rilevatori workspace | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| Digest rilevatori scanner | `8d789251e092959f` |
| SHA-256 corpus rilevatori | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| Rifiuto Bloom | **110/51794 (0.21%)**; 51684 ammessi |
| Disponibilità esterna | 51794 misurati; 0 esplicitamente non disponibili su 51794 dichiarati; motivi:  |
| Risultati abilitati vs bypassati | **IDENTICI**; 977/977 risultati |
| SHA-256 identità risultato | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| Densità/stato Bloom | 1793/65536 slot; `healthy`; saturazione a 39322 |

L'identità del risultato vincola rilevatore, file, riga, intervallo di byte e SHA-256 della credenziale; le credenziali in chiaro non vengono mai registrate.
<!-- BENCH:bloom:end -->

Riproduci: `make -C benchmarks canonical KEYHOG_BIN=/percorso/assoluto/keyhog`
riesegue l'esatto set di esecuzioni mirror di KeyHog, Betterleaks, Kingfisher,
Nosey Parker, TruffleHog e Titus, incluso il differenziale Bloom CredData
vincolato all'eseguibile; `make -C benchmarks report` rigenera le tabelle sopra
e `benchmarks/reports/`. Vedi [`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/main/benchmarks/README.md)
per i corpora (mirror, home-turf dei concorrenti, Samsung/CredData) e la
matrice backend/cache/daemon/OS/GPU.

## Worker daemon di massa con supporto GPU

Il daemon Unix di massa opzionale mantiene caldo uno scanner compilato e il suo
stato backend calibrato. Le scansioni del filesystem locale inviano solo la
radice canonica e i metadati della policy delle sorgenti; il daemon legge e
raggruppa i file nel proprio processo. Le sorgenti Git, binarie, remote e cloud
che richiedono credenziali lato client usano frame di chunk delimitati protetti.```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 è una route obbligatoria. Non esegue mai nuovi tentativi in-process. Ogni batch è limitato a 8 MiB e 1.024 chunk, indipendentemente dalla dimensione totale dell'input. Preserva l'envelope di copertura, lo stato di uscita e la ricevuta di esecuzione terminale per ogni partizione dell'inventario.

Vedi ciclo di vita del daemon, routing e ricevute e partizionamento dell'inventario.

Triage delle credenziali a livello di sistema```sh

sudo keyhog scan-system --space 50G sudo keyhog scan-system --include-network --output system-findings.json

`scan-system` è un audit locale limitato all'host, non un sostituto per la partizione dell'inventario di repository o
cloud. Si limita in base al totale di byte scansionati piuttosto
che al percorso: `--space` è il tetto massimo, e i filesystem montati in rete vengono
saltati a meno che non si passi `--include-network`. Rivedi il comportamento di mount, filesystem di rete,
tetto di spazio e privilegi prima di eseguirlo. Vedi
[triage a livello di sistema](https://santhreal.github.io/keyhog/guides/system-wide-triage.html).

## Blocca le scansioni locali sensibili

`--lockdown` di Linux è una modalità di protezione dei processi fail-closed:```sh
keyhog scan . --daemon=off --lockdown

Blocca la memoria corrente e futura, disabilita i core dump e la cache incrementale, rimane in processo e rifiuta la verifica, l'output in chiaro, la modalità rapida e le opzioni che riducono la completezza. Fallisce su piattaforme non supportate o in caso di capacità di memoria bloccata insufficiente. Vedi hardening e gestione dei dati.

Usa KeyHog come libreria 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();

I metodi predefiniti della libreria sono riferimenti CPU portabili e deterministici. I
metodi espliciti del backend restituiscono errori tipizzati invece di terminare il processo o
sostituire silenziosamente un altro motore. I chunk grezzi e le corrispondenze possono contenere
testo in chiaro. Convertili con `RawMatch::to_redacted`, oppure usa i valori finali
`VerifiedFinding`, prima dei confini JSON, log, disco o rete.

La [guida all'architettura](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) definisce la proprietà delle crate,
i contratti dei backend, le ricevute di recupero, gli helper delle sorgenti e i confini sicuri
per la reportistica. La documentazione Rust a livello di crate possiede l'API completa.

## Configurare la policy con precedenza esplicita

La policy del repository risiede in `.keyhog.toml`:```toml
verify = false

[scan]
severity = "high"
incremental = true

[system]
gpu = "auto"

L'ordine di risoluzione è: impostazioni predefinite integrate, configurazione utente, configurazione del repository, variabili d'ambiente dove documentate, e infine override espliciti da CLI. Chiavi sconosciute e combinazioni non valide causano un errore prima della scansione. Esegui keyhog config --effective per ispezionare la policy risolta senza esporre le credenziali del proxy. Le voci oltre expires fanno fallire il caricamento dell'allowlist prima della scansione.

Consulta configurazione e precedenza per ogni chiave e variabili d'ambiente per credenziali e input di runtime.

Architettura

KeyHog mantiene l'orchestrazione al confine e il comportamento di dominio nelle librerie:```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

Il riferimento CLI elenca ogni comando, flag, valore predefinito generato e stato di uscita. Usa keyhog --help e keyhog <comando> --help per la versione esatta installata.

Contribuire

  • Nuovo rilevatore? Inserisci un file TOML in detectors/, apri una PR. La guida per i contributori (CONTRIBUTING.md) contiene lo schema e un esempio completo.
  • Bug / segreto mancato / falso positivo? Apri una segnalazione con la forma del segreto oscurato e l'id del rilevatore; ogni segnalazione diventa una fixture di test permanente in crates/scanner/tests/contracts/.
  • Comportamento delle release? Ogni esecuzione CI riuscita su main incrementa la versione patch, genera i changelog e pubblica tutte e sei le crate su crates.io. Aggiungi un frammento opzionale in changes/ per una nota precisa. La guida alle release copre la transazione automatica e il recupero da upload falliti.
  • Problema di sicurezza in KeyHog stesso? Non aprire una segnalazione pubblica; usa la segnalazione privata di vulnerabilità di GitHub. Se quel modulo non è disponibile, scrivi a [email protected]; PGP non è richiesto.

Changelog. Segnalazioni aperte.

Crediti

KeyHog si basa su precedenti lavori di scansione dei segreti. Idee prese in prestito da:

  • TruffleHog: ampiezza dei rilevatori e semantica di verifica
  • Betterleaks: efficienza dei token e soppressione dei falsi positivi
  • Titus: ergonomia della scansione e calibrazione della gravità

Grazie a questi progetti e ai loro contributori.

Licenza

Licenza: MIT OR Apache-2.0.

Termini: MIT e Apache-2.0. Questa doppia licenza copre il codice e i TOML dei rilevatori. L'uso commerciale, l'incorporamento, i fork e i servizi ospitati sono consentiti con entrambe le licenze.


Storico delle stelle

Storico delle stelle GitHub di KeyHog da osservazioni di proprietà del repository

Generato da osservazioni UTC del conteggio pubblico delle stelle di GitHub. Il repository memorizza il primo punto e ogni successiva transizione del conteggio. Le riesecuzioni nello stesso giorno sostituiscono il punto di quel giorno, e i conteggi invariati non generano alcun commit.

Categorie