Как генерировать случайную, длинную соль для использования в хешировании?

Что такое путь в PHP для создания случайной соли переменной длины для использования в хешировании? Скажем, я хочу сделать длинную соль с 16 символами - как я сделал бы это?

14
задан T.Rob 24 November 2011 в 18:35
поделиться

3 ответа

edit: расширение mcrypt устарело. Для новых проектов обратите внимание на
random_bytes (int $ length)
и натрий (начиная с php 7.2 core-) расширение.


Если доступно расширение mcrypt , вы можете просто использовать mcrypt_create_iv (size, source) для создания соли.

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);

Поскольку каждый байт «строки» может находиться в диапазоне от 0 до 255, вам нужна безопасная для двоичного кода функция для его сохранения / извлечения.

60
ответ дан 1 December 2019 в 05:55
поделиться

в зависимости от вашей ОС, что-то вроде:

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

Почитайте о поведении random и urandom.

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

C.

3
ответ дан 1 December 2019 в 05:55
поделиться

Для хорошей соли есть два необходимых условия: Она должна быть длинной, и она должна быть случайной. Есть много способов добиться этого. Например, можно использовать комбинацию microtime и rand, но можно приложить еще больше усилий для того, чтобы ваша соль была уникальной.

Хотя вероятность столкновения ничтожна, имейте в виду, что хэширование вашей соли с помощью MD5 или других алгоритмов, подверженных столкновениям, уменьшит вероятность того, что ваша соль уникальна без причины.

EDIT: Замените rand() на mt_rand(). Как отметил Майкл, это лучше, чем rand.

0
ответ дан 1 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

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