Как я уже говорил, моя функция rand является модифицированной версией функции phpseclib crypt_random.Вы могли видеть это в ссылке, данной в моем первом сообщении.по крайней мере, автор криптографической библиотеки phpseclib подтвердил это;не достаточно для обычных приложений?я не говорю об экстремальной / теоретической безопасности, просто говорю о практической безопасности в той степени, которая действительно необходима и в то же время «легко» / «достаточно низкая стоимость», доступной почти для всех обычных приложений в Интернете.
phpseclib crypt_random эффективно и бесшумно возвращается к mt_rand (который, как вы должны знать, действительно слаб) в худшем случае (нет доступных openssl_random_pseudo_bytes или urandom), но моя функция использует в таких случаях гораздо более безопасную схему.это просто возврат к схеме, в которой грубое принуждение / прогнозирование его вывода намного сложнее и (должно быть) на практике достаточно для всех обычных приложений / сайтов.он использует возможную (на практике очень вероятную и трудную для прогнозирования / обхода) дополнительную энтропию, которая накапливается со временем, что быстро становится практически невозможно узнать для посторонних.он добавляет эту возможную энтропию к выходным данным mt_rand (а также к выходным данным других источников: urandom, openssl_random_pseudo_bytes, mcrypt_create_iv).если вам сообщили, что вы должны знать, эту энтропию можно сложить, но не вычесть.в (почти наверняка очень редком) худшем случае эта дополнительная энтропия будет равна 0 или слишком мала.в посредственном случае, который, я думаю, есть почти во всех случаях, это будет даже больше, чем практически необходимо, я думаю.(У меня были обширные исследования в области криптографии, поэтому, когда я говорю, что думаю, он основан на гораздо более информативном и научном анализе, чем обычные программисты).
см. полный код моего модифицированного crypt_random:
function crypt_random($min = 0, $max = 0x7FFFFFFF)
{
if ($min == $max) {
return $min;
}
global $entropy;
if (function_exists('openssl_random_pseudo_bytes')) {
// openssl_random_pseudo_bytes() is slow on windows per the following:
// /1193476/opensslrandompseudobytes-medlenno-php
if ((PHP_OS & "\xDF\xDF\xDF") !== 'WIN') { // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
extract(unpack('Nrandom', pack('H*', sha1(openssl_random_pseudo_bytes(4).$entropy.microtime()))));
return abs($random) % ($max - $min) + $min;
}
}
// see http://en.wikipedia.org/wiki//dev/random
static $urandom = true;
if ($urandom === true) {
// Warning's will be output unles the error suppression operator is used. Errors such as
// "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc.
$urandom = @fopen('/dev/urandom', 'rb');
}
if (!is_bool($urandom)) {
extract(unpack('Nrandom', pack('H*', sha1(fread($urandom, 4).$entropy.microtime()))));
// say $min = 0 and $max = 3. if we didn't do abs() then we could have stuff like this:
// -4 % 3 + 0 = -1, even though -1 < $min
return abs($random) % ($max - $min) + $min;
}
if(function_exists('mcrypt_create_iv') and version_compare(PHP_VERSION, '5.3.0', '>=')) {
@$tmp16=mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
if($tmp16!==false) {
extract(unpack('Nrandom', pack('H*', sha1($tmp16.$entropy.microtime()))));
return abs($random) % ($max - $min) + $min;
}
}
/* Prior to PHP 4.2.0, mt_srand() had to be called before mt_rand() could be called.
Prior to PHP 5.2.6, mt_rand()'s automatic seeding was subpar, as elaborated here:
http://www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/
The seeding routine is pretty much ripped from PHP's own internal GENERATE_SEED() macro:
http://svn.php.net/viewvc/php/php-src/tags/php_5_3_2/ext/standard/php_rand.h?view=markup */
static $seeded;
if (!isset($seeded) and version_compare(PHP_VERSION, '5.2.5', '<=')) {
$seeded = true;
mt_srand(fmod(time() * getmypid(), 0x7FFFFFFF) ^ fmod(1000000 * lcg_value(), 0x7FFFFFFF));
}
extract(unpack('Nrandom', pack('H*', sha1(mt_rand(0, 0x7FFFFFFF).$entropy.microtime()))));
return abs($random) % ($max - $min) + $min;
}
$ энтропия содержит мою дополнительную энтропию, полученную из объединенной до настоящего времени энтропии параметров всех запросов + энтропии параметров текущего запроса + энтропии случайной строки (*), установленной вручную во время установки.
*: длина: 22, состоит из строчных и прописных букв + цифр (более 128 бит энтропии)