الأمان
صُمّم OpenKey بحيث لا يستطيع الخادم قراءة خزنَتك.
اشتقاق المفاتيح
- ينتج
Argon2id(email + master_password, salt)مفتاحاً رئيسياً. - يشتق المفتاح الرئيسي تجزئة مصادقة (تُرسل للخادم لتسجيل الدخول) ويلفّ مفتاح الخزنة.
- يشفر مفتاح الخزنة أسماء المجموعات وحمولات الإدخالات (AES-256-GCM).
- يُشتق مفتاح تشفير قاعدة البيانات المحلية من مفتاح الخزنة.
- كلمة المرور الرئيسية لا تغادر الجهاز أبداً.
ما يخزّنه الخادم
| يُخزَّن | لا يُخزَّن |
|---|---|
auth_hash | كلمة المرور الرئيسية |
| الملح ومعلمات KDF | مفتاح الخزنة كنص صريح |
| مفتاح الخزنة الملفوف (المشفّر) | أسماء المجموعات مفكوكة |
| نص مشفّر غير شفاف للبيانات والمرفقات والمؤسسات والمشاركات | حمولات الإدخالات كنص صريح |
إدخالات المنظمة المشتركة (encrypted_payload تحت مجموعات المنظمة) | مفتاح المنظمة كنص صريح (يفكّه العملاء عبر المفاتيح الملفوفة) |
تبقى العناصر المحذوفة بهدوء كـ tombstones حتى تتم مزامنة الأقران؛ آخر كتابة تفوز تستخدم revision لكل عنصر.
الرموز
- رموز JWT للوصول قصيرة العمر.
- تُجزَّأ رموز التحديث عند التخزين وتُدوَّر عند الاستخدام.
- نقاط المصادقة محدودة المعدل لكل عنوان IP.
نموذج التهديد
حدود الثقة
| المكوّن | افتراض الثقة |
|---|---|
| الجهاز / الخزنة المحلية | جذر الثقة أثناء الفتح؛ مستخدم نظام التشغيل قد يقرأ الذاكرة وملف قاعدة البيانات المشفّر |
| خادم المزامنة المستضاف ذاتياً | غير موثوق للسرية — ciphertext فقط؛ موثوق للتوافر ومقارنة auth_hash |
| إضافة المتصفح | موثوقة بنص الخزنة بعد الفتح؛ صفحات الويب لا تحصل على أسرار خارج التعبئة التلقائية المقصودة. <all_urls> مطلوب للملء/الالتقاط/WebAuthn على الويب المفتوح — انظر امتداد المتصفح |
| مضيف الرسائل الأصلية | جسر محلي فقط للتطبيق المفتوح؛ ردود عند فتح الخزنة فقط |
| CLI / جسر سطح المكتب | نفس ثقة جلسة التطبيق المفتوحة |
| الاقتران / Nearby على LAN | الأقران المقترنون يشاركون مفتاح جلسة؛ بعد ربط الخزنة يتبادلون مادة مفتاح الخزنة ويزامنون ciphertext على LAN — عامل الاقتران والربط كثقة كاملة بالخزنة |
ماذا يستطيع المهاجم وماذا لا يستطيع
| المهاجم | يستطيع | لا يستطيع (بالتصميم) |
|---|---|---|
| مسؤول خادم مخترق | حذف/حجب ciphertext واستبدال blobs ومراقبة بيانات وصفية | فك تشفير الإدخالات أو استعادة كلمة المرور من auth_hash وحده |
| MITM بدون TLS | اعتراض JWT وciphertext | قراءة النص الواضح بدون مفتاح الخزنة |
| جهاز مسروق وهو مقفل | هجوم غير متصل على الخزنة الملفوفة (كلمة مرور قوية مطلوبة) | الفتح بدون كلمة المرور / البيومترية |
| جهاز مسروق وهو مفتوح | قراءة النص الواضح من الذاكرة | — (خارج النطاق) |
| صفحة ويب خبيثة | طلب واجهة التعبئة؛ محاولة تصيّد | قراءة الخزنة كاملة عبر content scripts بدون وساطة |
| نظير منظمة/مشاركة خبيث | مشاركة ما فُكّ بمفاتيح لُفّت له | فك عناصر الخزنة الشخصية غير ذات الصلة |
| نظير Nearby خبيث | إرسال إدخالات / ادّعاء LAN Pro / استلام ciphertext بعد الربط | فتح Pro على منصات متجر IAP؛ فك ciphertext بدون مفتاح الخزنة المشترك |
غير أهداف صريحة
- لا استعادة لكلمة المرور الرئيسية — فقدانها يعني ciphertext غير قابل للاسترداد.
- الخادم لا يفكّ حمولات الخزنة أو المرفقات أو المنظمات أو المشاركات.
- المزامنة LWW حسب revision وليست CRDT — التعديلات المتزامنة قد تُستبدل؛ الخادم يعيد الصف الفائز عند رفض دفع قديم. مزامنة Nearby على LAN تستخدم نفس قاعدة LWW بين الأجهزة المقترنة والمرتبطة بالخزنة (وليست بديلاً عن النسخ الاحتياطي).
- شهادة LAN Pro تسهيل بين أجهزة مقترنة على منصات بلا IAP متجر — وليست إثبات شراء مشفّر.
قائمة تصلّيب تشغيلية
- عيّن
JWT_SECRETقوياً وفريداً (حد أدنى 32 حرفاً؛ تُرفض القيم النائبة عند الإقلاع). - استخدم HTTPS أمام الـ API في الإنتاج.
- اجعل
CORS_ORIGINSقائمة صريحة (بدون*). - أبقِ الخزنة مقفلة عند الخمول؛ فعّل الفتح البيومتري بحذر.
- استخدم الإعدادات ← الأمان ← صحة كلمات المرور لاكتشاف الضعيفة/المعاد استخدامها؛ فحص HIBP الاختياري يرسل بادئة تجزئة SHA-1 فقط (k-anonymity)، وليس كلمة المرور.
- عامل التصدير / النسخ الاحتياطي كمادة سرية — خزّنها دون اتصال ومشفّرة.
- اقرن أجهزة Nearby فقط مع من تثق بهم؛ ربط الخزنة يشارك مادة مفتاح الخزنة عبر جلسة LAN — ألغِ الاقتران لإبطال شهادات LAN Pro وإيقاف المزامنة.
- أبلغ عن الثغرات بخصوصية — انظر الإبلاغ عن الثغرات.
الإبلاغ عن الثغرات
إذا وجدت مشكلة أمنية في OpenKey (خادم، امتداد، CLI، وثائق، أو التطبيق)، أبلغ عنها بخصوصية.
لا تفتح issue عام على GitHub للثغرات القابلة للاستغلال.
- البريد: [email protected]
- أو افتح تنبيهاً أمنياً خاصاً تحت OpenSelfHosting
ضمّن الحزمة المتأثرة والإصدار/الـ commit إن عُرف وخطوات إعادة الإنتاج والأثر. نهدف للرد خلال 7 أيام. السياسة الكاملة في ملف SECURITY.md.
قواعد عملية
- اختر كلمة مرور رئيسية قوية — فهي جذر الثقة.
- اجعل
JWT_SECRET(الخادم) طويلاً وفريداً؛ تُرفض القيم النائبة عند الإقلاع. - فضّل HTTPS في الإنتاج وقيّد
CORS_ORIGINS(بدون*). - احتفظ بنسخة احتياطية من تصدير الخزنة / مواد الاستعادة دون اتصال.
ملاحظة حول الحزم
الحزم المنشورة تشمل الخادم وإضافة المتصفح وCLI والوثائق (MIT). قد يحتوي هذا المونوريبو على نسخة تطوير من تطبيق OpenKey للجوال/سطح المكتب للعمل عبر الحزم. راجع نظرة عامة والحزم.
لتفاصيل واجهة البرمجة، راجع README لحزمة openkey_server و/docs على خادم قيد التشغيل.