نود تكليفنا بتطوير إضافة (Plugin) تتيح المراسلة الخاصة المشفرة بين المستخدمين النهائيين.
هذه الإضافة موجودة الآن ويتم دعمها رسميًا، راجع Discourse Encrypt (deprecated)
في الوقت الحالي، توجد وسائل قليلة جدًا عبر الإنترنت للتواصل الآمن والخاص طويل الأمد. الأدوات الحالية غالبًا ما تكون معقدة للغاية وتتطلب مهارات تقنية متقدمة للاستخدام. ونتيجة لذلك، يتم تنفيذ معظم التواصل “الخاص” بشكل “قصير” عبر تطبيقات مثل Telegram أو Skype أو WhatsApp. بالإضافة إلى ذلك، فإن هذا النمط من التواصل الجماعي غير قابل للتدقيق بشكل صحيح لأنه يعتمد على أدوات ذات مصدر مغلق وبروتوكولات مغلقة المصدر في كثير من الأحيان.
نود بناء حل سهل الاستخدام وقابل للتدقيق للمراسلة المشفرة ضمن إضافة مخصصة لمنصة Discourse.
لتحقيق ذلك، نود الاعتماد على المبادئ التالية:
-
بناء الحل على Web Crypto API.
-
قيام الخادم بتخزين مفتاح خاص مشفر و مفتاح عام لكل مستخدم.
-
قيام الخادم بتخزين مفتاح محادثة مشفر لكل مشارك في الرسائل الخاصة (مُشفّر باستخدام المفتاح الخاص للمستخدم النهائي).
-
تخزين جميع تنسيقات Markdown والعناوين في شكلها الخام المشفر لكل رسالة (مُشفّر باستخدام مفتاح المحادثة).
-
القبول بالقيود التالية: معرفة الخادم لمن تحدث مع من ومتى (نحن نحمي فقط “المحتوى”). والقبول بأن وظيفة البحث لن تعمل مع هذا المحتوى.
تجربة المستخدم المقترحة
تنتقل Jane إلى صفحتها الشخصية وتضغط على زر “تمكين المراسلة المشفرة”. بمجرد الضغط، يُطلب منها إدخال سر، مع توضيح واجهة المستخدم بوضوح أنه في حال نسيان هذا السر، لن تتمكن أبدًا من الوصول إلى رسائلها المشفرة مرة أخرى.
بمجرد تمكين المراسلة المشفرة، سيظهر عنصر جديد [ ] في واجهة إنشاء الرسالة مع النص [ ] encrypt message. سيكون هذا العنصر قابلاً للنقر فقط إذا كان جميع المستلمين قد قاموا بتمكين “المراسلة المشفرة”. إذا لم يكن لدى بعض المستخدمين مفاتيح عامة، وعند محاولة النقر عليه، ستظهر الرسالة: “عذرًا، لكن بعض المشاركين لم يفعّلوا المراسلة المشفرة”.
تقرر Jane أنها ترغب في التحدث بشكل خاص مع Pete، فتضيفه إلى قائمة المشاركين وتضغط على encrypt message ثم ترسل رسالة إلى Pete.
يتلقى Pete إشعارًا يفيد بأن Jane أرسلت له رسالة مشفرة. لا يوجد عنوان، فقط معلومات تفيد بوجود رسالة مشفرة وروابط للرسالة (في كل من الإشعارات البريدية والإشعارات على الويب).
إذا كان Pete يستخدم الجهاز الأصلي الذي تم فيه تمكين المراسلة المشفرة، فقد تم إدخال عبارة المرور السرية مسبقًا وتم تخزين بيانات الاعتماد بالفعل في قاعدة بيانات Index. أما إذا كان Pete يستخدم جهازًا جديدًا، فسيُطلب منه إدخال عبارة المرور السرية لتفعيل المراسلة المشفرة.
تعرض واجهة المستخدم بشكل واضح طبقة تراكب أو تلميح مرئي لإظهار أن الرسالة مشفرة.
بمجرد بدء التواصل بين Jane و Pete، يمكن لأي منهما دعوة أشخاص جدد إلى المحادثة بشرط أن يمتلكوا مفاتيح عامة.
يمكن لـ Pete أو Jane تغيير عبارة المرور السرية في أي وقت يرغبون فيه؛ وفي حال فعلوا ذلك، سيتم إعادة تشفير المفتاح الخاص باستخدام العبارة الجديدة وإرسالها إلى الخادم. (في الإصدار V1، لن نسمح بتغيير المفتاح الخاص الفعلي، بل فقط عبارة المرور).
التفاصيل التقنية
في أي وقت، لن يتم إرسال أي محادثات خاصة غير مشفرة أو بيانات اعتماد خاصة إلى الخادم. الثقة الوحيدة الممنوحة للخادم هي أن أحدًا لم يتلاعب بحزمة JavaScript المرسلة إلى العميل.
سيتم توليد أزواج المفاتيح الخاصة والعامة بنسبة 100% على جانب العميل، ثم سيتم تشفير المفتاح الخاص باستخدام تشفير AES المتماثل قبل تسليمه إلى الخادم لحفظه بأمان. سنقوم بتمديد عبارة المرور باستخدام ملح (salt) يتم توليده عشوائيًا ويتم تخزينه على الخادم. سيتم تنفيذ تمديد المفاتيح على جانب العميل باستخدام PBKDF2 (متوفر في Web Crypto API). سيتم تخزين زوج المفتاح الخاص/العام على جانب العميل في IndexDB باستخدام كائن CryptoKey غير قابل للتصدير. سيتم إزالة بيانات CryptoKey القابلة للتصدير من الذاكرة في أسرع وقت ممكن.
سيتم تخزين المفتاح الخاص المشفر والمفتاح العام في حقول مخصصة للمستخدم. فقط current_user مسموح له بقراءة/كتابة المفتاح الخاص المشفر، بينما يُسمح لجميع المستخدمين المسجلين بقراءة المفاتيح العامة لجميع المستخدمين.
سيتم توليد مفاتيح المحادثة على جانب العميل عند بدء المحادثة أو عند الدعوة، وسيتم تشفيرها باستخدام جميع المفاتيح العامة المشاركة في المحادثة. سيتم تخزين هذه البيانات في جدول مخصص (user_id, topic_id, encrypted_conversation_key)، ويمكن لأي مستخدم في المحادثة إنشاء هذا السطر، لكن فقط current_user == user_id مسموح له بقراءته.
سيتم اتخاذ عناية خاصة لعدم تسريب أي بيانات غير مشفرة إلى الخادم، بما في ذلك ضمان عدم تخزين المسودات بشكل غير مشفر.
لتجنب فئة كبيرة من الأخطاء، سيتم استخدام عناصر DOM جديدة (مع معرفات جديدة) لمحرر ومعاينة المؤلّف (Composer). لن تحتوي .d-editor-input الحالية إلا على كتل مشفرة، وسيتم تعطيل المعاينة التقليدية (مما يعني وجود مجالين للنص: مشفر وغير مشفر). سيتم تأخير التشفير بشكل كبير (debounced) لتجنب فئة من مشاكل الأداء.
بالنسبة للإصدار V1 (ونطاق هذا العنصر)، نحن سعداء بتجاهل ميزات معينة، بما في ذلك دعم رفع الملفات، وعرض الروابط (oneboxing) للمحتوى المشفر، وحالات الحافة المعقدة الأخرى.
نحن موافقون على فك التشفير/التحضير وعرض HTML عبر قائمة بيضاء (whitelister) عند عرض هذا المحتوى الخاص.
متطلبات التوثيق
قبل التنفيذ، سيتم إنشاء مواصفات مفصلة للغاية تتضمن نماذج ويب (web mockups) والأهم من ذلك نظرة عامة مفصلة على الأمان.
متطلبات الاختبار
يجب أن تتضمن هذه الإضافة مجموعة شاملة من اختبارات الوحدة والاختبارات التكاملية على جانب العميل والخادم. إذا تقبلتم هذا المشروع، فاكتبوا الاختبارات مبكرًا، ولا تنتظروا حتى ينتهي المشروع لتضمين الاختبارات لاحقًا.
المخاوف
العديد من المخاوف المذكورة في: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/ لم تعد ذات صلة نظرًا لـ Web Crypto API (توليد البايتات العشوائية الحقيقية، تخزين المفاتيح الخاصة، والقائمة تطول). المتجه الرئيسي الوحيد المتبقي هو إرسال الخادم لـ JavaScript خبيث للعميل. على المدى القصير، من المتوقع أن يثق المستخدمون بالخادم بنفس طريقة ثقتهم بـ 1password و LastPass وواجهات أمان الويب الأخرى. على المدى الطويل (الإصدار v3/v4 - العام المقبل أو بعده)، يمكننا النظر في إصدار امتداد للمتصفح يضع قفلًا على المواقع حيث جميع تجزئات استقرار حزم JavaScript معروفة جيدًا.
لا يزال Web Crypto API حديثًا نسبيًا لكنه مدعوم على نطاق واسع، ويجب أن تعمل الإضافة عبر جميع المتصفحات المدعومة لدينا.
نماذج أولية تقريبية بسيطة
* عند بدء رسالة، يمكن للمستخدم اختيار تشفير المحادثة، وسيتم عرض تحذير إذا كان أي من المشاركين يفتقر إلى مفاتيح عامة.
* يمكن للمستخدمين تمكين الرسائل المشفرة بالضغط على هذا الزر والعمل من خلال واجهة مستخدم تولد زوج المفاتيح.
إذا تم تمكين الرسائل المشفرة، فيجب أن تظهر ببساطة عبارة “لقد قمت بتمكين المراسلة المشفرة”.
* نوع من الأيقونة أو الطبقة التراكبية سيوضح أن الرسالة مشفرة.
الميزانية
هذا مشروع معقد للغاية يتطلب تكاملًا عميقًا ومراجعة دقيقة. نتوقع أن يكون الاختبار ممتازًا للغاية (باستخدام اختبارات على جانب العميل والخادم). ميزانيتنا الحالية للنموذج الأولي القابل للتطبيق (MVP) هي 10,000 دولار أمريكي.


