
مدير كلمات مرور محلي للجميع
<div align="center"> # APM **مدير كلمات مرور محلي أفضل للجميع.** [](https://golang.org) [](LICENSE) [](https://aaravmaloo.github.io/apm) [](https://github.com/aaravmaloo/apm/actions/workflows/ci.yml) [](https://github.com/aaravmaloo/apm/releases/latest) [](https://github.com/aaravmaloo/apm/stargazers) [](https://github.com/aaravmaloo/apm/issues) </div> APM هو مدير كلمات مرور سريع عبر سطر الأوامر (CLI) قائم على مبدأ المعرفة الصفرية، مكتوب بلغتي Go وRust. يخزّن **أكثر من 25 نوعًا من الأسرار المهيكلة** في خزنة مشفّرة واحدة — من كلمات المرور ورموز TOTP إلى مفاتيح SSH والسجلات الطبية والصور والملفات الثنائية. يُصدر هذا المستودع ملفين تنفيذيين: `pm` للاستخدام الشخصي و`pm-team` للخزائن التنظيمية المشتركة. --- ### لماذا APM؟ - **سريع وسهل التعلّم** — لا حاجة لحفظ الأوامر أو الأعلام. يطلب منك APM كل ما يحتاجه. تتوفر أيضًا أعلام سطر الأوامر للمستخدمين المتقدمين الذين يريدون أقصى سرعة. - **معرفة صفرية** — لا تُخزَّن كلمة المرور الرئيسية الخاصة بك أبدًا. تُشتق ثلاثة مفاتيح منفصلة بحجم 32 بايت باستخدام Argon2id. لا أحد غيرك يستطيع فك تشفير خزنتك. - **تشفير مزدوج** — اختر AES-256-GCM أو XChaCha20-Poly1305. سلامة مزدوجة الطبقة عبر HMAC-SHA256 فوق مصادقة AEAD. - **قابل للنقل** — ملف خزنة واحد، وملف تنفيذي واحد. خذ خزنتك إلى أي مكان. - **سحابة اختيارية** — زامن مع Google Drive أو GitHub أو Dropbox. اختياري بالكامل؛ لا حاجة إلى حساب لاستخدام APM. - **جاهز للذكاء الاصطناعي** — خادم MCP أصلي مع رموز محدودة النطاق حتى يتمكن Claude أو Cursor أو أي وكيل متوافق مع MCP من الوصول إلى خزنتك بأمان. - **جاهز للفرق** — تحكم كامل قائم على الأدوار (RBAC)، وأقسام، وسير عمل للموافقات، وخزائن مشتركة في `pm-team`. --- ### البدء السريع ```sh go build -o pm . pm setup # initialize vault and choose security profile pm unlock # start a session pm add # add a secret (interactive) pm get github # fuzzy search and retrieve pm lock # end session ``` **إصدار الفريق:** ```sh cd team go build -o pm-team . ``` --- ### أنواع الأسرار يدعم APM **25 نوعًا من الأسرار المهيكلة** مع حقول مُتحقَّق منها ومنطق عرض خاص بكل نوع: | # | النوع | # | النوع | |---|------|---|------| | 1 | كلمة المرور | 14 | سجل Docker | | 2 | TOTP | 15 | سر CI/CD | | 3 | هوية حكومية | 16 | ملاحظة آمنة | | 4 | سجل طبي | 17 | رموز الاسترداد | | 5 | معلومات السفر | 18 | شهادة | | 6 | جهة اتصال | 19 | الخدمات المصرفية | | 7 | Wi-Fi | 20 | مستند | | 8 | مفتاح API | 21 | ترخيص برمجي | | 9 | رمز مميز | 22 | عقد قانوني | | 10 | مفتاح SSH | 23 | صورة | | 11 | إعدادات SSH | 24 | صوت | | 12 | بيانات اعتماد سحابية | 25 | فيديو | | 13 | Kubernetes | | | --- ### الميزات **الأمان** - اشتقاق مفاتيح Argon2id بمعرفة صفرية — لا تُخزَّن كلمة المرور الرئيسية أبدًا - شفرتا AEAD مزدوجتان: AES-256-GCM وXChaCha20-Poly1305 - فحص سلامة مزدوج الطبقة بـ HMAC-SHA256 - أربعة ملفات تعريف أمنية قابلة للضبط: `standard` و`hardened` و`paranoid` و`legacy` - Watchtower (`pm watchtower`): درجة أمان من 0 إلى 100 مع كلمات مرور ضعيفة ومعاد استخدامها وقديمة ومخترقة (اختياري، مجهولة الهوية بـ k-anonymity) ومكشوفة، وعناصر على وشك الانتهاء، وتحقق ثنائي ومفاتيح مرور مفقودة، ومفاتيح محفوفة بالمخاطر وفحوصات الإعداد، إضافةً إلى درجات ثقة لكل عنصر ومراجعة للنشاط - كلمات المرور الخاطئة تضيف انتظارًا متزايدًا (وليس قفلًا دائمًا أبدًا)، مشتركًا بين CLI والتطبيق والإضافة - سجل تدقيق مقاوم للعبث مخزَّن خارج الخزنة **الخزنة** - ملف خزنة مشفَّر واحد — قابل للنقل عبر أي جهاز - مساحات للتقسيم المنطقي (مثل المجلدات) - بحث ضبابي مع متصفح تفاعلي وتنقل بلوحة المفاتيح - مفتش البيانات الوصفية: تاريخ الإنشاء، آخر وصول، عدد مرات الوصول، درجة الثقة **TOTP** - مؤقتات عد تنازلي مباشرة في قائمة تفاعلية - ترتيب مخصص دائم - نسخ مباشر: `pm totp github` - تكامل مع خادم الملء التلقائي لحقن رموز التحقق الثنائي تلقائيًا **المزامنة السحابية** - Google Drive (OAuth2 PKCE)، GitHub (PAT)، Dropbox (OAuth2 PKCE) - مشفَّرة من طرف إلى طرف — لا يرى المزوّدون النص الصريح أبدًا - `.apmignore` لتصفية الإدخالات لكل مزوّد - حل التعارضات: الكتابة فوق، أو الاحتفاظ بالمحلي، أو الإلغاء - مزامنة تلقائية في الخلفية **الجلسات** - فتح/قفل صريح مع انتهاء صلاحية قابل للضبط ومهلة خمول - جلسات مؤقتة مفوَّضة للأتمتة ووصول وكلاء الذكاء الاصطناعي **خادم MCP** - خادم Model Context Protocol أصلي - رموز أذونات محددة النطاق: `read` و`secrets` و`write` و`admin` - تنتظر عمليات الكتابة موافقتك في تطبيق سطح المكتب؛ لا يمكن للمساعدين الموافقة على تغييراتهم الخاصة - يعمل مع Claude Desktop وCursor وWindsurf وأي عميل MCP **الاسترداد** | العامل | الأمر | |--------|---------| | OTP عبر البريد الإلكتروني | `pm auth email` | | مفتاح الاسترداد | `pm auth recover` | | حصص النصاب (Shamir) | `pm auth quorum-setup` | | مفتاح مرور WebAuthn | `pm auth passkey register` | | رموز استرداد لمرة واحدة | `pm auth codes generate` | **الاستيراد / التصدير** | التنسيق | الاستيراد | التصدير | |--------|--------|--------| | JSON | `pm import json` | `pm export json` | | CSV | `pm import csv` | `pm export csv` | | TXT | `pm import txt` | `pm export txt` | **محرك السياسات** ```yaml name: corporate-standard password_policy: min_length: 14 require_uppercase: true require_numbers: true require_symbols: true rotation_policy: rotate_every_days: 90 notify_before_days: 14 ``` ```sh pm policy load ./policies/ ``` **إصدار الفريق (`pm-team`)** - التحكم في الوصول القائم على الأدوار (RBAC) مع أدوار متعددة - الأقسام مع نطاقات تشفير معزولة - سير عمل الموافقات للمدخلات الحساسة - خزائن مشتركة لمشاركة بيانات الاعتماد بين عدة مستخدمين --- ### إضافة المتصفح تملأ إضافة APM للمتصفح بيانات تسجيل الدخول، وتوفر رموزًا لمرة واحدة على المواقع التي تنتمي إليها، وتحفظ عمليات تسجيل الدخول الجديدة، وتنشئ مفاتيح المرور (passkeys) وتستخدمها. وهي لا ترى كلمة المرور الرئيسية الخاصة بك ولا المفتاح الخاص لأي مفتاح مرور. وتتواصل مع جسر صغير يقدمه APM على جهازك نفسه عند `127.0.0.1:41417` (اضبط `APM_BRIDGE_PORT` لاستخدام منفذ آخر). **ثلاث طرق للوصول إلى الخزنة** - مع تطبيق سطح المكتب: يعمل الجسر ما دام التطبيق مفتوحًا. تظهر طلبات الاقتران وعمليات فتح القفل من المتصفح في التطبيق. - مع واجهة سطر الأوامر (CLI) فقط، مع الربط (موصى به): شغّل `pm extension link` مرة واحدة. يسجّل هذا الأمر `pm` كمضيف مراسلة أصلي (native messaging host) مع كل متصفح من متصفحات Chromium (Chrome وEdge وBrave وArc وVivaldi وChromium)، ومنذ ذلك الحين يبدأ المتصفح تشغيل `pm` من تلقاء نفسه متى كان التطبيق مغلقًا. - مع واجهة سطر الأوامر (CLI) فقط، من الطرفية: شغّل `pm extension serve` واتركه مفتوحًا. يقدم هذا الأمر واجهة API نفسها التي يقدمها تطبيق سطح المكتب، ويعرض كل طلب فتح قفل أو إغلاق أو اقتران عند حدوثه. ```sh pm extension link # once per computer; confirm the code the extension shows pm extension serve # unlocks with your CLI session, or asks for the master password pm extension serve --locked # starts locked; unlock from the extension pm extension serve --idle 5m # locks after 5 minutes without browser activity (default 15m, 0 turns it off) ``` `pm extension serve` يطبع سطرًا عندما يكون الخزنة مفتوحة أو مقفلة. اضغط Ctrl+C لإيقافه؛ يُحذف مفتاح الخزنة من الذاكرة. إذا كان المنفذ مشغولًا، فإنه يخرج ويخبرك بأن تطبيق APM قد يكون يقدّم الإضافة بالفعل. **إقران متصفح** 1. في الإضافة، اختر Connect. تعرض الإضافة رمزًا من 6 أحرف، على سبيل المثال `K7M-2QX`. 2. تحقق من أن APM يعرض نفس الرمز: يفتح تطبيق سطح المكتب مربع حوار، ويسأل `pm extension link` أو `pm extension serve` في الطرفية، على سبيل المثال `Connect Chrome on macOS? Code K7M-2QX [y/N]`. 3. وافق عليه. تتلقى الإضافة رمزها المميز وتصبح مقترنة. تنتهي صلاحية الطلب بعد دقيقتين، ويمكن لطلب واحد فقط الانتظار في كل مرة. يرفض `pm extension serve` الطلبات من تلقاء نفسه عندما لا يعمل في طرفية. للإقران يدويًا بدلًا من ذلك، شغّل `pm extension token --show` والصق الرمز المميز في حقل الإقران اليدوي في الإضافة. **الأوامر** | الأمر | ما يفعله | |---------|--------------| | `pm extension link [--browser chrome,edge] [--no-wait]` | السماح للمتصفح بتشغيل `pm` للإضافة عندما يكون تطبيق سطح المكتب مغلقًا | | `pm extension unlink` | منع المتصفحات من تشغيل `pm`. يبقى الإقران محفوظًا | | `pm extension status [--port N]` | عرض المتصفحات المرتبطة، وما يقدّم الإضافة الآن، وحالة قفل الخزنة وعدد العناصر، وبصمة الرمز المميز | | `pm extension serve [--port N] [--locked] [--idle 15m]` | تقديم الإضافة من هذه الطرفية حتى Ctrl+C | | `pm extension token [--show]` | طباعة رمز الإقران المميز، مقنّعًا ما لم يُعطَ `--show` | | `pm extension rotate` | استبدال رمز الإقران المميز. يجب على كل متصفح مقترن أن يقترن مرة أخرى. يلتقط الجسر قيد التشغيل الرمز المميز الجديد عند طلبه التالي | | `pm totp link <entry> <domain>` | ربط رمز لمرة واحدة بموقع حتى تقدّمه الإضافة هناك | | `pm totp unlink <entry> [domain]` | إزالة روابط المواقع الخاصة برمز لمرة واحدة | يعرض `pm get` مفاتيح المرور التي يملكها تسجيل الدخول والرمز لمرة واحدة المرتبط به، ويعرض `pm totp` الموقع المرتبط بكل رمز. **كيف يبقى الجسر خاصًا** - يستمع فقط على `127.0.0.1` ويجيب فقط على الطلبات الموجهة إلى `127.0.0.1` أو `localhost`، مما يمنع إعادة ربط DNS. - يرفض أي طلب يكون `Origin` الخاص به صفحة ويب. فقط أصول `chrome-extension://` و`moz-extension://` و`safari-web-extension://` تحصل على ترويسات CORS. - كل استدعاء باستثناء الإقران يحتاج إلى رمز الإقران المميز، المخزّن في `bridge_token` في دليل إعدادات APM الخاص بك ويُقارن بزمن ثابت. - لا تتضمن استدعاءات القائمة والتفاصيل قيمًا سرية أبدًا. تطلب الإضافة حقلًا واحدًا في كل مرة عند الكشف أو التعبئة، ويسجّل APM ذلك الوصول. - تُنشأ مفاتيح المرور وتُوقّع داخل APM. ترسل الإضافة أصل الموقع وتجزئة لبيانات العميل، ويتحقق APM من أن الموقع قد يستخدم ذلك الطرف المعتمد قبل أن يوقّع. **عدة مواقع لكل تسجيل دخول** يحتفظ تسجيل الدخول بعنوانه الرئيسي في `website` وأي عناوين أخرى في `urls`، وتُعرض كـ "Other websites" في تطبيق سطح المكتب. تقدّم الإضافة تسجيل الدخول على صفحة تطابق أيًا منها. افتراضيًا، المطابقة هي نفس النطاق القابل للتسجيل، لذا يتطابق كل من `accounts.google.com` و`mail.google.com` مع `google.com`. - من النافذة المنبثقة يمكنك إضافة الموقع الذي أنت عليه إلى تسجيل دخول، وإضافة المواقع أو إزالتها، وحفظ تسجيل دخول جديد بأكثر من موقع واحد. - إذا ملأت تسجيل دخول على موقع غير محفوظ له، تسأل الإضافة أولًا. اختر "Fill and remember" لملئه وإضافة ذلك الموقع إلى تسجيل الدخول. - يفعل `pm totp link <entry> <domain>` الشيء نفسه لرمز لمرة واحدة. **شعارات المواقع** يعرض تطبيق سطح المكتب والإضافة شعار كل تسجيل دخول بدلًا من حرفه الأول. يجلب APM الشعار بنفسه، من الموقع نفسه، ولا يسأل خدمة أيقونات مفضلة تابعة لطرف ثالث أبدًا، والتي كانت ستعرف كل موقع في خزنتك. - ما: مضيف أول موقع إلكتروني لتسجيل الدخول (يستخدم رمز لمرة واحدة موقعه المرتبط)، بأحرف صغيرة وبدون `www.` أو منفذ. لا يتم جلب `localhost` أو عناوين IP أو `.local` أو `.internal` أو الأسماء التي لا تحتوي على نقطة أبدًا. - كيف: يقوم APM بتحميل `https://<host>/` (بحد أقصى 512 KiB)، ويختار أفضل أيقونة تعلن عنها الصفحة (`apple-touch-icon`، ثم أكبر PNG، ثم SVG)، ويرجع إلى `https://<host>/favicon.ico`. HTTPS فقط، بحد أقصى 3 عمليات إعادة توجيه، 6 ثوانٍ لكل موقع، صور حتى 256 KiB، بدون ملفات تعريف ارتباط. يتم رفض العناوين التي تُحل إلى نطاقات loopback أو الخاصة أو link-local أو CGNAT. تذهب الطلبات مباشرة إلى الموقع، وليس عبر وكيل النظام. - متى: فقط أثناء فتح الخزنة وتشغيل تطبيق سطح المكتب أو `pm extension serve`، بحد أقصى 4 مواقع في المرة الواحدة. تتم إعادة محاولة الموقع الفاشل بعد 3 أيام؛ ويتم تحديث الشعار بعد 30 يومًا. - أين: `icons/` في دليل إعدادات APM الخاص بك (`~/Library/Application Support/apm/icons` على macOS، `~/.config/apm/icons` على Linux، `%AppData%\apm\icons` على Windows). يتم تسمية كل ملف بواسطة SHA-256 الخاص بمضيفه، ويتم الاحتفاظ بحد أقصى 2000 ملف. ذاكرة التخزين المؤقت غير مشفرة: كل ملف `.json` بجوار صورة يسمي مضيفه، لذا يمكن لأي شخص يستطيع قراءة دليل إعداداتك رؤية المواقع التي لديها شعارات. - ما الذي يعرفه الموقع: عنوان IP الخاص بك وأن APM طلب أيقونته (وكيل المستخدم هو `APM/<version> (+icon)`). لا شيء عن حسابك. - إيقاف ذلك: في تطبيق سطح المكتب، الإعدادات، المظهر، أوقف "Show website icons" (إعداد الخزنة `siteIcons`، والذي يحترمه `pm extension serve` أيضًا)، واختر "Clear icon cache" لحذف ذاكرة التخزين المؤقت. اضبط `APM_ICONS_OFFLINE=1` لإيقاف كل عملية جلب من عملية ما، على سبيل المثال في الاختبارات أو CI. لا تزال الشعارات المخزنة مؤقتًا معروضة حتى تقوم بمسحها. --- ### ملفات تعريف الأمان | الملف التعريفي | ذاكرة Argon2 | التكرارات | التوازي | حالة الاستخدام | |---------|--------------|------------|-------------|----------| | `standard` | 64 MB | 3 | 2 | معظم الأجهزة | | `hardened` | 256 MB | 5 | 4 | محطات العمل (≥8 GB RAM) | | `paranoid` | 512 MB | 6 | 4 | الخوادم (≥16 GB RAM) | | `legacy` | PBKDF2 | 600,000 | 1 | التوافق مع الإصدارات السابقة | يكتشف APM تلقائيًا أنوية المعالج وذاكرة الوصول العشوائي (RAM) للتوصية بالملف التعريفي الأمثل أثناء `pm setup`. ### حالة التطوير والتاريخ (هذه الملاحظة من المالك) اعتبارًا من 30 مارس 2026، أعمل حاليًا على واجهة المستخدم الرسومية (GUI) لـ APM. في البداية بدأ كتطبيق CLI. تشرح المشكلة #38 كل شيء بالتفصيل. بشكل عام، أريد أن يصل APM إلى شريحة سكانية أكبر. سأبقي واجهة المستخدم الرسومية منفصلة في مستودع apm-gui أو أنشئ منظمة وأنقل كلا المستودعين إليها. بدأت APM كمشروع شخصي حقًا. بدأ في أمسية عشوائية، عندما أردت إنشاء مدير كلمات المرور الخاص بي. كنت قد سئمت من zoho password، لأنني استخدمته لرموز TOTP. كان بطيئًا بشكل لا يصدق حتى يعمل، وكنت أستخدم ملفات نصية عادية لرموزي، وهو أمر غير آمن. حتى الآن، لا أخطط للتخلي عن المشروع أو إيقافه. سيبقى فعالًا لفترة طويلة. أحاول تحسينه كل يوم واستخدامه كل يوم. في بعض الأحيان، قد يكون المستودع غير نشط، وذلك عندما أختبر التطبيق وأجري تجارب عليه. --- ### هيكل الإصدارات | الطبقة | مستقرة؟ | آمنة للخزنة؟ | الغرض | |------|---------|-------------|---------| | Canary | ❌ | ❌ | معاينة الميزات المبكرة — يمكن أن تفسد الخزائن | | Alpha | ❌ | ✅ | ميزات غير مستقرة، يتم الحفاظ على سلامة الخزنة | | Beta | ✅ | ✅ | ميزات مختبرة بالكامل، طرح حذر | | Stable | ✅ | ✅ | إصدارات جاهزة للإنتاج | > احتفظ دائمًا بنسخة احتياطية من خزنتك قبل تجربة إصدارات Canary. ملاحظة: بالنسبة لبعض الإصدارات، قد لا يتم إصدار بعض الطبقات اعتمادًا على مدى سرعة وسهولة شحنها دون إنشاء طبقات أكثر من اللازم. --- # استخدام الذكاء الاصطناعي تطوير APM وصيانة المجموعة بأكملها ليس بالأمر السهل القيام به دفعة واحدة. لذلك، نستخدم **25%** من الشيفرة المولّدة بالذكاء الاصطناعي (معظمها تغييرات في واجهة المستخدم وتغييرات غير حرجة وغير متعلقة بالتشفير). ومع ذلك، لدينا في APM بعض السياسات لاستخدام الذكاء الاصطناعي؛ وهي مدرجة أدناه. - يُستخدم الذكاء الاصطناعي فقط لتطوير ميزات صغيرة وميزات لا تتعارض مع الخزنة (vault) - يجب التعامل مع تعديلات الذكاء الاصطناعي بعناية ومراجعتها بدقة - يجب اختبار تعديلات الذكاء الاصطناعي اختبارًا شاملًا تضمن هذه السياسات أننا نستخدم الذكاء الاصطناعي بمسؤولية ونجعل APM أفضل للجميع! ### التوثيق التوثيق الكامل على **[aaravmaloo.github.io/apm](https://aaravmaloo.github.io/apm)** - [التثبيت](https://aaravmaloo.github.io/apm/getting-started/installation/) - [الخطوات الأولى](https://aaravmaloo.github.io/apm/getting-started/first-steps/) - [مرجع CLI](https://aaravmaloo.github.io/apm/reference/cli/) - [البنية](https://aaravmaloo.github.io/apm/concepts/architecture/) - [التشفير](https://aaravmaloo.github.io/apm/concepts/encryption/) - [إصدار الفريق](https://aaravmaloo.github.io/apm/guides/team-edition/) - [تكامل MCP](https://aaravmaloo.github.io/apm/guides/mcp-integration/) - [المساهمة](https://aaravmaloo.github.io/apm/contributing/) --- ### المساهمة المساهمات مرحّب بها. راجع [CONTRIBUTING.md](https://aaravmaloo.github.io/apm/contributing/) للإرشادات. --- ### الترخيص [GPL-3.0 License](https://github.com/aaravmaloo/apm/blob/master/LICENSE) © Aarav Maloo