chore: Update the signature method

Signed-off-by: Awiteb <a@4rs.nl>
This commit is contained in:
Awiteb 2024-06-03 23:25:52 +03:00
parent b23355eced
commit 390e7e7e6a
Signed by: awiteb
GPG key ID: 3F6B55640AA6682F

View file

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