في المثال الواقعي، عند تجزئة الحمولة المشفرة بترميز Base64، أحصل على قيمة مختلفة عن التوقيع.
الحمولة: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI= (تم حذف سطر جديد)
التوقيع: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
تجزئة HMAC الخاصة بي (المُنشأة باستخدام أدوات devglan عبر الإنترنت): 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471
عند إنشاء توقيع لعنوان URL للإرجاع، أحصل على نفس النتيجة كما في الموقع، لذا لست متأكدًا تمامًا من سبب عدم تطابق الإجابات. إذا كنت قادرًا على تقديم أي توضيح حول سبب ذلك، فسأكون ممتنًا جدًا لذلك.
أيضًا، تحتاج إلى حساب HMAC للحمولة المشفرة بتنسيق base64 والمشفرة عبر URL. لذا، لا يجب أبدًا حساب hash لحمولة تتضمن سطرًا جديدًا خام.
بدلاً من ذلك، يجب أن يكون %0A. إذا كنت تستخدم إطار عمل ويب، فضع في اعتبارك أنه قد يقوم بإلغاء تشفير الحمولة تلقائيًا. ستحتاج إلى إيجاد طريقة لتعطيل ذلك أو إعادة تشفير القيمة.
لم أجرب هذا على موقعي الإلكتروني بعد، أحاول استيعاب الخطوات يدويًا قبل القيام بذلك.
من منشور المنتدى المشار إليه سابقًا:
بالنظر إلى الإعدادات التالية:
نطاق 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، لذا فإنني غير متأكد قليلاً من سبب عدم عملها على الحمولة الأولى.
بناءً على حدس، جربت توليد التوقيع لسلسلة تحتوي على إرجاع carriage return و سطر جديد في النهاية (أي نهايات أسطر على نمط ويندوز)، وتمكنت من الحصول على نفس التوقيع الذي توفره أداة freeformatter.com
شكرًا على اقتراحك! قمتُ بكتابة أجزاء من العملية بلغة JavaScript، وعند اختبارها (باستخدام مكتبات nodeForge و urlencode و js-base64) في RunKit، أعادت نفس النتيجة التي وردت في الدليل التعليمي.