আমি ঠিক কীভাবে এই একই সমস্যাটি সমাধান করবেন সেদিকে নজর দিচ্ছিলাম, তবে আমি আমার ফাংশনটিও একটি টোকেন তৈরি করতে চাই যা পাসওয়ার্ড পুনরুদ্ধারের জন্যও ব্যবহার করা যেতে পারে। এর অর্থ হ'ল টোকেনটির অনুমান করার ক্ষমতা সীমাবদ্ধ করতে হবে। কারণ uniqid
সময়ের উপর ভিত্তি করে, এবং পিএইচপি.net অনুযায়ী "রিটার্নের মান মাইক্রোটাইম () থেকে কিছুটা আলাদা", uniqid
মানদণ্ডটি পূরণ করে না। পিএইচপি openssl_random_pseudo_bytes()
পরিবর্তে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত টোকেন তৈরির জন্য ব্যবহারের পরামর্শ দেয় ।
একটি দ্রুত, সংক্ষিপ্ত এবং মূল উত্তরটি হ'ল:
bin2hex(openssl_random_pseudo_bytes($bytes))
যা দৈর্ঘ্য = of বাইট * ২ এর বর্ণমালার অক্ষরের একটি এলোমেলো স্ট্রিং উত্পন্ন করবে দুর্ভাগ্যক্রমে এটির কেবলমাত্র বর্ণমালা রয়েছে [a-f][0-9]
তবে এটি কার্যকর।
নীচে আমি যে শক্তিশালী ফাংশনটি তৈরি করতে পারি তা মানদণ্ডগুলিকে সন্তুষ্ট করে (এটি এরিকের উত্তরের একটি কার্যকর সংস্করণ)।
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $range);
return $min + $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet); // edited
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
}
return $token;
}
crypto_rand_secure($min, $max)
rand()
বা প্রতিস্থাপনের ড্রপ হিসাবে কাজ করে mt_rand
। এটি ওপেনএসএল_রাডম_পসিউডো_বিটস ব্যবহার করে $ মিনিট এবং $ সর্বাধিকের মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে সহায়তা করে।
getToken($length)
টোকেনের মধ্যে ব্যবহারের জন্য একটি বর্ণমালা তৈরি করে এবং তারপরে দৈর্ঘ্যের একটি স্ট্রিং তৈরি করে $length
।
সম্পাদনা: উত্স উদ্ধৃত করার জন্য আমি অবহেলা করেছি - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
সম্পাদনা (পিএইচপি 7): পিএইচপি 7 প্রকাশের সাথে, স্ট্যান্ডার্ড লাইব্রেরিতে এখন দুটি নতুন ফাংশন রয়েছে যা উপরের ক্রিপ্টো_র্যান্ড_সিকিউর ফাংশনটিকে প্রতিস্থাপন / উন্নত / সরল করতে পারে। random_bytes($length)
এবংrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
উদাহরণ:
function getToken($length){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet);
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[random_int(0, $max-1)];
}
return $token;
}