Я пытаюсь создать простую функцию генерации пароля, используя 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
, Тем не менее, я не смог найти ни одной дискуссии на эту тему.
Согласно документация
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
,
Других решений пока нет …