
ابحث عن بيانات الاعتماد في لقطات الشاشة، واحفظها في مدير الأسرار الخاص بك، واحذفها بشكل غير قابل للإلغاء من الصورة — محليًا، دون اتصال، باستخدام التعرف البصري على الأحرف (OCR).
ابحث عن بيانات الاعتماد في لقطات الشاشة، واستخرجها إلى مدير أسرار، وقم بإخفائها بشكل لا رجعة فيه من الصور — حتى لا تتعفن الأسرار في ملاحظاتك ولقطات الشاشة و~/Desktop.
محلي. دون اتصال. صامت. لا شبكة، لا تتبع عن بعد افتراضياً.
سكرين سكراب يربط بين فئتين من الأدوات الحالية: أدوات الإخفاء الرسومية (Xnapper، Shhshot، macshot) تطمس المعلومات الشخصية يدوياً ولكنها لا تستطيع التمييز بين السر والعنوان أو تسجيل ما تخفيه؛ أدوات فحص الأسرار (gitleaks، TruffleHog) تجد بيانات الاعتماد الحقيقية ولكن فقط في النصوص، وليس أبداً في PNG. سكرين سكراب يجلب كشفاً من الدرجة الأولى لـ gitleaks — بالإضافة إلى حزمة اختبار اختراقي وتحليل الانتروبيا — إلى البكسل، بدون رأس: فهو يلتقط كل سر إلى مدير الأسرار الخاص بك، ويخفي الصورة بشكل لا رجعة فيه، ويعيد OCR للنتيجة لإثبات اختفاء السر.
شبكة أمان، وليس ضماناً — سكرين سكراب لا يدعي أبداً أن الصورة "مضمونة النظافة"; فكل من 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). راجع مصارف الأسرار.
الوسائط:
--exclude-kind و --min-confidence هما مقابض دقة محلية (بدون شبكة) لنصوص صاخبة — النظير غير المتصل لـ --llm. يتبادلان الاستدعاء مقابل تقرير أكثر هدوءاً، لذا استخدمهما عن قصد. كلاهما يعمل أيضاً على scan/verify ويمكن ضبطهما في --config (exclude_kinds، min_confidence).
ترتيب حل كلمة المرور: --passphrase، ثم ملف الإعدادات، ثم SCREENSCRUB_PASSPHRASE. تجنب --passphrase في سطر الأوامر — argv مرئي للعمليات الأخرى.
verify <dir|file> — أثبت أن المجلد نظيفيعيد OCR كل صورة، ويعيد تشغيل الكشف، ويخرج بقيمة غير صفرية إذا تم العثور على أي منطقة سرية — استخدمه كبوابة تسليم/CI قبل إرسال لقطات الشاشة للعميل. (إنه يثبت أن OCR لا يستطيع قراءة السر، وليس أن إنساناً لا يمكنه ذلك أبداً.)
screenscrub verify ~/deliverable/screenshots
echo $? # 0 = نظيف، غير صفري = السر لا يزال قابلاً للكشف
يقوم clean بتشغيل نفس الفحص تلقائياً على كل نسخة مخفية ولن يعزل أو يمزق أصلاً فشلت نسخته المخفية في التحقق؛ --no-verify يتخطاه (غير موصى به).
open <store> — استرجع الأسرار أو الأصل المعزولاستعد بياناتك: يقوم open بفك تشفير مصرف age (سجلات الأسرار المخزنة) أو الأصل المعزول إلى --out، وليس stdout أبداً. راجع فك تشفير المخازن.
--llm — إسقاط العلامات الزائدة الحميدة باستخدام LLMقواعد من الدرجة الأولى لـ gitleaks على نص OCR (مع ضوضاء OCR) تؤدي حتماً إلى علامات زائدة: الكاشف المنحاز للاستدعاء يبرز سلاسل عالية الانتروبيا حميدة يرغب المشغل في الاحتفاظ بها — أسماء المضيفين، GUIDs، git SHAs، تجزئات NTLM التي هي بحد ذاتها دليل الاختراق. --llm يمرر كل مرشح إلى Claude (Opus 4.8)، محتفظاً بالأسرار الحقيقية ومتخلصاً من المعرفات الحميدة؛ المناطق المؤكدة بواسطة LLM تملأ باللون الأحمر.
ANTHROPIC_API_KEY=… screenscrub clean ~/Screenshots --out ~/clean --llm --yes
هذا يكسر مبدأ المحلية والصمت عن قصد: فهو يرسل سلاسل المرشح (الأسرار المكتشفة) إلى واجهة Anthropic API، لذا فهو اختياري فقط، يطبع تحذيراً، ويحتاج إلى مفتاح API. يفشل بشكل مغلق: أي خطأ API/شبكة يحتفظ بجميع النتائج (يخفي كل شيء) بدلاً من المخاطرة بإسقاط سر حقيقي. يقوم باستدعاء API واحد لكل صورة مرفوضة (بحد أقصى 4 استدعاءات متزامنة بغض النظر عن --jobs) — انتبه لمعدلات التحديد والتكلفة على الدلائل الكبيرة.
--watchscreenscrub clean ~/Screenshots --watch --sink file://./secrets.age --yes
يعالج كل ما هو موجود بالفعل، ثم يراقب الصور الجديدة/المعدلة ويخفي كل واحدة عند ظهورها. يتم تجاهل مخرجات *.redacted.png لتجنب الحلقات.
فوق رموز OCR، يجمع سكرين سكراب بين:
AKIA…، GitHub ghp_…، GitLab، Slack،
Stripe، OpenAI، GCP API keys، JWTs، ورؤوس PEM. (منسوخة، غير مستوردة، لتبقى صغيرة
وبالكامل دون اتصال.)postgres://u:p@…)، رؤوس HTTP Basic/Bearer auth،
تجزئات NetNTLMv2 و NTLM (pwdump)، تجزئات /etc/shadow، المفاتيح الخاصة بـ PuTTY
وOpenSSH، رموز SendGrid/npm.password، token=، secret، api_key، …) تضع علامة على
القيمة المجاورة حتى عندما لا تطابق أي نمط ولديها انتروبيا منخفضة.BEGIN/END ويخفي المنطقة المحيطة بأكملها بسخاء
بدلاً من الوثوق بمطابقات الكلمات الفردية.كل إصابة تُربط بمربعات البكسل للرموز التي تشكلها (إعادة بناء سطرين — متباعد ومتقارب — يسترجع الأسرار التي قسمها OCR على المسافات)، ويتم تبطين المربعات قبل الملء.
المصرف هو طريقة واحدة: Store(Secret) error. المحولات المرفقة:
file:// — ملف مشفر age محلي (افتراضي). لا تبعيات خارجية؛ مصفوفة JSON من
السجلات المشفرة إلى كلمة مرور age (أو إلى مستلمي age — راجع التشفير المعتمد على العتاد
أدناه).op:// — 1Password CLI. يقوم بتشغيل op item create بالقيمة على stdin
(أبداً في argv).keepassxc://./vault.kdbx — KeePassXC. مدير KeePass محلي شائع
عبر الأنظمة. يقوم بتشغيل keepassxc-cli add؛ كلمة مرور قاعدة البيانات والسر كلاهما
على stdin (أبداً في argv). كلمة مرور قاعدة البيانات هي كلمة المرور المحلولة
(--config/SCREENSCRUB_PASSPHRASE).keychain://screenscrub — سلسلة مفاتيح macOS. يقوم بتشغيل security add-generic-password. تحذير: أداة security تقبل السر فقط
كوسيط سطر أوامر، لذا فهي مرئية لفترة وجيزة للعمليات نفس المستخدم ps أثناء التشغيل
(macOS يخفي argv عن المستخدمين الآخرين). للنظافة الأفضل، فضل
1Password، KeePassXC، أو المستلم المعتمد على Secure Enclave أدناه.لإضافة مصرفك الخاص، قم بتنفيذ sink.SecretSink (internal/sink) وربطه في
sink.FromURI. هذا هو العقد كاملاً.
مصرف ملف age الافتراضي والعزل يمكن أن يشفروا إلى مستلمي age بدلاً من كلمة مرور، بما في ذلك المعتمد على العتاد عبر إضافات age:
# YubiKey (PIV) — قم بتثبيت age-plugin-yubikey، ثم:
screenscrub clean ~/Screenshots --out ~/clean \
--sink file://./secrets.age \
--recipient age1yubikey1q... --yes
# Apple Secure Enclave / Touch ID — قم بتثبيت age-plugin-se، ثم:
screenscrub clean ~/Screenshots --out ~/clean \
--recipient age1se1q... --yes
# زوج مفاتيح age عادي، أو عدة مستلمين / ملف مستلمين:
screenscrub clean ~/Screenshots --recipient age1abc... --recipients-file team.age.pub --yes
في وضع المستلم، لا حاجة لكلمة مرور؛ كل من المصرف والعزل المشفر يذهبان إلى المستلمين.
الاسترجاع باستخدام رمز العتاد:
age -d -i <identity> secrets.age (يطلب فك التشفير لمس YubiKey / Touch ID). التشفير إلى مستلم إضافة يحتاج إلى ثنائي age-plugin-<name>؛ فك التشفير يحتاج إضافياً إلى الجهاز.
openالمصرف والعزل يستخدمان مفاتيح منفصلة مشتقة من كلمة المرور الواحدة لديك
(HKDF)، لذا فإن اختراق أحد المخازن لا يمكنه فتح الآخر. نظراً لأن المفاتيح على القرص مشتقة،
قم بفك تشفيرها باستخدام سكرين سكراب بدلاً من age الخام:
screenscrub open ./secrets.age --out secrets.json # سجلات الأسرار
screenscrub open ~/clean/quarantine/shot.png.ab12cd34.age --out shot.png # أصل
يحاول open كل مفتاح مشتق تلقائياً ويكتب النص العادي إلى --out
(أبداً stdout). بالنسبة للمخازن في وضع المستلم، مرر ملف مفتاح age:
screenscrub open secrets.<id>.age --identity key.txt --out secrets.json (بالنسبة لـ YubiKey/Touch ID استخدم age -d -i مباشرة، الذي يشغل إضافة العتاد).
وضع المستلم يكتب ملفاً واحداً لكل سر (secrets.<hash>-<rand>.age) لذا
التشغيلات المتكررة لا تستبدل بعضها أبداً.
go test ./... # اختبارات الوحدة تعمل بدون tesseract؛ اختبارات OCR/re-OCR تُتجاوز إذا غاب
الضمان الرئيسي مغطى باختبار شامل: إنشاء لقطة شاشة مع
مفتاح AWS، تشغيل أنبوب OCR الحقيقي → الكشف → الإخفاء، إعادة OCR للمخرجات، وتأكيد
اختفاء السر (internal/redact).
سكرين سكراب ليس ترخيصاً للتوقف عن التفكير.
password:); سر في شكل لا
يعرفه سيمر دون اكتشاف.هو مضبوط لصالح الاستدعاء على الدقة — فهو يتعمد وضع علامات زائدة، لأن بيانات الاعتماد المتبقية في الصورة هي الحالة الكارثية والإيجابية الزائفة تكلفك فقط كتلة مخفية.
يمكنك رؤية حالة استخدام واقعية في مجلد testdata/، مأخوذة من لقطات شاشة RExpository:
https://jaimepolop.github.io/RExpository/
إنه ليس مثالياً، لكنه جيد جداً.
clean بإعادة OCR لها
وإعادة تشغيل الكشف؛ إذا كان أي سر لا يزال قابلاً للكشف فإنه يرفض
عزل أو تدمير الأصل ويضع علامة على الملف. يتم تبطين صناديق الإخفاء
بشكل متناسب مع ارتفاع الحرف بحيث تُغطى الحواف المناهضة للتعرج على النص الكبير/عالي الدقة.clean بكتابة النسخة المخفية، يتحقق منها، ثم
ينقل الأصل غير المخفي إلى عزل مشفر age ويزيله من موقعه الأصلي
— فقط بعد أن تكون النسخة المخفية نظيفة والأسرار المستخرجة بأمان على القرص.
تتطلب الخطوات المدمرة --yes.AK****…**LE). النسخة الوحيدة
بالنص العادي تعيش في الذاكرة حتى تصل إلى مصرفك المشفر.--purge وحدود الحذف الآمنافتراضياً، يتم الاحتفاظ بالأصول (مشفرة) في العزل بحيث يكون الإخفاء الزائف قابلاً للاسترداد.
--purge بدلاً من ذلك يمزق الأصل: الكتابة فوق بعشوائي، الكتابة فوق بأصفار، ثم إلغاء الربط.
الحذف الآمن غير موثوق. على أقراص SSD، أنظمة الملفات بنسخ عند الكتابة (APFS،
Btrfs، ZFS)، أنظمة الملفات المُسجلة، والأحجام الملتقطة/المدعومة،
الكتابة فوق ثم إلغاء الربط لا تضمن اختفاء البايتات الأصلية — توازن التآكل
واللقطات يمكن أن تحتفظ بها. الدفاع الوحيد الحقيقي هو عدم الاستمرار في النص العادي
في المقام الأول. فضل العزل المشفر، وعامل --purge كأفضل جهد.
OCR — إضافة مستقبلية محتملة.أنماط بيانات الاعتماد المنتسخة مشتقة من gitleaks (MIT).
| الوسيط | المعنى |
|---|
--out <dir> | مكان وضع النسخ المخفية (افتراضي: بجانب المصدر) |
--sink <uri> | file://./secrets.age · op://Vault · keepassxc://./v.kdbx · keychain://service · vault://KV |
--recipient <age1…> | تشفير إلى مستلم age (قابل للتكرار): X25519، YubiKey، أو Touch ID |
--recipients-file <f> | ملف مستلمي age، واحد في كل سطر |
--passphrase | كلمة المرور لمصرف الملف / العزل (فضل استخدام المتغير البيئي أو --config) |
--watch | استمر في التشغيل؛ معالجة لقطات الشاشة الجديدة لحظة ظهورها (fsnotify) |
--purge | تمزيق الأصول بدلاً من عزلهم (راجع التحذير أدناه) |
--keep-originals | كتابة نسخ مخفية فقط؛ ترك الأصول في مكانها (لا عزل، لا كلمة مرور، لا --yes) — حصري متبادل مع --purge |
--yes | تأكيد التعامل المدمر مع الأصول (مطلوب) |
--config <file> | إعدادات JSON؛ يتيح لك إبقاء كلمة المرور خارج argv |
--no-verify | تخطي التحقق بإعادة OCR من المخرجات المخفية (غير موصى به) |
-i, --interactive | فتح كل صورة مرفوضة وتأكيد الإخفاء/التخطي قبل لمسها |
--llm | استخدام Claude لتجاهل العلامات الزائدة الحميدة؛ يرسل سلاسل المرشح إلى واجهة Anthropic API |
--llm-api-key | مفتاح Anthropic API لـ --llm (أو ANTHROPIC_API_KEY) |
--jobs N | معالجة N صورة بالتوازي (افتراضي: عدد وحدات المعالجة) |
--manifest <file> | كتابة خريطة JSON من الأصل←المُخفى←المناطق |
--ocr-raw / --ocr-upscale N | تعطيل المعالجة المسبقة للمحطة المظلمة / التكبير قبل OCR |
--exclude-kind <kind> | إخفاء نتائج من نوع معين (قابل للتكرار)، مثلاً high-entropy — مقبض دقة دون اتصال |
--min-confidence <0..1> | إسقاط النتائج تحت هذه الثقة — مقبض دقة دون اتصال |
--json | إصدار التقرير بصيغة JSON |
--ignore <glob> | تجاهل glob، قابل للتكرار؛ ** يطابق أي عمق |
--lang | لغة tesseract (افتراضي eng) |
vault:// — HashiCorp Vault KV v2 — موجود ولكن مؤجل/أقل شيوعاً؛
المسار يجزئ السر بحيث لا يظهر أبداً في URL.