عدم تطابق تجزئة حمولة DiscourseConnect

مرحبًا،

أنا جديد في العمل مع Discourse و AWS، لذا آمل أن يتمكن أحدكم من المساعدة أو توجيهي في الاتجاه الصحيح. أحاول إعداد DiscourseConnect مع موقعي الإلكتروني، متبعًا التعليمات الواردة في هذا المنتدى https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045/1

في المثال الواقعي، عند تجزئة الحمولة المشفرة بترميز Base64، أحصل على قيمة مختلفة عن التوقيع.
الحمولة: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI= (تم حذف سطر جديد)
التوقيع: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
تجزئة HMAC الخاصة بي (المُنشأة باستخدام أدوات devglan عبر الإنترنت): 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

عند إنشاء توقيع لعنوان URL للإرجاع، أحصل على نفس النتيجة كما في الموقع، لذا لست متأكدًا تمامًا من سبب عدم تطابق الإجابات. إذا كنت قادرًا على تقديم أي توضيح حول سبب ذلك، فسأكون ممتنًا جدًا لذلك.

هل يمكنك مشاركة مثال للحمولة (payload)، والـ hash الذي حصلت عليه، والمفتاح السري؟ (تأكد من تغيير المفتاح السري في موقعك التجريبي قبل نشره هنا)

الأسطر الجديدة مهمة وتؤثر على التوقيع. يبدو أن أداة HMAC-SHA256 Generator Online تزيل الأسطر الجديدة قبل حساب الـ hash. قد تكون محظوظًا أكثر باستخدام أداة أخرى مثل Free Online HMAC Generator / Checker Tool (MD5, SHA-256, SHA-512) - FreeFormatter.com

أيضًا، تحتاج إلى حساب HMAC للحمولة المشفرة بتنسيق base64 والمشفرة عبر URL. لذا، لا يجب أبدًا حساب hash لحمولة تتضمن سطرًا جديدًا خام.

بدلاً من ذلك، يجب أن يكون %0A. إذا كنت تستخدم إطار عمل ويب، فضع في اعتبارك أنه قد يقوم بإلغاء تشفير الحمولة تلقائيًا. ستحتاج إلى إيجاد طريقة لتعطيل ذلك أو إعادة تشفير القيمة.

3 إعجابات

لم أجرب هذا على موقعي الإلكتروني بعد، أحاول استيعاب الخطوات يدويًا قبل القيام بذلك.

من منشور المنتدى المشار إليه سابقًا:

بالنظر إلى الإعدادات التالية:
نطاق Discourse: http://discuss.example.com
عنوان DiscourseConnect: http://www.example.com/discourse/sso
سر DiscourseConnect: d836444a9e4084d5b224a60c208dce14

محاولة تسجيل دخول المستخدم

  • تم إنشاء رمز nonce: cb68251eefb5211e58c00ff1395f0c0b
  • تم إنشاء الحمولة الخام: nonce=cb68251eefb5211e58c00ff1395f0c0b
  • تم ترميز الحمولة بـ Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n
  • تم ترميز الحمولة بـ URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D%0A
  • تم إنشاء HMAC-SHA256 على الحمولة المشفرة بـ Base64: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56

هنا أحصل على إجابة مختلفة. عندما استخدمت مُشفر HMAC الذي اقترحته على الحمولة المشفرة بـ Base64 وغير المشفرة بـ URL، حصلت على d26d5adf900de48890a0c3dcdeec108acd91b44a4b76c90c59955a5ba7b957f7 بدلاً من 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56. وعندما استخدمته على الحمولة المشفرة بـ URL، حصلت على 46e749cd26dcabc84eed323ff31f830da674dc87c77a2fcb1b296f76402ea900.

ومع ذلك، لاحقًا في البرنامج التعليمي، أثناء إنشاء الحمولة الجديدة:

تم إنشاء حمولة غير موقعة:
nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true
(الترتيب لا يهم، القيم مشفرة بـ URL)

تم ترميز الحمولة بـ Base64
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

تم ترميز الحمولة بـ URL
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

تم توقيع الحمولة المشفرة بـ Base64
3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

تم إنشاء هذا التوقيع عن طريق تجزئة الحمولة المشفرة بـ Base64 وغير المشفرة بـ URL، لذا فإنني غير متأكد قليلاً من سبب عدم عملها على الحمولة الأولى.

مثير للاهتمام! أنا أيضًا غير قادر على تكرار التوقيع باستخدام تلك الأداة المولدة عبر الإنترنت. في لغة Ruby، يمكنني فعل هذا، وهو يعمل كما هو متوقع:

pry(main)> OpenSSL::HMAC.hexdigest("sha256", "d836444a9e4084d5b224a60c208dce14", "bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n")
=> "2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56"

بناءً على حدس، جربت توليد التوقيع لسلسلة تحتوي على إرجاع carriage return و سطر جديد في النهاية (أي نهايات أسطر على نمط ويندوز)، وتمكنت من الحصول على نفس التوقيع الذي توفره أداة freeformatter.com

pry(main)> OpenSSL::HMAC.hexdigest("sha256", "d836444a9e4084d5b224a60c208dce14", "bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\r\n")
=> "200c03f1e5d7b859170be102b436d74f761040261be9682b4afec67eb908fabf"

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

6 إعجابات

شكرًا على اقتراحك! قمتُ بكتابة أجزاء من العملية بلغة JavaScript، وعند اختبارها (باستخدام مكتبات nodeForge و urlencode و js-base64) في RunKit، أعادت نفس النتيجة التي وردت في الدليل التعليمي.

3 إعجابات