Безопасная генерация случайных чисел в PHP

В Java и C # (в отличие от C ++) все расширяет Object, поэтому классы коллекций, такие как ArrayList, могут содержать Object или любого из его потомков (в основном что угодно).

Однако по соображениям производительности примитивам в Java или типам значений в C # был присвоен особый статус. Они не объект. Вы не можете сделать что-то вроде (в Java):

 7.toString()

, хотя toString является методом для Object. Для того, чтобы связать этот узел с производительностью, были созданы эквивалентные объекты. AutoBoxing удаляет стандартный код необходимости помещать примитив в его класс-обертку и извлекать его снова, делая код более читабельным.

Разница между типами значений и объектами в C # более серая. См. здесь о том, как они отличаются.

33
задан rwallace 25 July 2009 в 17:35
поделиться

1 ответ

Я настоятельно рекомендую настроить таргетинг на / dev / urandom в системах unix или на crypto-api на платформе Windows в качестве источника энтропии для паролей.

Я не могу не подчеркнуть важность понимания хэши НЕ являются волшебными устройствами увеличения энтропии. Неправильное их использование таким образом не более безопасно, чем использование данных seed и rand () до их хеширования, и я уверен, что вы понимаете, что это не очень хорошая идея. Семя отменяет (детерминированный mt_rand ()), поэтому нет никакого смысла даже включать его.

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

Две ошибки не делают правильного. Система настолько сильна, насколько сильна ее самая слабая часть. случайный IV для блочного шифра, случайная соль для хэша пароля) mt_rand () - плохой источник. На большинстве платформ Unix / Linux и / или MS-Windows вы можете получить более высокий уровень псевдослучайных битов из ОС или системной библиотеки, например:

 
 
 
  GetRandom (16,0);

 // если мы запрашиваем двоичные данные, PHP изменяет их, поэтому мы
// запрашиваем возвращаемое значение base64. Мы выдавливаем
 // избыточность и бесполезность == CRLF путем хеширования ...
если ($ pr_bits) {$ pr_bits = md5 ($ pr_bits, TRUE); }
 } catch (исключение $ ex) {
// эхо 'Исключение:'. $ ex-> getMessage ();
 }
}

if (strlen ($ pr_bits) <16) {
 // делаем что-нибудь, чтобы предупредить владельца системы, что
 // псевдослучайный генератор отсутствует
}
?>

NB: обычно безопасно оставлять как попытку чтения / dev / urandom, так и попытку доступа к CAPICOM в вашем коде, хотя каждая из них не будет работать на платформе другого. Оставьте их там обоих, чтобы ваш код был более переносимым ".

59
ответ дан 27 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: