Here's a drop-in replacement for rand() using OpenSSL as your PRNG:
<?php
function crypto_rand($min,$max) {
$range = $max - $min;
if ($range == 0) return $min; // not so random...
$length = (int) (log($range,2) / 8) + 1;
return $min + (hexdec(bin2hex(openssl_random_pseudo_bytes($length,$s))) % $range);
}
?>
openssl_random_pseudo_bytes
(PHP 5 >= 5.3.0)
openssl_random_pseudo_bytes — Yarı-rasgele dizge üretir
Açıklama
bool openssl_random_pseudo_bytes
( string $uzunluk
, string $güçlü
)
uzunluk karakterlik bir dizge döndürür. Ayrıca, ikinci değiştirgede bu yarı rasgele baytları üretmek için güçlü bir algoritma kullanılıp kullanılmadığı da belirtilecektir.
Değiştirgeler
- uzunluk
-
İstenen dizgenin uzunluğu. Pozitif bir tamsayı olmalıdır. PHP, bu değiştirgeden bir pozitif tamsayı elde etmek için gerekli tür dönüşümünü yapacaktır.
- güçlü
-
Güçlü bir algoritma kullanılmışsa bu değiştirgede TRUE döner. Bir hata oluşursa bu değer NULL olacaktır.
Dönen Değerler
İşlem başarılı olursa üretilen dizge, yoksa FALSE döner.
Örnekler
Örnek 1 - openssl_random_pseudo_bytes() örneği
<?php
for ($i = -1; $i < 5; $i++) {
var_dump(bin2hex(openssl_random_pseudo_bytes($i, $guclu)));
var_dump($guclu);
}
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
string(0) "" NULL string(0) "" NULL string(2) "f6" bool(true) string(4) "8999" bool(true) string(6) "c202c9" bool(true) string(8) "45261b8f" bool(true)
openssl_random_pseudo_bytes
Tyler Larson
21-Aug-2009 10:18
21-Aug-2009 10:18
Tyler Larson
21-Aug-2009 09:29
21-Aug-2009 09:29
If you don't have this function but you do have OpenSSL installed, you can always fake it:
<?php
function openssl_random_pseudo_bytes($length) {
$length_n = (int) $length; // shell injection is no fun
$handle = popen("/usr/bin/openssl rand $length_n", "r");
$data = stream_get_contents($handle);
pclose($handle);
return $data;
}
?>
