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

المساعدة في تقوية تشفير رمز توكين في PHP

علي الكاسر

السؤال

اريد تعديل هذا الكود من قبل أحد المبرمجين المحترفين في php

الكود يعمل على إنشاء رمز توكين ، ولكن ناشر الكود قال أن الرمز ضعيف وإن نشره للكود كان كتجربة وتعليم .

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

<?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 

?>

 

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

Recommended Posts

  • 1

عموما ، يشترط أن يكون رمز التوكين الذي تحاول توليده امنا من الناحية التشفيرية cryptographically secure . إذ لا يميل الكثير إلى توليد سلسلة نصية عشوائية عن طريق دوال من مثل rand أو uniqid أو غيرها كونها لم توجد لعمليات التوثيق التي تتطلب مستوى أعلى من الحماية والأمان ، لأن هاته نفسها مرتكزة على مفاهيم أخرى من مثل وقت إستدعاءها ، مما يجعل عملية فكرة التركيز عليها هشة. 

راجع قسم الوصف من توثيق الدالة uniqid()‎ في PHP : 

اقتباس

تحصل الدالة uniqid()‎ على معرف فريد مع إمكانية إضافة سابقة له استنادًا إلى الوقت الحالي بالميكروثانية.

فضلا عن الإنطلاق من سلسلة نصية معلومة مثل تلك التي تخزنها في المتغير whoami .

وكحلول أكثر أمانا توفر PHP بدائل تصفها بأنها " آمنة تشفيريا cryptographically secure " . فمكتبة PHP 7 القياسية مثلا توفر وظيفة random_bytes التي تقوم بتوليد وحدات بايت عشوائية آمنة. 

ستحتاج بعد ذلك تحويل وحدات البايت هاته إلى hexadecimal عن طريق الوظيفة bintohex . 

مثال : 

<?php 

$bytes = random_bytes(60);

$token = bin2hex($bytes);

echo $token;


/*
8063741bbb1dd099aa059e3ee1851bdb8a27a7d1
b22e962801c76b10dc0107828ec679fe93fac698
6c93d6e863542e69e029f5db08bf367ac6de66ab
*/

 يمكنك أيضا الإستعانة بمكتبات أكثر أمانا وأكثر إلتفاتا لهذا الجانب ، من مثل مكتبات OAuth في PHP التي توفر التابع generateToken عن طريق مزود خدمتها OAuthProvider كالتالي : 

$p = new OAuthProvider();

$t = $p->generateToken(60);

أو ربما مكتبات وحزما أخف حجما من مثل الغنية عن التعريف jwt .

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...