اذهب إلى المحتوى
  • 1

كيف نستطيع توظيف رمز التوكين والاستفادة منه

علي الكاسر

السؤال

السلام عليكم

وجدت هذا الكود وهو يقوم بتوليد رمز مييز اي توكين،

<?php
function base64($data) {
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
} # Filtering (URLEncode)
$whoami = '1337r00t'; // Client's User
$headers = base64(json_encode(['alg'=>'HS256','typ'=>'JWT'])); // Headers
$payload = base64(json_encode(['WhoAmI'=>$whoami,'iat'=>time(),'id'=>1223])); // Payload
$secret = 'Key1234'; // Secret Key
$signature = base64(hash_hmac('SHA256',"$headers.$payload",$secret,true)); // Signature
$jwt = "$headers.$payload.$signature"; // JWT
echo $jwt. '<br>'; # eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJXaG9BbUkiOiIxMzM3cjAwdCIsImlhdCI6MTU1Njk2MzY3Mn0.1_gqGBADyt1MfF59xG8PTbg49vM0XE6r0Ed7yXbSAVs
$whoami = '1337r00t'; // Client's User
$headers = base64(json_encode(['alg'=>'HS256','typ'=>'JWT'])); // Headers
$payload = base64(json_encode(['WhoAmI'=>$whoami,'iat'=>time()])); // Payload
$secret = 'Key1234'; // Secret Key
$signature = base64(hash_hmac('SHA256',"$headers.$payload",$secret,true)); // Signature
$jwt = "$headers.$payload.$signature"; // JWT
echo $jwt. '<br>';
?>

السؤال ماهي الفكرة التي اطبقها للاستفاده من هذا الرمز المميز للمصادقه والتعرف على المستخدم، حسنا ستقول لي خزن التوكين في الكوكيز او التخزين المحلي، طيب وماذا بعد، ستقول لي خزن ذلك في قاعدة بيانات ثم قم بمطابقتها مع الرمز المخزن محليا في جهاز المستخدم، طيب لماذا اللف والدوران ونعمل كود طويل وعريض ليش ما اخزن رمز الاي دي تبع المستخدم وانتهى الامر،. 

مافهمته من رمز التوكين انه يحمل ثلاثه قيم رأس الحموله و متن الحموله والقيمه الثالثه الرأس مضاف إلى المتن وكلمة سر، طيب ما فائدة هذا وكيف سأستفيد منه في المصادقه، اريد توضيح مفصل للفكرة ارجوكم 

تم التعديل في بواسطة Hassan Hedr
تنسيق الشيفرة
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 2

هناك فرق بين إستخدام session و JWT ولكل منها إستخداماته، في بعض الحالات يكون إستخدام الجلسات session مثل المواقع البسيطة التي تستخدم خادم واحد فقط ولا تحتاج إلى عمل API خاص يحتاج إلى عملية مصادقة. على الجانب الآخر فإن إستخدام JWT يكون مفيد عندما يكون للموقع أكثر من خادم (مثل كل المواقع الكبيرة التي تقوم بتخزين ملفاتها وبياناتها في أكثر من دولة)، وبالتالي لا يمكن التحقق من session id الخاص بالمستخدم لأنه يتم تخزينه على خادم واحد وسيكون من الصعب مشاركته إلى أكثر من خادم، وهنا يأتي دور JWT حيث يتم تشفير بعض البيانات بإستخدام Secret Key ويتم تخزين هذا الرمز token على جهاز العميل (في المتصفح في شكل Cookies أو Local Storage) وكلما قام المستخدم بطلب أحد الصفحات يتم التأكد من الرمز token من خلال فك تشفيره.

هنا شرح لكيف تعمل الجلسات Session، وكذلك تقينة Json-Web-Token (JWT):

الجلسات Sessions

يمكنك أن تتخيل أن الجلسة session عبارة عن مصفوفة من البيانات كالتالي:

$session = [
	"session_id"	=> "123456",
	"user_id"	=> "q1w2e3",
	"user_name"	=> "Sameh"
];

من الكود السابق يتضح أن الجلسة عبارة عن مجموعة من البيانات (مثل اسم المستخدم والمعرف الخاص به id) ويتم توليد id لهذه الجلسة session id بشكل عشوائي، وعندما يقوم أحد المستخدمين بتسجيل الدخول إلى الموقع، يقوم الخادم بتوليد هذه المصفوفة من البيانات (الجلسة session) ويقوم بحفظها في أحد الأماكن (ملف أو قاعدة بيانات أو memcached / redis أو حتى في مصفوفة في الذاكرة)، ثم يتم إرسال معرف الجلسة session id إلى المستخدم ليتم تخزينة في المتصفح في أحد الـ Cookies (تتم هذه العملية تلقائيًا في أغلب الأحيان).

الآن يوجد لدينا session في الذاكرة ويوجد لدى العميل session id يتم إرساله بشكل تلقائي مع كل طلب، ويقوم الخادم بالتأكد من وجود جلسة session بهذا الـ id وإذا وجدها يقوم بالسماح بإكمال الطلب وإذا لم يجد أي جلسة لها هذا المعرف id يتم تحويل المستخدم لصفحة تسجيل الدخول ليحصل على جلسة جديدة.

هنا صورة قد توضح كيف تتم العملية بالكامل بشكل مبسط:
كيفية عمل الجلسات Sessions

الآن ماذا سوف يحدث إذا قام أحد المخترقين بسرقة معرف الجلسة من متصفح العميل وقام بزراعة هذه البيانات في المتصفح الخاص به (متصفح الهاكر) ثم قام بإرسال بعض الطلبات إلى الخادم على أساس أنه هو العميل الحقيقي؟ سوف تتم كل الطلبات بشكل سليم وسوف يستطيع المخترق بأن يقوم بكل العمليات بدون أي صعوبة، وهذه الطريقة تم إستخدامها على نطاق واسع خلال الأشهر الماضية لسرقة العديد من قنوات اليويتيوب الكبيرة، وذلك من خلال إختراق المتصفح الخاص به (عبر تثبيت أحد البرامج أو الإضافات) والحصول على الـ Cookies الخاصة ببعض المواقع، تسمى هذه الطريقة في الإختراق بـ session hijacking.

ماذا سوف يحدث إذا كان لدى الموقع أكثير من خادم لحفظ البيانات مثل المواقع الكبيرة التي تحتاج إلى أكثر من خادم لحفظ البيانات؟ لن يمكننا إستخدام الجلسات بشكل مباشر لأن بيانات الجلسة الواحدة يتم تخزينها في ذاكرة أحد الخاودم (أو في قاعدة البيانات) ولا يمكن أن تتم مشاركتها إلى كل الخوادم، وبالتالي يجب أن يكون هناك خادم خاص بتخزين بيانات الجلسات ويقوم كل خادم بالإتصال به والتأكد من الجلسة في كل طلب مما سوف يؤثر على أداء التطبيق بشكل عام.

يمكنك معرفة المزيد عن الجلسات Session من خلال موسوعة حسوب من هنا (الجلسات في Laravel) و من هنا (الدالة session_start في php)

رمز JWT

رمز JWT يعمل بطريقة مختلفة بعض الشيء، فعندما يقوم المستخدم بتسجيل الدخول، يقوم الخادم بتوليد رمز Token ويرسله إلى المستخدم وفي كل طلب يرسله العميل يجب أن يرسل معه هذا الرمز ليقوم الخادم بفك تشفير هذا الرمز والتحقق من المستخدم، وتتم هذه العملية بالكامل بدون تخزين أي رموز token في الذاكرة أو في قاعدة بيانات.

هنا صورة توضح الطريقة التي تعمل بها رموز JWT:

61b39de1eccf6_Screenshot2021-12-10201143.png.717ef32e6559873bb9ee917fd926db7c.png

ما هي مكونات رمز JWT

يتكون الرمز من ثلاثة أجزاء على النحو التالي:

  • رأس Header: يحتوي على الخوارزمية المستعملة في التشفير ونوع الرمز:
    {
      "alg": "HS256",
      "typ": "JWT"
    }

     

  • حمولة payload: تحتوي على بيانات المستخدم (بدون كلمة المرور):
    {
      "user_id": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }

     

  • توقيع signature: يحتوي على ناتج تشفير كلًا من الرأس header والحمولة payload بإستخدام خوارزمية مثل HMAC-SHA256 بإستخدام Secret Key (يمكن إعتبارها كـكلمة سر خاصة بالخادم فقط، ولا يتم الكشف عنها بأي شكل من الأشكال)

ويكون الناتج في النهاية بالشكل التالي:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

وإذا تم تغير أي جزء من البيانات سوف تحصل على رمز مختلف كليًا، وهذا الأمر يضمن سلامة البيانات وأنه لم يتم التلاعب بها قبل إرسالها. يمكنك إستخدام الموقع jwt.io لتجربة كيف يعمل JWT وتجربة تغير أي جزء من البيانات وملاحظة الرمز الذي يتم توليده.

عندما يستقبل الخادم هذا الرمز يقوم بإستخدام نفس الخوارزمية ولكن لفك تشفير الرمز بإستخدام Secret Key، وإذا تمت عملية فك التشفير بنجاح نكون قد نجحنا في التحقق من المستخدم.

الآن ماذا سوف يحدث إذا كان الموقع يستعمل أكثر من خادم لإدارة البيانات؟ سوف يعمل كل شيء على مايرام لأن الخادم يقوم بفك تشقير الرمز الذي يصل إليه من المستخدم ولا يحتاج إلى قاعدة بيانات مشتركة لتخزين بيانات الجلسة أو أي شيء من هذا القبيل.

ماذا سوف يحدث إذا قام أحد المخترقين بالوصول إلى رمز JWT الموجود لدى أحد المستخدمين؟ سوف يكون بأمكان المخترق عمل كل الطلبات وكأنه هو المستخدم الحقيقي، ولحل هذه المشكلة يتم جعل الرمز صالح لفترة قصيرة للغاية (بضع دقائق فقط) ويتم إنشاء Refresh Token (رمز يستخدم للحصول على رمز Token جديد) وكلما إنتهت هذه الفترة يتم إستخدام الـ refresh token للحصول على رمز جديد (بعض المواقع تقوم بإرسال رمز refresh token جديد أيضًا في هذه العملية، ولا يكون الرمز refresh token صالح للإستخدام مرة أخرى)، ويكون للـ refresh token فترة صلاحية أيضًا ولكن أكبر من رمز token العادي (قد تكون عدة أيام أو حتى أسابيع)، بعد إنتهاء هذه الفترة يجب على المستخدم أن يقوم بتسجيل الدخول مرة أخرى.

ماذا سوف يحدث إذا قام المخترق بالوصول إلى كلٍ من رمز Token وكذلك Refresh Token؟ سوف يكون بإمكانه توليد رموز Token جديدة ويقوم بإستعمالها وكأنه المستخدم الحقيقي إلى أن تنتهي صلاحة الـ refresh token ويحتاج إلى تسجيل الدخول مرة أخرى.

ملاحظة: إذا إستطاع أحد المخترقين الوصول إلى بيانات تسجيل الدخول الخاصة بالمستخدم (البريد الإلكتروني وكلمة السر) فسيكون بإمكانه توليد رموز token و refresh token كذلك إلى أن يقوم المستخدم بتغير كلمة السر الخاصة به.

ملاحظة: الـ refresh token قد يتم تخزينه على الخادم، وعندما يقوم أحد المستخدمين بطلب رمز token جديد عبر الـ refresh token الخاص به، يقوم الخادم بالتحقق من أن الـ refresh token l موجود بالفعل لديه، وبالتالي يمكن التحكم في الـ refresh token وحذفه في حالة تم إستخدامه مرة واحدة أو قام المستخدم بتغير بياناته، أو قام بطلب رمز token من عنوان ip مختلف  .. إلخ، مما يوفر أمان أكبر للـ refresh token من الإستخدام حتى بعد سرقته.

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال علي الكاسر:

ليش ما اخزن رمز الاي دي تبع المستخدم وانتهى الامر

لأنه يمكن ببساطة لأي شخص كان أن يقوم بإرسال Cookie تحتوي على معرّف مستخدم آخر، هذا يعني أنه سيستطيع الدخول لحسابات أشخاص آخرين بكل سهولة، لذا كطبقة أمان أنت تقوم بالتوقيع على تصريح المستخدم (مثلا بتضمينه داخل JWT في حالتك) وعندما يدعي شخص بأنه مستخدم ما عندها يمكنك التحقق فعلًا من صحة إدعاءه عبر التحقق من التوكن والتأكد أنك من قمت بالتوقيع على محتواها وبالتالي إرسال البيانات التي يطلبها الشخص لأنه الشخص نفسه

بتاريخ منذ ساعة مضت قال علي الكاسر:

طيب ما فائدة هذا وكيف سأستفيد منه في المصادقه

فكر في JWT على أنه بيانات + توقيعك عليها، أي شخص يسلمك بيانات يمكنك التحقق من التوقيع لتتحقق أنها صادرة من قبلك وليس هو من قام بكتابتها مثلا أو التغيير بمحتواها،

تستفيد من ذلك عندما يقوم شخص بتسجيل دخول ترسل له توكن فيها بيانات عن هويته، لن يستطيع أي شخص آخر لاحقا الإدعاء أنه نفس الشخص طالما لم يرسل مع طلبه التوكن نفسها الموقعة من قبلك، ببساطة الفكرة هي ضمان حماية البيانات من التزوير أو العبث بمحتواها.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 10 دقائق مضت قال Hassan Hedr:

لذا كطبقة أمان أنت تقوم بالتوقيع على تصريح المستخدم (مثلا بتضمينه داخل JWT في حالتك)

ممكن توضح اكثر عن التوقيع وكيف اقوم بذلك التوقيع وهل لكل مستخدم توقيع مختلف عن الاخر وهل احفظ هذه التواقيع في السيرفر بقاعدة بيانات لأتأكد من صحتها او كيف الطريقه

 

بتاريخ 13 دقائق مضت قال Hassan Hedr:

شخص يسلمك بيانات يمكنك التحقق من التوقيع لتتحقق أنها صادرة من قبلك وليس هو من قام بكتابتها مثلا أو التغيير بمحتواها،

كيف اتحقق من صحة التوقيع هل احفظ نسخه منه بداخل قاعدة البيانات بجدول خاص بالتوكين، 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 13 ساعات قال علي الكاسر:

ممكن توضح اكثر عن التوقيع وكيف اقوم بذلك التوقيع وهل لكل مستخدم توقيع مختلف عن الاخر وهل احفظ هذه التواقيع في السيرفر بقاعدة بيانات لأتأكد من صحتها او كيف الطريقه

 

كيف اتحقق من صحة التوقيع هل احفظ نسخه منه بداخل قاعدة البيانات بجدول خاص بالتوكين، 

عند تسجيل المستخدم الدخول سيقوم بارسال بيانات تسجيل الدخول الى الخادم ويمكن مثلا ان تكون بريد الكتروني وكلمة سر أنت تتحقق من البيانات التي تم ارسلها لك اذا كان حقا هناك مستخدم بالمعلومات التي تم ارسالها لك اذا وجدت مستخدم مسجل ستستخرج بياناته  من قاعدة البيانات ويمكن ان تكون بالشكل التالي

{
  "id":1,
  "username":"salah"
  
}

عن استخراج البيانات ستقوم بتشفيرها وانتاج jwt وسيكون من الصعب قراءته مثلا

sdf1sd1ffF12f12F21f12F12f1212F12DS1F1F1S

هذا تقوم بارساله للواجهة حيث مطور الواجهة سيستخدمه في المستقبل في طلبات المستخدم أي أنه سيتم ارسال لك التوكن مرة أخرى بافتراض مثلا أن المستخدم salah أراد تغيير كلمة السر الخاصة به سيرسل لك البيانات الجديدة مرفوقة بالتكوكن التي أرسلته اليه لتفك التشفير عن التوكن وتتاكد من هوية المستخدم 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال Salah Eddin Berriani:

هذا تقوم بارساله للواجهة حيث مطور الواجهة سيستخدمه في المستقبل في طلبات المستخدم أي أنه سيتم ارسال لك التوكن مرة أخرى بافتراض مثلا أن المستخدم salah أراد تغيير كلمة السر الخاصة به سيرسل لك البيانات الجديدة مرفوقة بالتكوكن التي أرسلته اليه لتفك التشفير عن التوكن وتتاكد من هوية المستخدم 

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 18 ساعات قال علي الكاسر:

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

عادة للقيام بالاختراق من النوع الذي قلت عنه يجب ان يكون المستخدم الذي سيخترق مهمل لحاسوبه ليقع في أيدي الغرباء أو يتصل بشبكات wifi لا يملكها لكن هناك الكثير من الطرق لزيادة الحماية فمثلا هناك طبقة حماية يمكن اضافتها تسمى two factor authentication هذه تعمل مثلا عند تسجيل المستخدم للدخول ترسل له رسالة للهاتف تحمل 6 أرقام يقوم هو بادخالها هذه تؤكد لك أن المستخدم استعمل هاتفه بحيث الرسالة ستصله للرقم الهاتف الذي حدده هو 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...