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

السؤال

نشر

اريد تعديل هذا الكود من قبل أحد المبرمجين المحترفين في 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...