Безопасное случайное число, такое как целое число из / dev / random, для платформы Windows? - PullRequest
1 голос
/ 25 апреля 2011

В моем приложении мне требуется функция для генерации (непредсказуемо) случайных значений, которые каждый раз меняются при вызове, например, внутри быстрого цикла.

На платформах Linux, на которых я буду выпускать свой скрипт (из которых будет выполняться в SSL в PHP) Я объединю, возможно, несколько средств, чтобы гарантировать, что начальное число или хеш-код полностью случайны, путем запроса / dev / random, возможно, в сочетании со средствами OpenSSL и включением специфических для системы значений, таких как последний измененный сценарий ивремя создания.

Я использую эти конкретные значения, так как даже если человек А имеет сценарий и знает методы, он не сможет угадать (/ dev / random содержимого, использование памяти в данный момент,время модификации, вероятно, и т. д.) и не сможет реально снизить безопасность пользователя B, выполняющего тот же сценарий.

На платформе Windows, к которой, к сожалению, я должен сейчас разработать (я все еще тестирую на Linux,но реже) мне требуются случайные значения которых я описываюописанный выше, только для обеспечения как минимум ограниченной защиты от предсказания начальных чисел или ключей.

Я пытался в качестве первой попытки использовать memory_get_usage() (с или без доступного параметра true для «истинного» использования памяти дляPHP), и кажется, что значения остаются очень статичными, даже если каждая итерация выполняет значительный объем памяти, требующей больших затрат.

Возможно, было бы целесообразно использовать это (несколько динамическое) использование памяти в качестве начального числа дляPRNG генерировать больше (быстро) случайных чисел?Или тот факт, что память настолько ограничена, что они могли бы просто создать 2 ^ xx семени и грубо угадать это ... Я начинаю размыть линию того, что реально случайно, если даже можно угадать мои операции, даже если они«не» на самом деле так случайно.

Ответы [ 3 ]

5 голосов
/ 05 ноября 2011

Стандартным эквивалентом Unix-устройства /dev/random (или , обычно рекомендуемого /dev/urandom) в Windows является функция CryptGenRandom из CryptoAPI.

В PHP вы сможете использовать mcrypt_create_iv() с MCRYPT_DEV_URANDOM, который использует /dev/urandom в Unix и (очевидно) CryptGenRandom в Windows.

2 голосов
/ 05 ноября 2011

Mersenne Twister (который использует mt_rand) - хороший алгоритм для целей, не связанных с безопасностью, но его не следует использовать для безопасности. Википедия: Mersenne Twister : «Алгоритм в его собственной форме не подходит для криптографии ... Наблюдение за достаточным количеством итераций (624 в случае MT19937) позволяет прогнозировать все будущие итерации».

Вместо этого так же просто взять выходные данные счетчика, объединить (или XOR) его с некоторой солью и хешировать его с помощью криптографически безопасного хеш-алгоритма, такого как SHA-2.Если никто не знает вашу соль, это будет абсолютно безопасно.Соль тогда эквивалентна семени Мерсенна.

Я не эксперт, где можно получить хорошую случайную соль в Windows, но вы всегда можете объединить (или XOR) такие вещи, как системное время, использование памяти и т. Д., Ихеш это с SHA-2.Вы даже можете выйти наружу в такое место, как Random.org для некоторых истинных случайных чисел (если вы не слишком часто звоните).Лучшая часть комбинирования источников случайности с SHA-2 заключается в том, что каждый дополнительный источник может только добавлять случайность, а не вычитать ее.

0 голосов
/ 25 апреля 2011

Почему бы просто не использовать что-то вроде?

mt_rand({min}, {max});

Подробнее здесь: http://php.net/manual/en/function.mt-rand.php

...