Sadece aynı sorunun nasıl çözüleceğini araştırıyordum, ama aynı zamanda fonksiyonumun parola almak için de kullanılabilecek bir jeton oluşturmasını istiyorum. Bu, jetonun tahmin edilme yeteneğini sınırlandırmam gerektiği anlamına geliyor. Çünkü uniqid
zamana dayalıdır ve php.net'e göre "dönüş değeri mikrotime ()" den biraz farklıdır uniqid
, kriterleri karşılamamaktadır. PHP openssl_random_pseudo_bytes()
bunun yerine kriptografik olarak güvenli belirteçler oluşturmak için kullanılmasını önerir .
Hızlı, kısa ve önemli bir cevap:
bin2hex(openssl_random_pseudo_bytes($bytes))
uzunluk = $ bayt * 2 rastgele bir alfasayısal karakter dizesi oluşturur. Ne yazık ki bu sadece bir alfabesi vardır [a-f][0-9]
, ama çalışır.
Aşağıda, kriterleri karşılayan en güçlü fonksiyon var (Bu, Erik'in cevabının uygulamalı bir versiyonudur).
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()
veya yerine bir damla olarak çalışır mt_rand
. $ Min ve $ max arasında rastgele bir sayı oluşturmaya yardımcı olmak için openssl_random_pseudo_bytes kullanır.
getToken($length)
belirteç içinde kullanılacak bir alfabe oluşturur ve ardından bir uzunluk dizesi oluşturur $length
.
EDIT: Alıntı yapmayı ihmal ettim - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): PHP7'nin piyasaya sürülmesiyle, standart kütüphane artık yukarıdaki crypto_rand_secure işlevini değiştirebilen / geliştirebilen / basitleştirebilen iki yeni işleve sahiptir. random_bytes($length)
verandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
Misal:
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;
}