
Найдите учетные данные на скриншотах, сохраните их в ваш менеджер секретов и безвозвратно заретушируйте их на изображении — локально, офлайн, на основе OCR.
Ищет учетные данные на скриншотах, извлекает их в менеджер секретов и безвозвратно редактирует их на изображениях — чтобы секреты не гнили в ваших заметках, скриншотах и ~/Desktop.
Локальный. Офлайн. Бесшумный. По умолчанию без сети и телеметрии.
screenscrub объединяет две существующие категории инструментов: GUI-редакторы (Xnapper, Shhshot, macshot) вручную размывают PII, но не отличают секрет от адреса и не фиксируют, что они скрывают; сканеры секретов (gitleaks, TruffleHog) находят настоящие учетные данные, но только в тексте, никогда в PNG. screenscrub переносит обнаружение уровня gitleaks — плюс red-team-пакет и энтропийный анализ — на пиксели, безголово: он захватывает каждый секрет в ваш менеджер, безвозвратно редактирует изображение и повторно выполняет OCR, чтобы доказать, что секрет исчез.
Подстраховка, а не гарантия — screenscrub никогда не утверждает, что изображение «гарантированно чистое»; OCR и обнаружение оба что-то пропускают, поэтому всегда проверяйте результаты глазами. Прочтите это, прежде чем полагаться на него.
screenscrub scan ~/Screenshots # сухой прогон: обнаружить + отчёт, без записи
screenscrub clean ~/Screenshots --out ~/clean \ # извлечь, отредактировать, проверить, поместить в карантин
--sink file://./secrets.age --yes
screenscrub verify ~/clean # доказать, что папка чиста (выход≠0, если нет)
screenscrub clean --keep-originals ./tmp
Cleaning 7 image(s) in ./tmp (7 worker(s))…
[1/7] tmp/ssh.jpg — 6 region(s) → tmp/ssh.redacted.jpg ✓ verified
[2/7] tmp/key.jpg — 13 region(s) → tmp/key.redacted.jpg ✓ verified
[3/7] tmp/test2.jpg — 12 region(s) → tmp/test2.redacted.jpg ✓ verified
[4/7] tmp/test5.jpg — 13 region(s) → tmp/test5.redacted.jpg ✓ verified
[5/7] tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
[6/7] tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
[7/7] tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved
7/7 file(s) flagged, 382 region(s) total, 3 file(s) errored/unverified.
By kind:
high-entropy 343
keyword-secret 15
db-connection-uri 10
github-pat 6
unix-crypt-hash 6
aws-access-key 1
stripe-key 1
Needs manual attention (3):
tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved
| До — секретные значения видны | После clean — безвозвратно отредактировано |
![]() |
![]() |
Один и тот же скриншот до и после clean: каждое секретное значение декодируется в пиксели, обрамляется и перекодируется в новое изображение (безвозвратно) — подписи и структура остаются читаемыми.
Требуется бинарник OCR tesseract в PATH:
brew install tesseractwinget install UB-Mannheim.TesseractOCR (или установщик UB Mannheim)apt-get install tesseract-ocrЗатем сборка:
go build -o screenscrub ./cmd/screenscrub
Кросскомпилируется для macOS (arm64/amd64) и Windows (amd64) — он вызывает tesseract через оболочку, а не через cgo. Протестировано только на macOS.
scan <dir|file> — сухой прогонОбнаруживает и сообщает; ничего не записывает.
screenscrub scan ~/Screenshots --ignore 'node_modules/**' --ignore '*.thumb.png'
screenscrub scan shot.png --json # машинно-читаемый отчёт
screenscrub scan ~/Screenshots --preview ~/review # просмотреть, что clean отредактирует
--preview <dir> записывает неразрушающую копию каждого помеченного изображения с контуром (не заливкой) каждой обнаруженной области, чтобы вы могли подтвердить, что clean отредактирует, прежде чем фиксировать. ⚠️ Эти копии всё ещё содержат секреты — каталог создаётся с правами 0700 и не подлежит распространению.
Отчёт завершается сводкой: разбивка по типам и явный список «Требует ручного внимания» — файлы, которые завершились ошибкой, не прошли проверку или не содержат текста OCR на том, что должно быть скриншотом (молчаливый пропуск OCR читается так же, как чистое изображение, поэтому он отображается, а не доверяется).
scan --fail-on-findings завершается с ненулевым кодом, если что-то обнаружено — шлюз для pre-commit/CI.
clean <dir|file> — извлечение, редактирование, карантинSCREENSCRUB_PASSPHRASE=… screenscrub clean ~/Screenshots \
--out ~/Screenshots/clean \
--sink file://./secrets.age \
--yes
Для каждого изображения с находками clean:
<name>.redacted.png в --out (или рядом с исходным),<out>/quarantine/, зашифрованное с помощью age.Секреты попадают в тот приёмник, который вы передаёте в --sink: файл age (по умолчанию), 1Password (op://), KeePassXC (keepassxc://), связка ключей macOS (keychain://) или HashiCorp Vault (vault://) — или аппаратно-поддерживаемые получатели age (YubiKey, Touch ID). См. Приёмники секретов.
Флаги: