Использование openssl_random_pseudo_bytes () для заполнения mt_rand ()

Я пытаюсь создать простую функцию генерации пароля, используя openssl_random_pseudo_bytes и хочу знать, является ли он криптографически сильным.

function randomPassword($length = 12) {
mt_srand( hexdec( bin2hex( openssl_random_pseudo_bytes(256) ) ) );
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$&*-_=+.?';
$pass = '';
$alphaLength = strlen($alphabet) - 1;
for ($i = 0; $i < $length; $i++) {
$n = mt_rand(0, $alphaLength);
$pass .= $alphabet[$n];
}
return $pass;
}

Я бы предположил, что если есть слабость, которая до сих пор в mt_rand функционировать независимо от посева его openssl_random_pseudo_bytes, Тем не менее, я не смог найти ни одной дискуссии на эту тему.

1

Решение

Согласно документация
openssl_random_pseudo_bytes не гарантируется получение криптографически стойких случайных данных. Однако в том невероятном случае, когда он не смог использовать криптографически стойкий ГСЧ, он по крайней мере скажет вам. Это то что openssl_random_pseudo_bytesВторой параметр предназначен для:

Он также указывает, использовался ли криптографически стойкий алгоритм для создания псевдослучайных байтов, и делает это с помощью необязательного crypto_strong параметр. Это редко FALSE, но некоторые системы могут быть сломаны или старые.

Вы можете передать этот параметр, а затем проверить его значение:

$bytes = openssl_random_pseudo_bytes(256, $strong);
if (!$strong) {
// handle error as necessary.
}

Однако в отличие от openssl_random_pseudo_bytes, mt_rand является прямо указано не производить криптографически безопасные значения.

Эта функция не генерирует криптографически безопасные значения и не должна использоваться в криптографических целях.

Я не эксперт, но я сомневаюсь, что заполнение Mersenne Twister безопасными случайными данными сделает сгенерированные данные более безопасными (если вообще, возможно, только первый байт):

Встречное предложение

Вы не указали, какую версию PHP вы используете. Если вы используете PHP 7, random_int может быть хорошей альтернативой для вас (также явно указано, что она криптографически безопасна):

for ($i = 0; $i < $length; $i++) {
$n = random_int(0, $alphaLength);
$pass .= $alphabet[$n];
}

С другой стороны, этот ответ обеспечивает безопасную реализацию на основе PHP для rand функция, которая использует OpenSSL в качестве CSPRNG, который вы могли бы использовать вместо random_int,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]