Восстанавливаемое случайное число в переполнении стека

Мне нужно получить «случайное» число (0-9) на основе строки, чтобы его можно было воссоздать. Мое решение состояло в том, чтобы использовать SHA512 и взять 2-ое число, как это:

$random = filter_var(hash('sha512', 'STRING COMES HERE'), FILTER_SANITIZE_NUMBER_INT)[1];

Я хочу знать, если это точно и не предсказуемо. Мне нужно это случайное число, чтобы выбрать между двумя вариантами. Я сделал тест, чтобы увидеть, дали ли числа мне соотношение 50/50.

$option1 = 0;
$option2 = 0;
$times = 1000000; // amount of iterations

for($i = 0; $i < $times; $i++) {
$result = filter_var(hash('sha512', rand()), FILTER_SANITIZE_NUMBER_INT)[1];
if($result < 5) {
$option1++;
}
else {
$option2++;
}
}

echo "Option 1: ".($option1/$times * 100)."%";
echo "</p>Option 2: ".($option2/$times * 100)."%";

и это был результат

Option 1: 49.9207%

Option 2: 50.0793%

Мне нужно знать, безопасно ли использовать этот метод, хотя результат кажется довольно точным.

0

Решение

Криптографически безопасные хеш-функции (а «S» в SHA означает «безопасный») обладают тем свойством, что их выходные данные практически неотличимы от случайных выходных данных. Изменение одного бита на входе должно в среднем переворачивать половину выходных битов таким образом, который выглядит совершенно случайным. Все, что меньше, может привести к уязвимости. Таким образом, вам почти гарантировано равномерное распределение. Но — что вы подразумеваете под «безопасным»? Не зная о том, что, во всяком случае, вы пытаетесь обезопасить, невозможно ответить на вопрос «Мне нужно знать, безопасно ли использовать этот метод». Как правило, если вы действительно должны спросить, то ответ, вероятно, «нет».

1

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

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

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