إرسال رسائل بين عميلين ، وكيفية التحقق من هوية المرسل؟

StackOverflow https://stackoverflow.com/questions/4086993

سؤال

لذا افترض أن لديك عميلين ، C1 و C2 ، كل عميل لديه GUID المرتبط به.

كيف يمكنك ، عندما تتلقى رسالة على C2 ذلك من المفترض يأتي من C1 (عن طريق التحقق من GUID ورؤية أنه يطابق GUID of C1) ، ولكن نظرًا لأن الرسالة غير مضمونة من C1 (ربما تكون C3 قد أرسلت الرسالة ، وإرسال GUID of C1 في رأس الرسالة) يجب أن يكون هناك بعض التحقق من أن الرسالة جاءت بالفعل من C1.

لقد كنت أبحث في استخدام التشفير غير المتماثل (RSA) للحصول على C1 إرسال رسالة تتكون من [C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE], ، ثم اترك C2 في الأساس إجراء فحص مثل هذا (رمز Python pseudo):

message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)

هل هذا نهج قابل للتطبيق؟ أم أن هناك طريقة أخرى ذكية/أكثر وضوحًا للتحقق من مرسل الرسالة؟

هل كانت مفيدة؟

المحلول

تم اختراع خوارزميات Assymmetric لمثل هذه الأغراض ، وهذه هي الطريقة التي تعمل بها التوقيعات الرقمية.

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

بالنسبة إلى RSA ، تحتاج إلى القيام بمزيد من العمل من أجل إنشاء توقيع رقمي من الخوارزمية الأساسية ، انظر Wikipedia لمزيد من التفاصيل: http://en.wikipedia.org/wiki/rsa#signing_messages

سأستخدم فقط خوارزمية توقيع رقمية من مكتبة. يظهر بحث Google الأول مع هذا Python:

http://www.example-code.com/python/pythonrsa.asp

http://www.chilkatsoft.com/dsa-python.asp

نصائح أخرى

تكمن المشكلة في هذه الطريقة في أن أي جهاز يمكنه بعد ذلك التقاط GUID و RSA-incrypted-incytry-incrypted وتمريرها بنفس الشيء. لم تنشئ حقًا أي معايير تحدٍ/استجابة فريدة لا يمكن تقسيمها إلا من قبل العميل المستلم. ما ستحتاجه سيكون شيئًا فريدًا تمامًا ولا يمكن الحصول عليه ببساطة من خلال النظر إلى المعلمات التي تم تمريرها. ربما شيء مثل:

[ClientName; RSA-ENCRYPTED(GUID+Timestamp); MESSAGE]

في هذه الطريقة ، سيتم تشفير RSA باستخدام المفتاح العام للعميل 2 بحيث يمكن لفتاح Client2 الخاص فقط فتحه. باستخدام ClientName ، يمكن لـ Client2 استرداد GUID المتوقع من مصدر البيانات ، ثم مطابقة GUID التي تم إرجاعها مقابل واحد في التشفير. قمت بدمج استخدام الطابع الزمني كملح بحيث تخرج السلسلة المشفرة بشكل مختلف في كل مرة. تعتبر ضعيفة للغاية استخدام الطابع الزمني كتوزيع عشوائي للملح ، لكنه يمر عبر. يمكن تنفيذ خوارزميات أخرى أكثر أمانًا/عشوائية.

أي شخص يتجسس الرسائل بين العميل والخادم سيتمكن من صياغة رسائل جديدة ، ولديه عميل GUID لا تتغير أبدا ولا RSA-ENCRYPTED-GUID.

فكر في التبديل إلى نموذج الرسالة: [GUID; ENCRYPTED_CONTENT_CHECKSUM; CONTENT].

Checksum(message.CONTENT) == 
    RSADescrypt(C1.PUBLIC_KEY, message.ENCRYPTED_CONTENT_CHECKSUM)

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

المفاتيح العامة والخاصة هي الطريق للذهاب. سأفترض أنك لا تهتم بتشفير البيانات ، لكنك تهتم بأن البيانات "مصرح بها".

دعنا نقول أن لديك 3 أجهزة كمبيوتر

Comp1 Comp2 Comp3

دعنا نقول أيضًا أنك تريد أن ترسل Comp1 رسالة إلى Comp3. أنت لا تهتم إذا تم اعتراض الرسالة ، لكنك تهتم بأنها لم يتم تزويرها.

سوف يوقع Comp1 رقميًا على الرسالة بمفتاحها الخاص

Comp2 سوف يعترض الرسالة من Comp1 إلى Comp3 ، ولكن لا يمكن تغيير الرسالة دون إبطال التوقيع

سيقوم Comp2 بإعادة توجيه الرسالة إلى Comp3

سيستخدم Comp3 المفتاح العام لـ Comp1 لفك تشفير التوقيع واستخدام التجزئة في التوقيع للتحقق من صحة المحتويات.

الآن إذا كنت ترغب في تشفير البيانات ، فأنت بحاجة إلى إضافة خطوة إضافية

سوف يوقع Comp1 رقميًا على الرسالة بمفتاحها الخاص

سيقوم COMP1 بإنشاء مفتاح تشفير عشوائي (عادةً AES) ويشفير الرسالة.

سوف يأخذ Comp1 مفتاح التشفير هذا وتشفيره بمفتاح Comp3 العام

سيؤدي Comp2 إلى اعتراض الرسالة ، لكن لا يمكن قراءتها بدون مفتاح Comp3 الخاص

سيقوم Comp2 بإعادة توجيه الرسالة إلى Comp3

سيستخدم Comp3 مفتاحه الخاص لفك تشفير مفتاح AES

سوف تقوم COMP3 بفك تشفير الرسالة بأكملها باستخدام مفتاح AES

سيقوم Comp3 بالتحقق من صحة الرسالة من خلال فك تشفير التوقيع باستخدام مفتاح Comp1 العام.

يحتوي التوقيع على تجزئة للرسالة ، إذا كانت التجزئة وتجزئة الرسالة ، فإن البيانات سليمة.

يمكنك تضمين GUIDS في الحمولة النافعة لاستخدامها كبحث عن المفاتيح العامة التي يجب استخدامها.

PS سترغب في استخدام الأساليب المضمنة للتوقيع على رسالة. دع الإطار يقوم بالتجزئة/الخ

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top