Discourse Encrypt (متروك)

Original Plugin Description
:discourse2: الملخص Discourse Encrypt يتيح الرسائل الخاصة المشفرة بين المستخدمين النهائيين. يتم تخزين جميع المعلومات الحساسة بأمان على الخادم، ويتم تشفيرها وفك تشفيرها فقط على جانب العميل.
:hammer_and_wrench: رابط المستودع https://github.com/discourse/discourse-encrypt
:open_book: دليل التثبيت كيفية تثبيت الإضافات في Discourse

ثلاث خطوات سهلة لاستخدام هذا البرنامج الإضافي

  1. تمكين التشفير وتفعيل الجهاز الحالي.

  1. إرسال رسالة مشفرة. يجب أن يكون المستلم قد مكن التشفير أيضًا.

اختياريًا، يمكنك تحديد الوقت الذي سيتم بعده تدمير الرسالة بأكملها أو المنشور المحدد بشكل دائم.

  1. قراءة الرسائل السرية. يجب تفعيل التشفير أولاً لقراءتها.

ملاحظة: في هذا المثال، طُلب من المستخدم إدخال مفتاح الورقة مرة أخرى لأن التشفير كان معطلاً (عن طريق تسجيل الخروج أو تعطيله صراحةً من شاشة التفضيلات).

معلومات تقنية

يمنح هذا البرنامج الإضافي المستخدمين إمكانية التواصل بأمان من خلال Discourse، باستخدام مخطط تشفير من طرف إلى طرف. يتم تنفيذ معظم منطق البرنامج الإضافي على جانب العميل، ويتعامل الخادم فقط مع المعلومات العامة أو المشفرة. لا يقوم بتشفير أي بيانات وصفية للمنشور، مثل أسماء المشاركين في المحادثة، وقت النشر، الإعجابات، الإجراءات الصغيرة، إلخ؛ يتم تشفير المرفقات، لكن وجودها ليس كذلك لأن النظام يجب أن يربط المرفقات بالمنشورات لمنع حذفها.

الكود بأكمله مفتوح المصدر ومحبو الأمان مرحب بهم لمراجعته. لأي معلومات إضافية، لا تتردد في الاتصال بي أو بالفريق. :slight_smile:

read more...

الملخص

الهدف من هذا البرنامج الإضافي هو تقديم سلامة وسرية المحتويات المشفرة، وحمايتها من تسرب المعلومات والمستخدمين غير المصرح لهم. تصف الأقسام التالية وضع التشغيل المعتاد، والخوارزميات المستخدمة، ونماذج التهديد.

لاستخدام هذا النظام، يقوم المستخدم بالتسجيل مرة واحدة عن طريق إنشاء “هوية مستخدم” تتكون من مفتاحين RSA بطول 4096 بت، واحد للتشفير والآخر للتوقيع. يمكن للمستخدمين تصدير “هويتهم” لحفظها بأمان أو تخزينها على الخادم، مشفرة بعد إنشاء مفتاح ورقي. هاتان الطريقتان تخدمان كاحتياطيات أو تُستخدمان لتسجيل أجهزة جديدة.

المفاتيح الورقية (مستوحاة من RFC 1751 و BIP-39) هي مفاتيح قابلة للقراءة بواسطة الإنسان تُستخدم لتخزين “هوية المستخدم” بأمان على الخادم. يتكون المفتاح الورقي من 12 كلمة عشوائية، مختارة من قائمة تحتوي على 2048 كلمة، مما يوفر 121 بتًا من الانتروبيا (تُستخدم الكلمة الأولى كعنوان). لتشفير “هوية المستخدم” باستخدام مفتاح ورقي، سيشتق النظام أولاً مفتاح التشفير باستخدام PBKDF2 لـ تمديد المفتاح الورقي إلى مفتاح AES-GCM بطول 256 بت.

إنشاء منشور مشفر

لإنشاء منشور جديد، سيقوم المستخدم (متصفحه) بما يلي:

  1. توقيع محتوى المنشور الحالي باستخدام مفتاح التوقيع الخاص به؛

  2. إنشاء “مفتاح موضوع” جديد (مفتاح AES-256-GCM) - والذي سيتم استخدامه لتشفير المنشور، وبعض البيانات الوصفية للمنشور وعنوان الموضوع الجديد (إذا كان متاحًا)؛

  3. جلب المفاتيح العامة لجميع المشاركين وتشفير “مفتاح الموضوع” لكل منهم؛

  4. إرسال المحتوى المشفر للمنشور (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

قراءة منشور مشفر

لقراءة منشور، سيقوم المستخدم (متصفحه) بما يلي:

  1. جلب حمولة المنشور المشفرة (نص المنشور الأصلي والتوقيع) ومفتاح الموضوع المشفر؛

  2. استخدام مفتاح التشفير الخاص به لفك تشفير مفتاح الموضوع المشفر؛

  3. استخدام مفتاح الموضوع المفكوك تشفيره لفك تشفير حمولة المنشور المشفرة؛

  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 يُستخدم لتشفير المنشورات الجديدة، ولكنه يُحتفظ به لمواصلة فك تشفير المنشورات القديمة. يتضمن البروتوكول الجديد أصالة النصوص المشفرة ويتم توقيع جميع المنشورات بالمفتاح الخاص للناشر.

موارد أخرى

99 إعجابًا
PMs are accesible by admins if the admin has the link
Are PMs truly private and not crawlable?
Can true private messages be implemented?
What to do if your Discourse is compromised
Notifications but not emails
Possible privacy flaw with DMs
Encrypted PGP Messaging
Spoiler for certain user groups?
End-to-end Encryption for Chat
Preserving user sessions when migrating between hosts
Make MP's actually private
Generate Paper Key?
Add a warning when checking personal messages from a user public profile, as an admin
Types of community & their characteristics
What personal data is collected and who can read/edit it?
We still have Discourse Encrypt plugin - Would running community updates cause any issues?
Matrix protocol for chat
Can you edit the admin menu?
Discourse Encrypt breaks replies on latest Discourse update
Upload not working in encrypted private message?
E-Mail Preview Summary: wrong number of arguments (given 10, expected 1)
When you started your first Discourse community, what did you find hard to do?
Search in Encrypted messages, like in ProtonMail or Wire
No backup warn link issue
How can a group have end-to-end encryption
Images disapper from the Builder Preview in encrypted message drafts after page reload
Is there anyway to change ‘secret’ to secure?
Can someone explain `post metadata was updated without being signed again`?
Encrypt plug-in issue
Generate Paper Key?
Can't activate encrypted messages on my phone - says my paper key is incorrect or the key pair is incorrect
Search engines and private messages?
TypeError: Cannot set property deleteTopic of [object Object] which has only a getter
PMs are accesible by admins if the admin has the link
Can Discourse function without emails entirely?
Discourse Encrypt breaks replies on latest Discourse update
Admins can see private messages in user's profiles?
Thoughts on Turning Off Personal Messaging and Chats
Spoiler but only admins can see it
Account creation not working with discourse_encrypt
Strategies for Isolating Plugin Secrets in Discourse
Disable watched words / censor in personal messages
Cannot Delete or Rotate Encryption Keys
How alert if admin/mods read users PM?
How alert if admin/mods read users PM?
Can we prevent an admin from seeing a private category?

تم تقسيم 11 مشاركة إلى موضوع جديد: إخفاء كامل للمشاركات الجزئية للعبة لعب الأدوار

كيف يمكنني تمكين إرسال الرسائل المشفرة إلى المجموعات؟ تم تمكين التشفير لجميع مستخدمي المجموعة ومرسل الرسالة، لكنني ما زلت أتلقى رسالة الخطأ:

“ليس لديك إذن لإرسال رسائل مشفرة إلى المجموعات.”

3 إعجابات

لا أعتقد أنه من الممكن حاليًا إرسال رسائل خاصة مشفرة إلى المجموعات.

إعجابَين (2)

هل هذا يعني أن صندوق البريد الجماعي سيصبح معطلاً؟ و/أو أن دعوة مجموعة إلى رسالة خاصة لن تعمل؟

هذا، لم يكن ذلك ممكناً في المقام الأول.

هل أحتاج إلى تقديم تقرير خطأ حول هذا العطل؟

يبدو كل شيء نشطًا باستثناء التأخير المعتاد في الفتح، ولكن الرسائل الخاصة غير مشفرة.

إعجاب واحد (1)

لا داعي للنشر في أكثر من مكان، ولكن إذا كنت تفضل تحويله إلى تقرير عن #مساهمة:خلل بدلاً من طلب #دعم، يمكنك اتباع هذه الإرشادات ثم إعادة تصنيفه - Writing an effective bug report

على الرغم من أن الأمر يستحق الإشارة إلى أن كلاً من تقارير الأخطاء وطلبات الدعم قد تستغرق وقتًا لاكتساب زخم، خاصة في عطلات نهاية الأسبوع.

5 إعجابات

:mega: للأسف، نظرًا لمعدل التبني المنخفض نسبيًا والتكلفة العالية للصيانة، سيتم إسقاط دعم discourse-encrypt بعد الإصدار المستقر التالي للنواة في الربع الأول من عام 2025.

تم تحديث الموضوع الأصلي لهذا النقاش بمعلومات إضافية، وسنقدم تحذيرًا تلقائيًا للمسؤولين عن المواقع المتأثرة.

14 إعجابًا

أمل في تطوير هذا في المستقبل.
هذا أمر مهم/مفيد جدًا في البيانات/سلسلة الكتل/الأمان.

7 إعجابات

تم تقسيم 10 مشاركات إلى موضوع جديد: لا تعرض المواضيع والرسائل الخاصة للمسؤولين إلا إذا كانوا مشاركين

متابعةً للنقاش من Discourse Encrypt (مهمل):
حان الوقت ويبدو أن آخر تحديث لـ Discourse غير متوافق مع Discourse Encrypt.

أعراضنا هي أن لا أحد قادر على الرد على منشور؛ يبدأ النظام في تحميل عرض الرد ولكنه لا يتمكن أبدًا من تحميل المحرر الفعلي.

إيقاف تشغيل Discourse Encrypt يزيل المشكلة، وإعادة تشغيله يعيد المشكلة.

نظرًا لأن هذه الإضافة مهملة، فأنا لا أبلغ عنها كخطأ، بل أبلغ عنها فقط حتى يتمكن الآخرون من توقع هذا السلوك.

أيضًا، إذا كان أي شخص يعرف موارد يمكننا الإشارة إليها للأفراد الذين يرغبون في تنزيل الرسائل المشفرة وفك تشفيرها في وضع عدم الاتصال، فسيكون ذلك موضع تقدير.

5 إعجابات