Compare commits

..

No commits in common. "4dd4c8490bcb702cb7226124dbbb1d4e1dd46210" and "b23355ecedf9f472847ac8e4bbf4690ceb358187" have entirely different histories.

View file

@ -39,7 +39,7 @@ add_toc = true
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز [base58] على سبيل المثال
العنوان التالي `becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo`.
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` او في بيانات ال [Websocket] في المفتاح `public_key` ويجب
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` ويجب
ان يكون نص [base58] صحيح مكون من 33 بايت (264 بت).
> يجب على الخوادم عدم تخزين اسماء خوادم المرسلين الخارجيين، ويتم تحديده في الطلب المرسل من قبلهم فقط، حيث يعتبر المفتاح العام هو المعرف المشترك بين جميع الخوادم.
@ -69,11 +69,8 @@ add_toc = true
سوف يقوم مرسل الرسالة بوضع العنوان العام الخاص بالمستقبِل ليتم انتاج المفتاح
المشترك، بعد إنتاج المفتاح المشترك يتم ادخاله إلى دالة [HKDF] **بدون ملح**
بخوارزمية [Sha256] وبعد ذلك يتم عمل له توسعة (expand) بدون معلومات (info) بطول
32 بايت (256 بت).
### التشفير
سوف يتم استخدام [مفتاح التشفير المشترك] مفتاحاً للتشفير في خوارزمية
[AES-256 CBC]، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون
32 بايت (256 بت)، وسوف يتم استخدام هذه النتيجة مفتاحاً للتشفير في خوارزمية
AES-256 CBC، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون
اخر 16 بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
الرسالة.
@ -93,32 +90,20 @@ add_toc = true
> يقومون بتخزينه بالعادة.
## توقيع الطلب
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE` او في بيانات ال [Websocket] في المفتاح `signature`
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE`
بترميز [Hex] ويتم أستخدامه للتأكد من ان مرسل الطلب هو مالك المفتاح العام.
### إنشاء التوقيع
التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه
- مفتاح التشفير المشترك.
- جسم الطلب (body) او بيانات الحدث (data).
- ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق [Unix Time] (8 بايت أي 64 بت **big-endian**).
- 16 بايت عشوائي (128 بت).
التوقيع يحتاج إلى شيئين ليتم إنشائه
- جسم الطلب (body)
- ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق [Unix Time] (8 بايت أي 64 بت)
يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ[Websocket] إلى دالة [HMAC-SHA256] و إستخدام [مفتاح التشفير المشترك] مضافاً إليه الوقت الحالي (8 بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة [HMAC-SHA256] سوف يكون
يتم إدخال جسم الطلب في دالة [Sha256] وبعد ذلك يتم تشفير مخرج الدالة بخوارزمية
[AES-256 CBC] بـ[مفتاح التشفير المشترك] بين مرسل الطلب والخادم، بعد ذلك يتم
إضافة الوقت الحالي إلى النتيجة و إدخالها مرة أخرى إلى دالة [Sha256].
```
مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
```
بعد ذلك يتم أخذ نتيجة دالة [HMAC-SHA256] و إضافة الوقت المستخدم في الأعلى و الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز [Hex]، مثال
```
bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
```
بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي
- مخرج دالة [HMAC-SHA256]: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه الخادم)
- الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد [مفتاح التشفير المشترك])
- ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)
سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط).
> يجب ترميز التوقيع بـ[Hex] قبل وضعه في الرأس. يفضل ان يقوم الخادم بإنشاء توقيع
> الثانية الحالية والثانية السابقة والتحقق إذا كان التوقيع واحداً منهم
### شكل البيانات داخل إتصال الـWebsocket
بعد الإتصال بـ[Websocket] مع الخادم، سوف يكون تنسيق البيانات التي يتم تبادلها بين المرسل والخادم json ويجب عليها توفر المفاتيح التالية
@ -140,7 +125,7 @@ bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a69
"key": "value"
},
"public_key": "becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo",
"signature": "bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66"
"signature": "1a2fc26dc7ea5a2a4748b7cb2b1ef193d96ab2c99f93092f69e63075b28d1278"
}
```
@ -180,7 +165,7 @@ alice بإرسال طلب Get إلى الخادم يطلب فيه الدردشة
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
سوف يقوم الخادم اولاً بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب في جدول طلبات الدردشة **المُستقبلة** بالنسبة لـbob وسوف يضيفه إلى **المُرسلة** بالنسبة إلى alice ويرجع 200 ويقوم بإرسال طلب الدردشة إلى bob وينتظر رد bob، عندما يرد
سوف يقوم الخادم اولاً سوف يقوم الخادم بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب في جدول طلبات الدردشة **المُستقبلة** بالنسبة لـbob وسوف يضيفه إلى **المُرسلة** بالنسبة إلى alice ويرجع 200 ويقوم بإرسال طلب الدردشة إلى bob وينتظر رد bob، عندما يرد
bob بالموافقة ام الرفض (عبر إتصال ال [Websocket])، سوف يُعلم الخادم alice بأن
bob وافق او رفض التواصل معه (عبر إتصال الـ [Websocket] او إضافته إلى جدول ليعلمه عند تواصله مع الخادم). إذا لم يوافق bob سوف
يقوم الخادم بإضافة alice إلى قائمة bob السوداء، و إذا وافق سوف يتم إضافته إلى القائمة البيضاء.
@ -226,10 +211,6 @@ alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإ
- الرسائل والملفات بين الطرفين تكون مشفرة وتكون موقعة للخادم المراد التواصل مع
افراده.
## شكر و تقدير
شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.
- أمجد الشرفي <<me@amjad.alsharafi.dev>>: تحسين طريقة عمل التوقيع، و أقتراح الطريقة الحالية.
{{ hr(data_content="وصلات") }}
[^1]: طالما انك عضو في الخادم، سوف يعتقد الخادم دائماً انك في إتصال [Websocket] معه، ولن يقوم بترقية أي إتصال إلى [Websocket]
@ -239,7 +220,6 @@ alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإ
[^3]: للتاكد من انه الخادم فعلاً، لن يتم طلب منه المفتاح العام بشكل مباشر، بل سوف يتم جلبه من مسار الخاص به، وهو `/.well-known/oxidetalis/public`
[Websocket]: https://en.wikipedia.org/wiki/WebSocket
[HMAC-SHA256]: https://en.wikipedia.org/wiki/HMAC
[مفتاح التشفير المشترك]: #mfth-ltshfyr-lmshtrk
[Hex]: https://en.wikipedia.org/wiki/Hexadecimal
[Unix Time]: https://en.wikipedia.org/wiki/Unix_time