Original Plugin Description
| الملخص | Discourse Encrypt يتيح الرسائل الخاصة المشفرة بين المستخدمين النهائيين. يتم تخزين جميع المعلومات الحساسة بأمان على الخادم، ويتم تشفيرها وفك تشفيرها فقط على جانب العميل. | |
| رابط المستودع | https://github.com/discourse/discourse-encrypt | |
| دليل التثبيت | كيفية تثبيت الإضافات في Discourse |
ثلاث خطوات سهلة لاستخدام هذا البرنامج الإضافي
- تمكين التشفير وتفعيل الجهاز الحالي.
- إرسال رسالة مشفرة. يجب أن يكون المستلم قد مكن التشفير أيضًا.
اختياريًا، يمكنك تحديد الوقت الذي سيتم بعده تدمير الرسالة بأكملها أو المنشور المحدد بشكل دائم.
- قراءة الرسائل السرية. يجب تفعيل التشفير أولاً لقراءتها.
ملاحظة: في هذا المثال، طُلب من المستخدم إدخال مفتاح الورقة مرة أخرى لأن التشفير كان معطلاً (عن طريق تسجيل الخروج أو تعطيله صراحةً من شاشة التفضيلات).
معلومات تقنية
يمنح هذا البرنامج الإضافي المستخدمين إمكانية التواصل بأمان من خلال Discourse، باستخدام مخطط تشفير من طرف إلى طرف. يتم تنفيذ معظم منطق البرنامج الإضافي على جانب العميل، ويتعامل الخادم فقط مع المعلومات العامة أو المشفرة. لا يقوم بتشفير أي بيانات وصفية للمنشور، مثل أسماء المشاركين في المحادثة، وقت النشر، الإعجابات، الإجراءات الصغيرة، إلخ؛ يتم تشفير المرفقات، لكن وجودها ليس كذلك لأن النظام يجب أن يربط المرفقات بالمنشورات لمنع حذفها.
الكود بأكمله مفتوح المصدر ومحبو الأمان مرحب بهم لمراجعته. لأي معلومات إضافية، لا تتردد في الاتصال بي أو بالفريق. ![]()
read more...
الملخص
الهدف من هذا البرنامج الإضافي هو تقديم سلامة وسرية المحتويات المشفرة، وحمايتها من تسرب المعلومات والمستخدمين غير المصرح لهم. تصف الأقسام التالية وضع التشغيل المعتاد، والخوارزميات المستخدمة، ونماذج التهديد.
لاستخدام هذا النظام، يقوم المستخدم بالتسجيل مرة واحدة عن طريق إنشاء “هوية مستخدم” تتكون من مفتاحين RSA بطول 4096 بت، واحد للتشفير والآخر للتوقيع. يمكن للمستخدمين تصدير “هويتهم” لحفظها بأمان أو تخزينها على الخادم، مشفرة بعد إنشاء مفتاح ورقي. هاتان الطريقتان تخدمان كاحتياطيات أو تُستخدمان لتسجيل أجهزة جديدة.
المفاتيح الورقية (مستوحاة من RFC 1751 و BIP-39) هي مفاتيح قابلة للقراءة بواسطة الإنسان تُستخدم لتخزين “هوية المستخدم” بأمان على الخادم. يتكون المفتاح الورقي من 12 كلمة عشوائية، مختارة من قائمة تحتوي على 2048 كلمة، مما يوفر 121 بتًا من الانتروبيا (تُستخدم الكلمة الأولى كعنوان). لتشفير “هوية المستخدم” باستخدام مفتاح ورقي، سيشتق النظام أولاً مفتاح التشفير باستخدام PBKDF2 لـ تمديد المفتاح الورقي إلى مفتاح AES-GCM بطول 256 بت.
إنشاء منشور مشفر
لإنشاء منشور جديد، سيقوم المستخدم (متصفحه) بما يلي:
-
توقيع محتوى المنشور الحالي باستخدام مفتاح التوقيع الخاص به؛
-
إنشاء “مفتاح موضوع” جديد (مفتاح AES-256-GCM) - والذي سيتم استخدامه لتشفير المنشور، وبعض البيانات الوصفية للمنشور وعنوان الموضوع الجديد (إذا كان متاحًا)؛
-
جلب المفاتيح العامة لجميع المشاركين وتشفير “مفتاح الموضوع” لكل منهم؛
-
إرسال المحتوى المشفر للمنشور (Base64 مشفر) ومفاتيح الموضوع المشفرة (أيضًا Base64 مشفرة) لكل مشارك إلى الخادم.
سيكون الكود الوهمي لعملية التشفير شيئًا مثل:
signature = rsa_pss_sign(current_user.identity.sign_key.private, post.raw) # 1
topic_key = topic.key || generate_aes_256_gcm_key() # 2
encrypted_title = aes_256_gcm_encrypt(topic.title, topic_key) if topic.blank?
encrypted_post = aes_256_gcm_encrypt(signature + post.raw, topic_key)
encrypted_topic_keys = recipients.map { |r| rsa_oaep_encrypt(topic_key, r.identity.encryption_key.public) } # 3
$.put("/posts/create", { title: encrypted_title, raw: encrypted_post, keys: encrypted_topic_keys }) # 4
قراءة منشور مشفر
لقراءة منشور، سيقوم المستخدم (متصفحه) بما يلي:
-
جلب حمولة المنشور المشفرة (نص المنشور الأصلي والتوقيع) ومفتاح الموضوع المشفر؛
-
استخدام مفتاح التشفير الخاص به لفك تشفير مفتاح الموضوع المشفر؛
-
استخدام مفتاح الموضوع المفكوك تشفيره لفك تشفير حمولة المنشور المشفرة؛
-
جلب مفتاح التوقيع العام للناشر والتحقق من توقيع المنشور.
مجموعة الخوارزميات
يستخدم هذا البرنامج الإضافي على نطاق واسع البدع التشفيرية المطبقة في Web Crypto API، وهي متوفرة في أي من المتصفحات الحديثة التي يدعمها Discourse (باستثناء Internet Explorer).
-
getRandomValuesمولد الأرقام شبه العشوائية: يولد المفاتيح الورقية ومتجهات التهيئة (IVs) العشوائية بطول 96 بت. -
PBKDF2: يمدد مفاتيح الورقة بطول 132 بت إلى مفاتيح بطول 256 بت، تُستخدم لتشفير “هويات المستخدمين”.
-
AES-256-GCM: يُستخدم لتشفير محتوى كل منشور. كما يوفر المصادقة عن طريق إنتاج وسم مصادقة بطول 128 بت، لكن هذا جانب أقل أهمية لأن المنشورات يتم التحقق منها باستخدام توقيع تم إنشاؤه بواسطة الناشر (انظر الخطوة 1 أعلاه).
-
RSA-OAEP: يُستخدم لتشفير “مفاتيح الموضوع” و “هويات المستخدمين” للحفظ الآمن على الخادم. جميع مفاتيح RSA-OAEP بطول 4096 بت.
-
RSA-PSS: يُستخدم لتوقيع محتوى كل منشور للتحقق من الأصالة. جميع مفاتيح RSA-PSS بطول 4096 بت.
البدع التشفيرية
يستخدم النظام مجموعة من البدع التشفيرية المبنية على تلك التي يوفرها المتصفح عبر Web Cryptography API.
-
encrypt و decrypt: تُستخدم لتشفير وفك تشفير محتويات المنشور. تأخذ
encryptكائن JSON، ومفتاح AES-256-GCM، ومفتاح RSA-PSS العام وتخرج سلسلة واحدة مشفرة بـ Base64؛ تأخذdecryptسلسلة مشفرة بـ Base64 ومفتاح AES-256-GCM وتخرج كائن JSON الأولي؛ -
verify: تُستخدم للتحقق من محتويات المنشور بعد فك التشفير؛
-
exportKey و importKey: تُستخدم لتصدير واستيراد “مفاتيح الموضوع”؛
-
exportIdentity و importIdentity: تُستخدم لتصدير واستيراد “هويات المستخدمين”.
أنواع المفاتيح:
-
مفاتيح الموضوع (AES-256-GCM)
- تُستخدم لتشفير كل منشور في موضوع (يتم تشفير المنشورات بشكل فردي)
- يتم إنشاؤها لكل موضوع، على جانب العميل بواسطة الناشر الأصلي باستخدام بدع API
generateKeyفي WebCrypto - يتم تشفيرها بمفتاح المستخدم العام لكل مستخدم لديه حق الوصول إلى الموضوع المحدد باستخدام بدع API
wrapKeyفي WebCrypto - يتم تخزينها (مشفرة) على جانب الخادم لكل مستخدم في
PluginStore
-
زوج مفاتيح RSA (المفاتيح العامة والخاصة) (RSA-OAEP و RSA-PSS، 4096 بت)
- تُستخدم لتشفير جميع مفاتيح الموضوع التي يمكن للمستخدم الوصول إليها
- يتم إنشاؤها لكل مستخدم على جانب العميل بواسطة الناشر الأصلي باستخدام بدع API
generateKeyفي WebCrypto ومشاركتها بين جميع أجهزة المستخدم - على جانب الخادم: يتم تخزين الهوية العامة كما تم تصديرها من قبل العميل، لكن الهوية الخاصة سيتم دائمًا تشفيرها باستخدام مفتاح العبارة السرية
- على جانب العميل: يتم تخزين المفاتيح العامة والخاصة كـ
CryptoKeyفي IndexedDb؛ إذا لم يكن ذلك ممكنًا، فسيستخدمwindow.localStorage(في Safari)
-
مفاتيح العبارة السرية (مشتقة باستخدام PKBDF2 مع 128,000 تكرار)
- تُستخدم لتشفير “هويات المستخدمين” للحفظ الآمن على الخادم
- مشتقة من مفتاح ورقي (أو عبارة سرية للمستخدم لأغراض التوافق مع الإصدارات القديمة)
نماذج التهديد
اختراق مثيل Discourse
يمكن لمهاجم قادر على حقن نظرية الوصول إلى المعلومات المشفرة عن طريق تقديم كود ضار، يقوم بفك تشفير المحتوى المشفر وإرسال المنشورات النصية إلى خادم آخر. لجعل هذا ممكنًا، يكفي الوصول إلى حساب مسؤول وإنشاء مكون سمة بالكود الضار.
يمكن لآليات الحماية الافتراضية مثل CSP اكتشاف وتخفيف هجمات البرمجة النصية عبر المواقع (XSS) التي يمكن أن تمثل أيضًا طريقة لحقن الكود الضار.
هجوم الرجل في المنتصف
في هجمات الرجل في المنتصف، يقوم المهاجم باعتراض الاتصال بين المستخدم والخادم، مما يمنحه القدرة على القراءة أو تغييره. نظرًا لأن البرنامج الإضافي يشفر كل شيء قبل الإرسال، لا يمكن للمهاجم فك تشفير أي شيء عن طريق الاستماع فقط. وبالمثل، نظرًا لأن المعلومات يتم مصادقتها، لا يمكن للمهاجم تغييرها.
ومع ذلك، يمكن للمهاجم تقديم كود ضار مرة أخرى إلى المستخدم ومتابعة هجوم مشابه لذلك المعروض في القسم السابق. يتم التخفيف من ذلك جزئيًا بواسطة HTTPS، مما يقلل بشكل كبير من احتمال الهجوم.
ملاحظات
يتمتع البرنامج الإضافي بالفعل بتاريخ قصير ويمكن ملاحظته أثناء تصفح الكود المصدري وملاحظة التنفيذين المختلفين للبروتوكول v0 (الإصدار الأولي، ألفا-بيتا) و v1. لم يعد البروتوكول v0 يُستخدم لتشفير المنشورات الجديدة، ولكنه يُحتفظ به لمواصلة فك تشفير المنشورات القديمة. يتضمن البروتوكول الجديد أصالة النصوص المشفرة ويتم توقيع جميع المنشورات بالمفتاح الخاص للناشر.
