Ben sadece bu aynı sorunu çözmek için nasıl içine bakıyordu, ama aynı zamanda benim işlevi de şifre alımı için kullanılabilecek bir belirteç oluşturmak istiyorum. Bu benim tahmin edilmesi belirteci yeteneğini sınırlamak gerektiği anlamına gelir. uniqid
is based on the time, and according to php.net "the return value is little different from microtime()", uniqid
kriterlere uymayan çünkü. PHP kriptografik olarak güvenli belirteçleri oluşturmak yerine openssl_random_pseudo_bytes()
kullanılmasını önerir.
A, hızlı kısa ve noktasına cevabı:
bin2hex(openssl_random_pseudo_bytes($bits))
which will generate a random string of alphanumeric characters of length = $bits * 2. Unfortunately this only has an alphabet of [a-f][0-9]
, but it works.
Below is the strongest function I could make that satisfies the criteria (This is an implemented version of Erik's answer).
function crypto_rand_secure($min, $max) {
$range = $max - $min;
if ($range < 0) return $min; // not so random...
$log = 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";
for($i=0;$i<$length;$i++){
$token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
}
return $token;
}
crypto_rand_secure($min, $max)
rand()
ya da mt_rand
için yedek bir damla olarak çalışmaktadır. Bu $ dk ve $ max arasında rastgele bir sayı oluşturmak için openssl_random_pseudo_bytes kullanır.
getToken($length)
belirteci içinde kullanmak için bir alfabe oluşturur ve ardından uzunlukta bir dize oluşturur $length
.
EDIT: Ben kaynağını alıntı ihmal - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322