Saya hanya mencari cara untuk memecahkan masalah yang sama ini, tetapi saya juga ingin fungsi saya membuat token yang dapat digunakan untuk pengambilan kata sandi juga. Ini berarti bahwa saya perlu membatasi kemampuan token untuk ditebak. Karena uniqid
didasarkan pada waktu, dan menurut php.net "nilai kembali sedikit berbeda dari microtime ()", uniqid
tidak memenuhi kriteria. PHP merekomendasikan untuk menggunakan openssl_random_pseudo_bytes()
sebagai gantinya untuk menghasilkan token yang aman secara kriptografis.
Jawaban cepat, singkat dan to the point adalah:
bin2hex(openssl_random_pseudo_bytes($bytes))
yang akan menghasilkan string acak karakter alfanumerik dengan panjang = $ byte * 2. Sayangnya ini hanya memiliki alfabet [a-f][0-9]
, tetapi berfungsi.
Di bawah ini adalah fungsi terkuat yang bisa saya buat yang memenuhi kriteria (Ini adalah versi jawaban Erik yang diterapkan).
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)
berfungsi sebagai pengganti pengganti untuk rand()
atau mt_rand
. Ini menggunakan openssl_random_pseudo_bytes untuk membantu membuat angka acak antara $ min dan $ max.
getToken($length)
membuat alfabet untuk digunakan dalam token dan kemudian membuat string panjang $length
.
EDIT: Saya lalai mengutip sumber - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): Dengan dirilisnya PHP7, perpustakaan standar sekarang memiliki dua fungsi baru yang dapat menggantikan / meningkatkan / menyederhanakan fungsi crypto_rand_secure di atas. random_bytes($length)
danrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Contoh:
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;
}