Назад к обновлениям
New releaseJul 28, 2026

keyhog v0.5.47

Сканер секретов с открытым исходным кодом на Rust

Поделиться

KeyHog — GPU-ускоряемый сканер секретов с открытым исходным кодом для кода, истории Git, облака, контейнеров, браузерных ресурсов и CI

KeyHog на crates.io  Документация KeyHog  CI  MIT OR Apache-2.0  Звёзды GitHub и история звёзд, принадлежащая репозиторию

Веб-сайт · Документация · Архитектура · GPU-движок Vyre

KeyHog: GPU-ускоряемый сканер секретов для кода, облака и CI

KeyHog — это сканер секретов с открытым исходным кодом на Rust, который находит и проверяет утёкшие API-ключи, токены, пароли и учётные данные в исходном коде, истории Git, контейнерах, облачных хранилищах, браузерных ресурсах, корпоративном контенте и работающих системах.

Большинство сканеров секретов останавливаются на CPU-сопоставлении регулярных выражений в копии репозитория. KeyHog объединяет 934 детектора, специфичных для конкретных сервисов, сквозное декодирование скрытых учётных данных, контекстно-зависимые доказательства и подавление, проверку в реальном времени у провайдеров, а также полноценное исполнение через CUDA, Metal и WGPU с помощью Vyre. Калибровка измеряет каждый подходящий чисто-Rust CPU, Hyperscan/SIMD и GPU бэкенд. Автоматическая маршрутизация затем использует самый быстрый маршрут с доказанным паритетом для конкретного хоста и класса рабочей нагрузки.

GPU — это реальный бэкендСканируйте фактическую поверхность атакиОтделяйте сигнал от шумаДействуйте по результату
CUDA, нативный Metal и WGPU — это измеренные равноправные участники, а не молчаливая резервная цепочка.Сканируйте историю Git, слои Docker, архивы, облачные корзины, source maps, WASM, HAR-захваты, размещённые коллекции Git и целые системы.Декодируйте base64, hex, URL, protobuf, многострочные и структурированные конфигурации перед применением доказательств, подавления примеров и базовых линий.Проверяйте подходящие учётные данные через API провайдеров, создавайте SARIF или структурированные конверты и сохраняйте точную семантику покрытия и выхода.
cargo install --locked keyhog
keyhog scan .
<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="Сканирование KeyHog с указанием серьёзности, доказательств, файла и строки, способов устранения, результатов и статуса покрытия" width="900" />
</p>

## Сканер секретов, построенный вокруг GPU

KeyHog не передаёт несколько регулярных выражений в универсальный вычислительный шейдер.
Его GPU-путь построен на [Vyre](https://github.com/santhreal/vyre) — Rust GPU
вычислительной подложке, разработанной вместе с KeyHog. Триггеры детекторов компилируются в
неизменяемые таблицы, размещаемые в GPU. Ограниченные исходные пакеты дают полные позиции
совпадений для того же конвейера подтверждения, подавления, сбора доказательств и отчётности,
который используется в CPU- и Hyperscan-маршрутах.

- **Три физических GPU-пира.** CUDA, нативный Metal и портативный WGPU
  подключаются, измеряются и учитываются независимо.
- **Точное совпадение результатов.** Калибровка отклоняет кандидата, чья
  идентичность находки отличается от эталонного маршрута. Более быстрый неверный ответ никогда не попадает
  в таблицу маршрутизации.
- **Постоянные доказательства маршрута.** KeyHog записывает бинарный файл, корпус детекторов,
  конфигурацию, класс рабочей нагрузки, хост, ускоритель, драйвер и измеренные временные
  показатели. Обычные сканирования не выполняют бенчмаркинг на горячем пути.
- **Резидентное выполнение.** Фоновые рабочие процессы демона поддерживают скомпилированные детекторы и состояние
  ускорителя в тёплом виде для повторяющихся пакетов файлов, архивов, истории, удалённых и облачных источников.
- **Нет скрытого запасного пути на CPU.** Явно выбранный ускоритель, который не может
  инициализироваться или выполнить диспетчеризацию, завершается с видимой ошибкой, а не возвращает находки CPU под
  меткой GPU.

Установка crates.io по умолчанию использует портативный чисто-Rust CPU-маршрут, поэтому она работает
на чистом Rust-хосте. Включите три GPU-пира без приобретения Hyperscan:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu

Включите пира Hyperscan или Vectorscan SIMD regex:```sh cargo install --locked keyhog --no-default-features --features portable,simd

Запустите диагностику продакшен-бэкенда, затем проверьте измеренный маршрут:```sh
keyhog backend --self-test
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json

Руководство по бэкендам описывает резидентные таблицы, ограниченную модель диспетчеризации, контракт паритета и воспроизводимые перекрёстные доказательства.

Начало работы

Установка и запуск первого сканирования

Две команды выше устанавливают последний релиз crates.io и сканируют текущее дерево с помощью переносимого чисто-Rust маршрута.

Зафиксируйте CI-окружение на одной точной версии с помощью cargo install --locked --version '=0.5.86' keyhog. KeyHog требует Rust 1.89 или новее. См. руководство по установке для профилей GPU, Hyperscan, CI, переносимого и сборки из исходников.

KeyHog завершается с кодом 1, когда находка блокирует активную политику доказательств. Политика по умолчанию блокирует находки уровня likely и confirmed, оставляя находки уровня review видимыми с кодом выхода 0; --evidence-policy paranoid блокирует все уровни. Проверяйте точный уровень доказательств каждой находки, код причины, файл, строку, детектор и способ устранения. Другие ненулевые коды описывают ошибки ввода, системы, проверки или покрытия; см. справочник кодов выхода.

Полный контракт процесса выглядит так:

Код выходаЗначение
0 успехНи одна находка не блокирует активную политику доказательств, и ошибок покрытия не произошло. Находки уровня review могут оставаться видимыми при политике по умолчанию.
1 блокирующие находкиПо крайней мере одна находка блокирует активную политику доказательств, но ни одна не была подтверждена как активная.
2 ошибка оператораИсправьте аргументы, конфигурацию, корпус детекторов или ввод, исправимый оператором.
3 системная ошибкаИсправьте или повторите запуск. Сюда входят низкоуровневые ошибки ввода-вывода, фатальные ошибки службы демона, инкрементального кэша и явно выбранные ошибки SIMD.
4 сбой проверки работоспособности/самотестированияПроверка работоспособности doctor или backend --self-test завершилась неудачно.
10 активные учётные данныеПо крайней мере одно учётное данное было подтверждено как активное.
11 паника сканераОтбросьте результат сканирования, так как состоянию сканера доверять нельзя.
12 требуемый сбой GPUЯвно выбранный или требуемый путь GPU не смог выполниться.
13 неполное покрытиеЗапрошенный источник завершился с ошибкой или покрытие ввода было неполным, и ни один результат находки не имел приоритета.
130 прерваноSIGINT или Ctrl-C прервали процесс.

Фильтр, формат, шлюз:

Создайте базовый уровень перед использованием его в качестве фильтра:```sh keyhog scan . --create-baseline .keyhog-baseline.json keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json

Первая команда сохраняет просмотренные находки и завершается с кодом `0`, не выводя
их. Зафиксируйте этот файл, затем используйте вторую команду, чтобы сообщать только о новых
идентификаторах находок. Базовая запись сопоставляется по детектору и значению учётных данных,
но никогда по пути к файлу, поэтому перемещение записанного секрета не приводит к сбою проверки, а вот
его ротация — приводит. Изменённые учётные данные и неполное покрытие остаются видимыми.
Полный путь, включая разделы монорепозитория, описан в разделе [Сбой только при новых
секретах](https://santhreal.github.io/keyhog/workflows/ci.html#fail-only-on-new-secrets).

Для следующего сканирования используйте [поваренную книгу
рецептов](https://santhreal.github.io/keyhog/recipes.html) или копируемые
команды из раздела [Выберите подходящий рабочий процесс](#choose-the-right-workflow). Вы можете
сканировать историю Git, образы контейнеров, облачные хранилища, коллекции репозиториев,
URL-адреса и целую машину, не меняя инструменты.

### Защита репозиториев для быстрых pre-commit сканирований

Зарегистрируйте репозиторий в постоянном демоне KeyHog для быстрого
обнаружения секретов перед коммитом (требуется Unix; в Windows используйте внутрипроцессный `keyhog scan`):```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

См. руководство по постоянной защите и рабочий процесс pre-commit для полной конфигурации, жизненного цикла конечного автомата и автоматизации хуков.

Добавьте его в GitHub Actions

Создайте .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

Действие сканирует извлечённое дерево, завершается с ошибкой при обнаружении находок уровня `high` или `critical`, загружает SARIF в Code Scanning и сохраняет отчёт как артефакт рабочего процесса. Сбои установки, покрытия, бэкенда и публикации отчёта также приводят к провалу задания.

Используйте [руководство по GitHub Action](https://santhreal.github.io/keyhog/workflows/github-action.html) для получения информации о входных данных, выходных данных, принятии базовой линии, разбиении монорепозиториев, проверке и поведении при сбоях. Используйте [руководство по CI](https://santhreal.github.io/keyhog/workflows/ci.html) для GitLab, CircleCI, Jenkins, Buildkite и универсальных shell-заданий. Используйте [руководство по массовому сканированию](https://santhreal.github.io/keyhog/guides/mass-scanning.html) для организации репозиториев, размещённых Git-групп, облачных хранилищ и сегментированных инвентаризаций.

## Поверхности сканирования, которые другие инструменты считают отдельными продуктами

KeyHog сканирует байты на границе, где они могут утечь, а не только отслеживаемые исходные файлы. Используйте один отчёт на границу, чтобы CI сохранял точное покрытие и состояние сбоя.

| Поверхность воздействия | Пример |
|---|---|
| Финальный артефакт пакета | Выполните `npm pack`, затем просканируйте полученный `.tgz` с помощью `keyhog scan package.tgz`. Распаковка архива проверяет сгенерированные файлы, source maps, фикстуры и метаданные, отсутствующие в ожидаемом дереве исходников. |
| Развёрнутое браузерное приложение | `keyhog scan --url https://app.example.com/assets/app.js` выполняет ограниченное декодирование JavaScript, source-map, WASM и ответов, не превращая сканер в неограниченный краулер. |
| GitHub issues, pull requests, обсуждения, вики и gists | `keyhog scan --github-collaboration owner/repo --github-all` сканирует все поверхности совместной работы за пределами извлечённого дерева. |
| Конфигурация AI-агентов и MCP | `keyhog scan ~/.config ~/.claude ~/.codex` применяет тот же конвейер детекторов, декодирования, доказательств и отчётов к локальной конфигурации инструментов. |
| Слои контейнерных образов | `keyhog scan --docker-image registry.example.com/team/app:v1` сканирует содержимое образа, которое будет запущено, включая файлы, добавленные во время сборки. |
| Инвентаризации облачных объектов | `keyhog scan --s3-bucket BUCKET`, `--gcs-bucket BUCKET` или `--azure-container-url URL` сохраняет пагинацию провайдера, объекты и ограничения по байтам в терминальном отчёте. |
| Весь хост разработки | `sudo keyhog scan-system --space 50G` обнаруживает смонтированные файловые системы и достижимую историю Git в рамках жёсткого бюджета хранилища. |

Эти маршруты используют единый контракт обнаружения и отчётности. Сбой, специфичный для источника, не может незаметно превратиться в более узкое локальное сканирование.

## Выберите правильный рабочий процесс

Сначала выберите границу источника. Пресет меняет работу обнаружения, а бэкенд — способ выполнения. Ни то, ни другое не расширяет сканирование рабочего дерева до истории Git, инвентаризации провайдера, облачного хранилища или аудита хоста.

Не существует честного ярлыка `scan everything`. Полный обзор окружения запускает соответствующие границы ниже как отдельные задания и сохраняет каждый отчёт `json-envelope` с его исходным кодом выхода.

| Потребность | Начните с | Пропускная способность и повторное использование | Граница покрытия |
|---|---|---|---|
| Быстрая локальная обратная связь | `keyhog scan . --fast --incremental` | Повторно использует хэши неизменённых файлов. Быстрый пресет пропускает работу по декодированию, энтропии и ML. | Запустите политику по умолчанию перед слиянием, потому что быстрый режим намеренно уже. |
| Полное сканирование репозитория | `keyhog scan .` | Калиброванный `auto` и стандартное количество рабочих процессов по числу ядер CPU. Добавьте `--incremental` для повторных сканирований одного и того же доверенного дерева. | Только текущие файлы. История Git не добавляется. |
| Шлюз для staged-коммитов | `keyhog scan --git-staged` или `keyhog hook install` | Читает точные blob-объекты индекса, поэтому незакоммиченные правки не могут изменить результат. | Только staged-содержимое. Запустите сканирование рабочего дерева отдельно, если важны локальные незакоммиченные байты. |
| Постоянная защита репозитория | `keyhog guard add . --mode repo`, затем `keyhog guard status .` | Демон-резидентный корневой реестр с 7-состояний машиной, чистым кэшем аттестаций и отслеживанием идентичности политики. | Требуется запущенный демон. Guard дополняет, а не заменяет сканирование staged и рабочего дерева. |
| Шлюз GitHub pull request | `santhreal/keyhog@v0` | Action устанавливает, сканирует, публикует SARIF и артефакт, затем сохраняет статус KeyHog. | Один извлечённый путь. Для организации используйте сканирование инвентаризации провайдера. |
| GitLab, Jenkins, Buildkite или shell CI | `keyhog scan . --format json-envelope --output keyhog.json` | Сохраняйте отчёт и код выхода при успехе, находках и ошибках. Используйте `--git-diff <base>` только для явно более узкого шлюза изменённых строк. | Байты, присутствующие в извлечённом дереве, или выбранный diff. |
| Принятие репозитория с известными находками | Создайте `.keyhog-baseline.json`, закоммитьте его, затем сканируйте с `--baseline .keyhog-baseline.json`. | Существующие идентичности остаются видимыми в базовой линии, а шлюз проваливают только новые находки. | Базовая линия не подавляет изменённые учётные данные или неполное покрытие. |
| Рекурсивное восстановление Git | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | Калибруйте глубокую политику один раз на класс рабочих процессов. Запускайте в процессе. | Один репозиторий. `--git-history` покрывает только предков текущего извлечённого дерева, поэтому ветка, которую вы никогда не извлекали, пропускается без пробела покрытия; `--git-blobs` также достигает висячих blob-объектов, коммитов, удалённых через amend, stash, заметок, сообщений аннотированных тегов и упакованных ссылок. |
| Проверка контейнера или архива | `keyhog scan --docker-image registry/app:v1` или `keyhog scan incoming/` | Сохраняйте отчёт-конверт, чтобы пропущенные, повреждённые, зашифрованные, небезопасные или слишком большие элементы оставались видимыми. | Только выбранный образ или путь файловой системы и поддерживаемые вложенные форматы. |
| Проверка URL, ответа или HAR | `keyhog scan --url https://api.example.com/config` или `keyhog scan capture.har` | Используйте ограниченные лимиты источника и сохраняйте терминальный конверт. | Только полученные ответы или записи захвата. Это не краулер. |
| Инвентаризация организации или облака | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | Разделяйте по провайдеру, владельцу или bucket. Запускайте независимые разделы параллельно с одним отчётом и статусом для каждого. | Одна выбранная инвентаризация провайдера на задание. Лимиты пагинации или объектов остаются границами покрытия. |
| Подтверждение, активны ли подходящие находки | `keyhog scan . --verify` | Параллелизм провайдера и контроль скорости отделены от рабочих процессов сканера. | Отправляет запросы, производные от учётных данных, на объявленные конечные точки провайдера. Не каждый детектор поддерживает проверку. |
| Проверка здоровья всего хоста | `sudo keyhog scan-system --space 50G` | По умолчанию использует все ядра CPU и сканирует обнаруженную историю Git после данных файловой системы. | Локальные смонтированные файловые системы. Сетевые монтирования — по желанию, а потолок пространства жёсткий. |
| Каталог, история, архив, удалённый источник или облачная инвентаризация с GPU на Unix | Калибруйте autoroute, запустите `keyhog daemon start --mass`, затем выполните `keyhog scan --daemon=mass <SOURCE>`. | Потоковая передача ограниченных пакетов через один скомпилированный CPU, Hyperscan, CUDA, Metal или WGPU-рабочий процесс. Добавьте `--incremental` для тёплых неизменённых деревьев файловой системы. Терминальная квитанция сообщает точные итоги и GPU-пакеты, чанки, байты, долю GPU и пропускную способность. | Базовые линии, проверка, lockdown, пресеты, оверлеи и другие изменения политики сканера отклоняются до сбора. Инкрементальное состояние применяется только к локальным корням файловой системы демона. |

### Сканируйте каждую поддерживаемую границу источника

Используйте одну команду на границу. Сохраняйте отчёт `json-envelope` и исходный статус выхода для каждого раздела инвентаризации.

| Источник или вариант использования | Команда |
|---|---|
| Несколько локальных корней | `keyhog scan services/api services/web deploy/` |
| Постоянно изменяемые файлы | `keyhog watch services/api deploy/` |
| Staged-байты, изменённые строки, достижимая история или blob-объекты | `keyhog scan --git-staged`, `--git-diff main`, `--git-history .` или `--git-blobs .` |
| Нативные бинарники и строки прошивки | `keyhog scan --binary firmware.bin` (обычное сканирование каталога пропускает бинарники и всё равно завершается с кодом `0`) |
| Архивы и сжатые источники | `keyhog scan incoming/` (поддерживаемые элементы распаковываются автоматически) |
| Слои Docker-образов | `keyhog scan --docker-image registry/app:v1` |
| JavaScript, source maps, WASM или ответ конечной точки | `keyhog scan --url https://api.example.com/config` |
| Захваты HTTP-запросов и ответов | `keyhog scan capture.har` |
| GitHub issues, pull requests, обсуждения, вики и gists | `keyhog scan --github-collaboration owner/repo --github-all` |
| Инвентаризации GitHub, GitLab или Bitbucket | `--github-org ORG`, `--gitlab-group GROUP` или `--bitbucket-workspace WORKSPACE` |
| Инвентаризации S3, GCS или Azure Blob | `--s3-bucket BUCKET`, `--gcs-bucket BUCKET` или `--azure-container-url URL` |
| Ограниченный поток из другого инструмента | `producer \| keyhog scan --stdin` (используйте `set -o pipefail`, чтобы сбой продюсера отображал собственную ошибку, а не сканирование нулевого размера) |

Обычное сканирование каталога не читает нативные бинарники. Каждый из них становится пробелом покрытия `binary (extension or content sniff)`, сканирование всё равно завершается с кодом `0`, и `--no-default-excludes` этого не меняет, поэтому передавайте `--binary`, когда скомпилированные артефакты входят в область действия. Этот флаг требует сборки с функцией `binary`, которая есть в стандартной установке crates.io и отсутствует в облегчённой функции `ci`.

Извлечение нативных бинарников сообщает полные учётные данные, удовлетворяющие явному контракту формы именованного детектора. Оно подавляет короткие фрагменты префиксов и строки общего вида присваивания из скомпилированных секций данных, потому что эти байты не сохраняют контекст источника.

Получение конечных точек ограничено и защищено от SSRF. Это не краулер. Частные облачные конечные точки и пересылка учётных данных требуют явных флагов доверия. Токены провайдера должны находиться в документированных переменных окружения, а не в аргументах процесса.

Используйте [выбор рабочего процесса](https://santhreal.github.io/keyhog/capabilities.html) для деталей источника и политики, [руководство по GitHub Action](https://santhreal.github.io/keyhog/workflows/github-action.html) для поддерживаемого шлюза репозитория, [прямое руководство по CI](https://santhreal.github.io/keyhog/workflows/ci.html) для долговечных отчётов и обработки кодов выхода, а [руководство по массовому сканированию](https://santhreal.github.io/keyhog/guides/mass-scanning.html) для разделения и агрегации. [Кулинарная книга рецептов](https://santhreal.github.io/keyhog/recipes.html) охватывает контейнеры, архивы, URL, контент совместной работы GitHub и облачные источники.

### Скорость и параллелизм без догадок

Начните со значений по умолчанию. Cargo не может выполнить KeyHog после `cargo install`, поэтому выполните команды ниже один раз после установки многобэкендной сборки Cargo и снова после изменения хоста, бинарника, корпуса детекторов, драйвера или классов рабочей нагрузки:```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
ControlИспользуйте дляСохраняйте этот инвариант
Калиброванный --backend autoОбычный выбор CPU, Hyperscan или GPU.Явный бэкенд — это диагностическое переопределение, а не более быстрый вариант по умолчанию.
--threads <N>Резервирование ресурсов CPU на общем раннере. На выделенных хостах обычно его следует оставлять неустановленным, чтобы KeyHog использовал доступные ядра.Каждое значение должно быть положительным. Несколько одновременных процессов KeyHog владеют отдельными пулами воркеров, поэтому распределяйте бюджет хоста между разделами.
--reader-threads <N>Измеренные конвейеры хранения, где узким местом является работа чтения, а не сканирование.Значение по умолчанию выводится из пула воркеров сканирования. Оставляйте его неустановленным, пока профилирование не покажет узкое место чтения.
--incremental и --incremental-cache <PATH>Повторные сканирования одного и того же доверенного дерева.Не делите один индекс между несвязанными репозиториями или ненадёжными заданиями.
Разделы провайдера или репозиторияОдновременное сканирование инфраструктуры и независимые повторные попытки.Сохраняйте одну терминальную оболочку и исходный код выхода для каждого раздела. Не объединяйте находки и не отбрасывайте состояние покрытия.
--verify-concurrency, --verify-rate и --verify-batchОграничение проверок живого провайдера независимо от сканирования файлов.Проверка отправляет запросы, производные от учётных данных. Лимиты скорости провайдера, а не количество CPU, управляют этим параллелизмом.
Массовый демонПотоки каталогов, истории, архивов, удалённых или облачных данных масштаба TB на одном Unix-воркере.Каждый фрейм ограничен 8 МиБ и 1 024 чанками. Демон сериализует состояние фрагментов и возвращает точную квитанцию выполнения CPU/GPU.
--fast, по умолчанию, --deep или --precisionВыбор явной политики стоимости обнаружения и полноты.Эти пресеты взаимоисключающие и изменяют покрытие. Они не являются взаимозаменяемыми регуляторами скорости.

Проверьте разрешённую политику с помощью keyhog config --effective. Используйте --profile, чтобы измерить фиксированные этапы сканера и полный запуск оператора, прежде чем менять настройки чтения, пакетов или глубины каналов. Отчёт с низкими накладными расходами фиксирует источник, бэкенд, кэш, рабочую нагрузку, потоки, входные данные, переходы состояний, время CPU, пиковую память, точный SHA-256 бинарного файла, SHA-256 включённых функций, целевую тройку, профиль сборки, компилятор, аллокатор, SHA-256 связанного бэкенда, SHA-256 корпуса детектора, BLAKE3 включённых детекторов, BLAKE3 скомпилированного плана, хешированное происхождение детектора, полный BLAKE3 разрешённой конфигурации, BLAKE3 политики производительности, пресет, применённое состояние защиты, адаптеры источников, хешированный BLAKE3 исходной цели, хешированный BLAKE3 исходного раздела, исходные байты, разветвление исходных единиц, байты, полученные при декодировании, завершённые байты диспетчеризации бэкенда и стабильные корзины размера/разветвления. Домены байтов, которые их адаптер источника ещё не может различить, остаются явно недоступными, а не становятся измеренными нулями. Отчёт не записывает содержимое источника, значения учётных данных, исходные пути, исходные URL или исходные значения конфигурации. Используйте --perf-trace только для дорогостоящих диагностических счётчиков по шаблонам и бэкендам. Оставляйте расширенные элементы управления конвейером неустановленными, если воспроизводимое измерение на целевом воркере не покажет улучшения.

Для повторяющегося полного сканирования репозитория:```sh keyhog scan . --incremental
--format json-envelope --output keyhog.json

Для общего раннера, где заданию выделено четыре рабочих процесса сканера и один
рабочий процесс чтения:```sh
keyhog scan . --threads 4 --reader-threads 1 \
  --format json-envelope --output keyhog.json

Вторая команда — это бюджет ресурсов, а не универсальный оптимум. Измерьте целевую систему перед выбором явного количества воркеров.

Для глубокого восстановления и системной триаж-проверки используйте их специализированные руководства, поскольку их правила покрытия и завершения отличаются от обычного сканирования репозитория.

Бенчмарки секретного сканера

Эти панели сравнивают политику обнаружения, запросы на выполнение CPU и GPU, поведение инкрементального кэша и запросы к «тёплому» демону. Каждое значение генерируется из проверенного снимка бенчмарка. Снимок связывает версию сканера, дайджест исполняемого файла, дайджест детектора, корпус, хост и временную метку запуска. Используйте полные доказательства бенчмарка для проверки происхождения конкурентов и полноты по категориям.

Точность обнаружения

KeyHog KeyHog v0.5.70 просканировал корпус mirror: 15 000 фикстур, 3 000 размеченных позитивов и 2 431 242 входных байта. Манифест с ключами ответов был исключён из дерева сканирования. Строка использует политику по умолчанию на явном маршруте Hyperscan/SIMD на AMD Ryzen 9 9950X 16-Core Processor.

ТочностьПолнотаF1Истинно положительныеЛожноположительныеЛожноотрицательные
0.96510.90270.93282 70898292

Отслеживаемое дерево исходников было чистым.

Маршруты выполнения, пресеты и кэш

Измерено на AMD Ryzen 9 9950X 16-Core Processor с NVIDIA GeForce RTX 5090, 32 логическими ядрами, 15 000 фикстур, 3 000 размеченных позитивов и 2 431 242 входных байта. Сканер: KeyHog v0.5.70. Отслеживаемое дерево исходников было чистым.

Полное сканирование по маршруту выполнения

Все строки используют политику обнаружения по умолчанию с инкрементальным кэшем и отключённым демоном. Строка «Автоматически» фиксирует запрошенную политику, но результат бенчмарка не привязывает выбранный сохранённый маршрут, поэтому не является доказательством маршрутизации. Строки GPU включают получение ресурсов и полный запуск сканера на этом небольшом корпусе; это не измерения пересечения GPU-ядер.

Запрошенный маршрутСтенаПропускная способностьПиковый RSSF1
Hyperscan/SIMD860 мс2.70 МБ/с416 МиБ0.9328
Pure-Rust CPU903 мс2.57 МБ/с509 МиБ0.9328
CUDA2.03 с1.14 МБ/с963 МиБ0.9328
WGPU1.97 с1.18 МБ/с1264 МиБ0.9328
Автоматически1.46 с1.59 МБ/с634 МиБ0.9328

Политика обнаружения на Hyperscan/SIMD

Маршрут, кэш, состояние демона, корпус и хост остаются фиксированными. Пресеты меняют объём работы по обнаружению, поэтому сравнивайте точность и полноту, а также время.

ПолитикаСтенаТочностьПолнотаF1Находки
Fast737 мс0.97000.88370.92482 738
Default860 мс0.96510.90270.93282 816
Deep861 мс0.96450.90670.93472 845
Precision849 мс0.95900.63970.76742 001

Инкрементальный «тёплый» повторный запуск

Бенчмарк заполняет индекс Меркла BLAKE3, затем замеряет время второго идентичного сканирования. Небольшое синтетическое дерево меняется мало, поскольку запуск сканера доминирует; измерьте свой репозиторий, прежде чем заявлять об ускорении.

Политика Hyperscan/SIMD по умолчаниюСтенаПропускная способностьПиковый RSS
Кэш выключен860 мс2.70 МБ/с416 МиБ
Тёплый инкрементальный кэш617 мс3.76 МБ/с457 МиБ

Запросы к «тёплому» демону

Один детерминированный обычный файл размером 8 МиБ (sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5) был просканирован один раз в процессе и один раз через собственный демон после одного прогревочного запроса. Время демона — это клиентский запрос; RSS демона принадлежит резидентному серверу.

Явный маршрутВ процессеТёплый демонТёплый / одноразовыйRSS в процессеRSS демона
Hyperscan/SIMD323 мс106 мс0.33×63 МиБ74 МиБ
Pure-Rust CPU278 мс109 мс0.39×62 МиБ66 МиБ
CUDA1.65 с232 мс0.14×674 МиБ666 МиБ
WGPU1.33 с237 мс0.18×596 МиБ600 МиБ

Эти строки охватывают «тёплый» маршрут одного файла. Массовый маршрут также принимает ограниченные пакеты каталогов и удалённых источников; его инкрементальный путь файловой системы измеряется отдельно.

Масштабирование CPU, чтения, хранилища, размера и разделов

Сгенерировано с помощью make -C benchmarks readme-scaling из benchmarks/reports/readme-scaling.json. Харнесс выполнил 3 измеренных прогона после 1 прогревочного с явным simd и отключённой маршрутизацией демона. Масштабирование воркеров использует тёплый клиентский кэш страниц для изоляции работы CPU. Строки чтения, размера корпуса, хранилища и разделов запрашивают очистку страниц с помощью posix_fadvise там, где платформа это поддерживает; снимок фиксирует политику в каждой строке. Каждая рабочая нагрузка байт-детерминирована и не содержит находок.

Хост: AMD Ryzen 9 9950X 16-Core Processor, 32 эффективных логических ядра, 94 140 МиБ ОЗУ, Linux 6.17.0-19-generic. Доказательства: clean, бинарный 274b045489c4.

Масштабирование воркеров сканирования

ВоркерыПотоки чтенияМедианная стенаp95 стенаПропускная способностьУскорениеЭффективностьМедианный пиковый RSS
1auto8 134.4 мс8 135.4 мс7.9 МиБ/с1.00x100.0%47.0 МиБ
2auto4 398.2 мс6 906.7 мс14.6 МиБ/с1.85x92.5%50.3 МиБ
4auto2 392.6 мс6 245.2 мс26.7 МиБ/с3.40x85.0%57.2 МиБ
8auto1 816.3 мс6 117.6 мс35.2 МиБ/с4.48x56.0%63.4 МиБ
16auto1 428.5 мс6 867.7 мс44.8 МиБ/с5.69x35.6%78.4 МиБ
32auto1 862.8 мс5 939.1 мс34.4 МиБ/с4.37x13.6%126.7 МиБ

Масштабирование чтения файловой системы

Воркеры сканированияПотоки чтенияМедианная стенаp95 стенаПропускная способностьОтносительно 1 потока чтенияМедианный пиковый RSS
3211 898.7 мс1 922.1 мс33.7 МиБ/с1.00x121.3 МиБ
3221 881.7 мс1 887.5 мс34.0 МиБ/с1.01x122.8 МиБ
3241 874.2 мс1 891.2 мс34.1 МиБ/с1.01x126.6 МиБ
3281 873.2 мс1 885.7 мс34.2 МиБ/с1.01x133.4 МиБ
32161 856.8 мс1 868.5 мс34.5 МиБ/с1.02x153.9 МиБ
32321 877.3 мс1 880.4 мс34.1 МиБ/с1.01x179.5 МиБ

Масштабирование размера корпуса

КорпусФайлыТочные байтыМедианная стенаp95 стенаПропускная способностьМедианный пиковый RSS
small2568 МиБ869.9 мс886.1 мс9.2 МиБ/с111.1 МиБ
medium1 02464 МиБ1 859.9 мс1 874.8 мс34.4 МиБ/с126.3 МиБ
large2 048256 МиБ5 214.9 мс5 321.7 мс49.1 МиБ/с137.1 МиБ

Масштабирование хранилища

Класс хранилищаФайловая системаID устройстваМедианная стенаp95 стенаПропускная способностьОтносительно первого хранилищаМедианный пиковый RSS
workspaceext4663051 847.4 мс1 863.4 мс34.6 МиБ/с1.00x127.0 МиБ
local-temptmpfs1161 870.8 мс1 887.3 мс34.2 МиБ/с0.99x124.9 МиБ

Масштабирование одновременных разделов

ПроцессыВоркеры на процессСуммарные воркерыВсего файловВсего байтМедианная стенаСуммарная пропускная способностьУскорениеМедианный суммарный пиковый RSS
132322568 МиБ871.9 мс9.2 МиБ/с1.00x111.5 МиБ
2163251216 МиБ404.6 мс39.5 МиБ/с4.31x134.0 МиБ
48321 02432 МиБ571.1 мс56.0 МиБ/с6.11x227.2 МиБ

Эти строки — измерения, а не универсальные константы настройки. Запустите генератор на целевой системе и хранилище. Используйте точку перегиба, где пропускная способность перестаёт улучшаться, затем зарезервируйте CPU и память для CI-раннера или слоя оркестрации.

Воспроизведите все четыре группы бенчмарков с помощью make -C benchmarks readme-matrix. Команда измеряет требуемую матрицу и завершается ошибкой, если любая запрошенная строка CPU, Hyperscan, CUDA, Metal, WGPU, пресета, кэша, демона, потока, чтения, хранилища, размера корпуса или раздела недоступна. Используйте make -C benchmarks readme-matrix-check, чтобы убедиться, что оба снимка, отчёты и README согласованы.

Выбор конфигурации сканирования

Начните с политики по умолчанию и откалиброванной автоматической маршрутизации. Меняйте только одну ось, когда этого требует рабочий процесс:

Рабочий процессПолитика обнаруженияВыполнение и повторное использованиеДополнительный контроль
Первое сканирование репозиторияDefaultОткалиброванный auto; --daemon=autoПросмотрите все находки перед добавлением подавлений.
Повторное сканирование локального дерева или CIDefaultОткалиброванный auto; --incrementalСохраняйте инкрементальный кэш только между сканированиями одного доверенного дерева.
Короткий цикл обратной связи--fastОткалиброванный auto; опционально --incrementalПримите сниженное покрытие декодирования, энтропии и ML. Запустите политику по умолчанию перед слиянием.
Восстановление с максимальной полнотой--deepВ процессеDeep взаимоисключающ с fast и precision и не подходит для демона.
Крупная инвентаризация с меньшим шумом--precisionВ процессе для коллекций репозиториев, истории и облачных источниковПресет повышает пороги уверенности и отключает обнаружение энтропии. Он может пропустить учётные данные с более низкой уверенностью.
Инвентаризация каталогов, истории, архивов, удалённых или облачных источников масштаба ТБ на UnixDefaultkeyhog daemon start --mass, затем --daemon=massПакеты остаются ограниченными 8 МиБ и 1 024 чанками. Сохраняйте терминальный отчёт о покрытии и квитанцию выполнения GPU.
Живая проверка учётных данныхDefaultВ процессеДобавьте --verify явно. Проверка отправляет запросы, производные от учётных данных, провайдерам.
Сканирование Linux без подкачкиDefault плюс --lockdownВ процессе; инкрементальный кэш отключёнLockdown отказывает в проверке, открытых секретах, быстром режиме и переключателях, снижающих полноту.

--fast, --deep и --precision — взаимоисключающие пресеты обнаружения. --lockdown — это режим выполнения с отказом по умолчанию, а не четвёртый пресет. Явные значения --backend — это диагностика и переопределения бенчмарка. Они не заменяют сохранённые доказательства «самого быстрого корректного», используемые автоматической маршрутизацией. См. Configuration, autoroute calibration, daemon and warm scans и hardening для полных контрактов.

Как работает KeyHog

KeyHog компилирует свои 934 детектора в общий план триггеров и извлечения, декодирует вложенные кодировки перед сопоставлением и применяет по-детекторную оценку, доказательства и подавление. Pure-Rust CPU (cpu-fallback) всегда доступен. Маршрут Hyperscan (simd-regex) использует Hyperscan, когда эта функция присутствует; переносимые сборки используют маршрут CPU. CUDA (gpu-cuda-region-presence), Metal (gpu-metal-region-presence) и WGPU (gpu-wgpu-region-presence) — равноправные участники в селекторе autoroute с доказательной поддержкой, а не цепочка отката. Калибровка измеряет каждого подходящего участника и сохраняет самый быстрый маршрут, чьи полные находки совпадают с эталонным маршрутом для точного бинарного файла, состояния детектора и конфигурации, хоста, ускорителя и класса рабочей нагрузки. Отсутствующее, устаревшее, недействительное или неполное решение останавливает автоматическое сканирование до выполнения и сообщает, как перекалибровать. Оно никогда не подставляет молча другой бэкенд.

См. Architecture для карты репозитория, направления зависимостей, конвейера «байты-к-находке» и точек входа профилирования. См. Backends and routing для контрактов выполнения и Autoroute calibration для паритета, идентичности рабочей нагрузки, жизненного цикла кэша и процедур восстановления.

Полная документация: santhreal.github.io/keyhog — установка, первое сканирование, форматы вывода, внутренности обнаружения, подавления, проверка, интеграция pre-commit + CI, справочник CLI, autoroute, коды выхода, переменные окружения и вклад в проект. Исходники в docs/.


Установка KeyHog

Установите текущий релиз crates.io:```sh cargo install keyhog --locked

Соберите репозиторий из исходников, когда вам нужна невыпущенная правка:```sh
cargo install --path crates/cli --locked

Подтвердите установленную сборку:```sh keyhog --version --full keyhog doctor

Используйте [руководство по установке](https://santhreal.github.io/keyhog/install.html) для
требований к инструментарию Rust, профилям функций и зависимостям времени выполнения
для конкретных платформ.


## Что он обнаруживает

934 встроенных детектора с автономной валидацией и компаньонами, принадлежащими детекторам:

- **Облачные провайдеры:** AWS (ключ доступа + секрет + проверка STS),
  Azure (ключ подписки, ключ учётной записи хранения, SAS), GCP (сервисный
  аккаунт, ключ API), Cloudflare, Heroku, Vercel, Supabase.
- **Платёжные процессоры:** Stripe, Braintree, Razorpay, Paddle, Plaid,
  Square и PayPal, с проверками, принадлежащими детекторам, и необязательными или
  обязательными компаньонами. Секрет ключа Razorpay требует расположенный рядом идентификатор ключа.
- **Хостинги исходного кода:** GitHub PAT (с контрольной суммой CRC32), токены GitLab,
  пароли приложений Bitbucket, токены npm (с контрольной суммой), Gitea / Forgejo
  / Codeberg.
- **Auth / SSO:** Okta, Auth0, Clerk, JumpCloud, Kinde.
- **Коммуникации:** Slack, Discord, Twilio, SendGrid, Postmark, Mailgun,
  Resend, Loops.
- **AI / ML:** OpenAI (sk-/sk-proj-), Anthropic, Google AI Studio,
  Cohere, Mistral, HuggingFace, Replicate. Учётные данные организации
  HuggingFace включают как текущую форму `hf_`, так и устаревшие токены `api_org_`.
- **Менеджеры паролей:** секретные ключи учётной записи 1Password (`A3-` с последующими
  пятью или шестью сегментированными прописными буквенно-цифровыми компонентами).
- **Базы данных:** строки подключения Postgres, MongoDB Atlas, сервисная роль
  Supabase, PlanetScale, Neon, Turso, MySQL, URL-адреса Redis.
- **Общие + обнаружение энтропии:** `API_KEY=<высокоэнтропийный блок>` обнаруживает
  учётные данные без именованного детектора, ограниченные порогами энтропии
  для каждого контекста + оценкой ML.
- **Криптографические материалы:** закрытые ключи RSA / EC / SSH, закрытые блоки
  PGP, секреты подписи JWT.

Каждый детектор поставляется в виде [TOML-файла](https://github.com/santhreal/keyhog/blob/main/detectors) (данные, а не код):
метаданные сервиса, шаблоны регулярных выражений, ключевые слова, автономные валидаторы, политика энтропии и ML,
поля компаньонов и обработчик проверки. Добавление нового детектора — это
одно проверяемое изменение TOML;
[руководство для участников](https://github.com/santhreal/keyhog/blob/main/CONTRIBUTING.md) проведёт вас по этому процессу.

`keyhog explain <id>` выводит полную спецификацию любого детектора: шаблоны, ключевые слова,
конечную точку проверки, а также руководство по ротации и пошаговому
устранению, привязанное к сервису, так что находка никогда не остаётся чёрным ящиком:

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: дамп спецификации детектора (шаблон ghp_[A-Za-z0-9]{36}, ключевое слово, URL проверки), за которым следует руководство по ротации github и пошаговое устранение" width="860" />
</p>

Просматривайте создание и проверку детекторов в
[справочнике детекторов](https://github.com/santhreal/keyhog/blob/main/docs/src/detectors.md) или запрашивайте установленный корпус с помощью
`keyhog detectors --search <термин> --verbose`.

## Почему выше полнота, меньше ложных срабатываний

- **Сканирование с декодированием.** Манифесты `Secret` Kubernetes, блокноты
  Jupyter, полезные нагрузки JWT, окружения в base64, значения Helm и блоки
  `auth:` в docker-config. Структурированный препроцессор рассматривает сбалансированные действия Helm как
  инертные значения времени рендеринга и закрывает отсутствующие разделители Jupyter в конце файла,
  поэтому литеральные байты и полные ячейки кода остаются покрытыми. Он декодирует структурированные
  значения на месте и передаёт каждому последующему детектору открытый текст. Детекторам
  не нужно заново реализовывать декодирование. Сканирование с включённым декодированием также восстанавливает
  выражения XOR байтовых массивов JavaScript и AES-256-CBC без побочных эффектов, когда
  весь материал для восстановления встроен, включая строгие обёртки паролей с солью CryptoJS/OpenSSL.
  KeyHog никогда не выполняет исходный код.
- **Пересборка многострочных значений.** Продолжение `"sk-proj-" + \` в JavaScript,
  многострочные строки YAML, продолжение с обратной косой чертой в Makefile, выводы с
  шаблонами Helm / Jinja — всё пересобирается перед сопоставлением с регулярным выражением.
- **Проверка компаньонов.** Обязательные компаньоны ограничивают детекторы с высоким уровнем шума. Ключ
  API Twilio без его секрета API пропускается. Необязательные компаньоны обогащают
  оценку доказательств или проверку. Обнаружение ключа доступа AWS не требует
  его секрета, но секрет необходим для живой проверки.
- **Разрешение между детекторами.** TOML детектора может требовать, отклонять или поглощать
  ограниченные находки другого детектора. Разрешение остаётся детерминированным независимо от
  порядка входных данных, а недопустимые цели, противоречия или циклы зависимостей приводят к сбою
  компиляции корпуса.
- **Вердикты доказательств.** Каждая находка несёт точный уровень `review`, `likely` или
  `confirmed` плюс канонический код причины. Внутренняя контрольная сумма или грамматическое
  доказательство, обязательные компаньоны и живая проверка дают подтверждённые доказательства;
  сильная специфичная для вендора форма в роли, несущей учётные данные, даёт вероятные
  доказательства; слабые якоря, общие присваивания, кандидаты только по энтропии и контексты
  тестов, документации, правил или идентификаторов остаются доказательствами уровня review.
  Необязательный `evidence_score` дополняет вердикт, когда он измерен.
  Порог по умолчанию `0.40` управляет внутренним минимальным уровнем уверенности сканера
  и остаётся настраиваемым с помощью `--min-confidence`.
- **Байесовская калибровка для каждого детектора.** `keyhog calibrate --fp generic-api-key`
  записывает апостериорное распределение Beta(α,β). Сканирования используют его только когда `--calibration-cache`
  или `[system].calibration_cache` указывает на этот файл, поэтому настройка уверенности
  явная и воспроизводимая, а не зависит от случайного состояния кэша хоста.

## Производительность

Используйте воспроизводимый стенд в [`benchmarks/`](https://github.com/santhreal/keyhog/blob/main/benchmarks) для сравнения KeyHog,
Betterleaks, Kingfisher, Nosey Parker, TruffleHog и Titus по единому контракту
оценки. Стенд исключает манифест с эталонными ответами из каждого дерева сканирования.
Сгенерированные таблицы остаются пустыми, пока не существуют прогоны с текущей схемой. Запустите
`make -C benchmarks report` после измерений. Не редактируйте сгенерированные таблицы
вручную.

### Таблица лидеров по обнаружению

<!-- BENCH:leaderboard:start -->
#### Синтетический зеркальный корпус в форме SecretBench
Корпус: **mirror** — 15000 фикстур, 3000 размеченных положительных, 2 431 242 байта. Каждый сканер оценён одинаково (правило пересечения SecretBench); манифест с ключом ответов исключён из дерева сканирования.

| Ранг | Сканер | F1 | Точность | Полнота | Находки | Время | Пиковый 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 |

#### Корпус правил конкурентов на их «домашнем поле»
Корпус: **homefield** — 2399 фикстур, собранных из эталонных наборов правил конкурентов (правила Betterleaks и Kingfisher; 1057 размеченных положительных, 1342 отрицательных, 772 974 байта). Кросс-инструментальная оценка на эталонных данных конкурентов.

| Ранг | Сканер | F1 | Точность | Полнота | Находки | Время | Пиковый 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 |
### Происхождение результатов

| Сканер | Версия сканера / дайджест исполняемого файла | Идентичность корпуса | Идентичность хоста | Дата запуска |
|---|---|---|---|---|
| KeyHog | версия: KeyHog v0.5.70<br>Коммит: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Набор детекторов: 926 (926-4168e2c6c93a16ca)<br>Целевая сборка: x86_64-linux<br>Версия ML-модели: moe-v1-246a05b92bec9aa3<br>Карточка ML-модели: записана 2026-07-15; признаков 55; синтетический F1 0.971 / P 0.945 / R 0.999; реальный F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; детекторов с нулевой полнотой 2/32; шестисканирующий дифференциал недоступен<br>SHA-256 исполняемого файла: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | версия: trufflehog 3.96.0<br>SHA-256 исполняемого файла: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | версия: kingfisher 1.94.0<br>SHA-256 исполняемого файла: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | версия: Titus v1.1.20 (Go-порт NoseyParker)<br>SHA-256 исполняемого файла: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | версия: noseyparker 0.24.0 Конфигурация сборки: Временная метка сборки:    2025-05-08T21:11:15.600909923Z Временная метка коммита:   2025-05-08T17:04:47.000000000-04:00 Ветка коммита:      HEAD SHA коммита:         61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Возможности Cargo:     color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release Отладка:              true Оптимизация:       3 Целевая тройка:      x86_64-unknown-linux-gnu Система сборки: ОС:                 Ubuntu Версия ОС:         Linux (Ubuntu 22.04) Производитель CPU:         AuthenticAMD Марка CPU:          AMD EPYC 7763 64-Core Processor Ядер CPU:          2 Версия rustc:      1.86.0 Канал rustc:      stable Целевая тройка rustc:  x86_64-unknown-linux-gnu Дата коммита rustc:  2025-03-31 SHA коммита rustc:   05f9846f893b09a1be1fc8560e33fc3c815cfecb Версия LLVM rustc: 19.1<br>SHA-256 исполняемого файла: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | версия: betterleaks version dev<br>SHA-256 исполняемого файла: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15 000 фикстур; 3 000 размеченных положительных; 2 431 242 байта | SHA-256/12 имени хоста: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:43Z |
<!-- BENCH:leaderboard:end -->

### Скорость и память

<!-- BENCH:perf:start -->
#### Синтетический зеркальный корпус в форме SecretBench

| Сканер | Конфигурация | Корпус | Время | Пропускная способность | Пиковый 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 |

#### Корпус правил конкурентов на их «домашнем поле»

| Сканер | Конфигурация | Корпус | Время | Пропускная способность | Пиковый 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 -->

### Сравнение полноты по категориям

<!-- BENCH:gaps:start -->
_Диагностический срез полноты. Общая точность и F1 остаются контрактом сравнения; ложные срабатывания учитываются в своих категориях оценки._

| Категория | KeyHog P/R/F1 | KeyHog TP/FN | Лучший конкурент P/R/F1 | Разрыв по полноте |
|---|---|---|---|---|
| `generic-high-entropy-string` | 1.000 / 0.434 / 0.606 | 73/95 | Betterleaks 1.000 / 0.798 / 0.887 | +0.363 |
<!-- BENCH:gaps:end -->

### Телеметрия ограниченного статического восстановления

<!-- BENCH:recovery:start -->
Выбранный прогон: сканер **KeyHog** `KeyHog v0.5.70<br>Коммит: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Набор детекторов: 926 (926-4168e2c6c93a16ca)<br>Целевая сборка: x86_64-linux<br>Версия ML-модели: moe-v1-246a05b92bec9aa3<br>Карточка ML-модели: записана 2026-07-15; признаков 55; синтетический F1 0.971 / P 0.945 / R 0.999; реальный F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; детекторов с нулевой полнотой 2/32; шестисканирующий дифференциал недоступен`; корпус **mirror** (15 000 фикстур, 2 431 242 байта); сгенерирован `2026-08-11T01:29:39Z`; артефакт `mirror-keyhog-simd-nocache-nodaemon-full.json`.

Схема телеметрии: `static-recovery-v1`.

| Статус | Точное количество |
|---|---:|
| Поддержано | 0 |
| Не поддержано | 0 |
| Ошибочно | 0 |

| Причина отклонения | Точное количество |
|---|---:|
| _нет_ | 0 |
<!-- BENCH:recovery:end -->

### Доказательства биграммного фильтра Блума

<!-- BENCH:bloom:start -->
Схема доказательств: `bloom-evidence-v1`.

| Поле | Точный результат |
|---|---|
| Корпус | `samsung-creddata-fx-record-spans-v1` |
| Ревизия корпуса | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| SHA-256 корпуса | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| SHA-256 фикстуры | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| SHA-256 исполняемого файла | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| SHA-256 корпуса детекторов рабочей области | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| Дайджест детекторов сканера | `8d789251e092959f` |
| SHA-256 корпуса детекторов | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| Отклонение фильтром Блума | **110/51794 (0.21%)**; 51684 принято |
| Внешняя доступность | 51794 измерено; 0 явно недоступно из 51794 объявленных; причины:  |
| Включённые и обойдённые находки | **ИДЕНТИЧНЫ**; 977/977 находок |
| SHA-256 идентичности находки | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| Плотность/состояние фильтра Блума | 1793/65536 слотов; `healthy`; насыщение на 39322 |

Идентичность находки связывает детектор, файл, строку, диапазон байтов и SHA-256 учётных данных; открытые тексты учётных данных никогда не записываются.
<!-- BENCH:bloom:end -->

Воспроизведение: `make -C benchmarks canonical KEYHOG_BIN=/absolute/path/to/keyhog`
повторно запускает точный набор прогонов KeyHog, Betterleaks, Kingfisher, Nosey Parker, TruffleHog и
Titus на зеркальном корпусе, включая привязанный к исполняемому файлу дифференциал Bloom CredData,
`make -C benchmarks report` перегенерирует таблицы выше и
`benchmarks/reports/`. См. [`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/main/benchmarks/README.md)
для корпусов (mirror, домашнее поле конкурентов, Samsung/CredData) и
матрицы бэкенд/кэш/демон/ОС/GPU.

## Массовые фоновые рабочие процессы с поддержкой GPU

Необязательный массовый Unix-демон поддерживает один скомпилированный сканер и его калиброванное
состояние бэкенда в тёплом виде. Сканирование локальной файловой системы отправляет только канонический корневой
и исходно-политический метаданные; демон читает и пакетирует файлы в собственном
процессе. Источники Git, бинарные, удалённые и облачные, требующие учётных данных
на стороне клиента, используют защищённые ограниченные кадры блоков.```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 — обязательный маршрут. Он никогда не выполняет повторные попытки внутри процесса. Каждый пакет ограничен 8 МиБ и 1 024 чанками, независимо от общего размера входных данных. Сохраняйте охват покрытия, статус выхода и квитанцию о выполнении в терминале для каждого раздела инвентаря.

См. жизненный цикл демона, маршрутизацию и квитанции и разбиение инвентаря.

Системная сортировка учётных данных```sh

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

`scan-system` — это ограниченный локальный аудит хоста, а не замена репозиторию или
облачному разбиению инвентаря. Он ограничивает себя общим количеством просканированных байт, а не
путём: `--space` — это потолок, а сетевые файловые системы
пропускаются, если вы не передадите `--include-network`. Проверьте поведение монтирования, сетевых файловых систем,
потолка пространства и привилегий перед запуском. См.
[системный триаж](https://santhreal.github.io/keyhog/guides/system-wide-triage.html).

## Ограничение чувствительных локальных сканов

`--lockdown` в Linux — это режим защиты процессов с отказом по умолчанию (fail-closed):```sh
keyhog scan . --daemon=off --lockdown

Блокирует текущую и будущую память, отключает дампы ядра и инкрементальный кэш, остаётся в процессе и отказывается от проверки, вывода открытого текста, быстрого режима и переключателей, снижающих полноту. Завершается с ошибкой на неподдерживаемых платформах или при недостаточной ёмкости заблокированной памяти. См. ужесточение и обработку данных.

Использование KeyHog как библиотеки 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();

Методы библиотеки по умолчанию являются детерминированными переносимыми ссылками на CPU. Явные
методы бэкенда возвращают типизированные ошибки вместо завершения процесса или
молчаливой подстановки другого движка. Сырые фрагменты и совпадения могут содержать
открытый текст. Преобразуйте их с помощью `RawMatch::to_redacted` или используйте итоговые
значения `VerifiedFinding` перед границами JSON, журналов, диска или сети.

[Руководство по архитектуре](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) определяет владение крейтами,
контракты бэкендов, квитанции восстановления, вспомогательные функции источников и безопасные
границы отчетности. Документация Rust на уровне крейтов содержит полный API.

## Настройка политики с явным приоритетом

Политика репозитория хранится в `.keyhog.toml`:```toml
verify = false

[scan]
severity = "high"
incremental = true

[system]
gpu = "auto"

Порядок разрешения: встроенные значения по умолчанию, пользовательская конфигурация, конфигурация репозитория, окружение, где это задокументировано, а затем явные переопределения через CLI. Неизвестные ключи и недопустимые комбинации приводят к ошибке до начала сканирования. Выполните keyhog config --effective, чтобы просмотреть разрешённую политику без раскрытия учётных данных прокси. Записи, срок действия которых истёк (expires), приводят к ошибке загрузки списка разрешённых до начала сканирования.

См. конфигурацию и приоритет для каждого ключа и переменные окружения для учётных данных и входных данных времени выполнения.

Архитектура

KeyHog держит оркестрацию на границе, а поведение домена — в библиотеках:```text sources -> scanner -> suppression/evidence -> reporting -> optional verifier CLI and Action own process, transport, and exit semantics.

Определения детекторов остаются данными в `detectors/`. `keyhog-core` владеет
типами детекторов и находок, `keyhog-scanner` владеет бэкендами сопоставления и
исполнения, `keyhog-sources` владеет получением входных данных, `keyhog-verifier` владеет
живыми проверками, а `keyhog-cli` владеет рабочими процессами оператора.

Начните с [руководства по архитектуре](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) для карты
репозитория, направления зависимостей, конвейера «байты → находки», владения маршрутизацией и
точек входа для профилирования.

## Проверьте и расширьте установку```sh
keyhog detectors --search aws --verbose
keyhog explain aws-access-key
keyhog backend --autoroute --json
keyhog completion zsh

Справочник по CLI перечисляет каждую команду, флаг, генерируемые значения по умолчанию и код выхода. Используйте keyhog --help и keyhog <command> --help, чтобы узнать точную информацию для установленной версии.

Участие в разработке

  • Новый детектор? Добавьте TOML-файл в detectors/ и откройте PR. Руководство для контрибьюторов (CONTRIBUTING.md) содержит схему и рабочий пример.
  • Ошибка / пропущенный секрет / ложное срабатывание? Создайте issue с описанием формы отредактированного учётного данного и идентификатором детектора; каждый отчёт становится постоянным тестовым фикстуром в crates/scanner/tests/contracts/.
  • Поведение релизов? Каждый успешный прогон CI в ветке main увеличивает patch-версию, генерирует журналы изменений и публикует все шесть крейтов на crates.io. Добавьте необязательный фрагмент в changes/ для точного примечания. Руководство по релизам описывает автоматическую транзакцию и восстановление после неудачной загрузки.
  • Проблема безопасности в самом KeyHog? Не открывайте публичный issue; используйте приватную систему отчётов об уязвимостях GitHub. Если эта форма недоступна, напишите на [email protected]; PGP не требуется.

Журнал изменений. Открытые issues.

Благодарности

KeyHog опирается на предыдущие работы по сканированию секретов. Идеи заимствованы из:

  • TruffleHog: широта детекторов и семантика верификации
  • Betterleaks: эффективность токенов и подавление ложных срабатываний
  • Titus: эргономика сканирования и калибровка серьёзности

Спасибо этим проектам и их контрибьюторам.

Лицензия

Лицензия: MIT OR Apache-2.0.

Условия: MIT и Apache-2.0. Эта двойная лицензия покрывает код и TOML-файлы детекторов. Коммерческое использование, встраивание, форки и хостинг-сервисы разрешены в соответствии с любой из лицензий.


История звёзд

История звёзд KeyHog на GitHub по данным, собранным репозиторием

Сгенерировано из наблюдений UTC за публичным числом звёзд GitHub. Репозиторий хранит первую точку и каждое последующее изменение счётчика. Повторные запуски в тот же день заменяют точку этого дня, а неизменные значения не создают коммитов.

Категории