Что такое путь в PHP для создания случайной соли переменной длины для использования в хешировании? Скажем, я хочу сделать длинную соль с 16 символами - как я сделал бы это?
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, вам нужна безопасная для двоичного кода функция для его сохранения / извлечения.
в зависимости от вашей ОС, что-то вроде:
$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);
Почитайте о поведении random и urandom.
Хотя другие правильно отметили, что есть некоторые проблемы с md5 и повторным хэшированием, для паролей (т.е. относительно коротких строк) атаки перебором занимают одинаковое количество времени независимо от того, насколько сложным является алгоритм хэширования.
C.
Для хорошей соли есть два необходимых условия: Она должна быть длинной, и она должна быть случайной. Есть много способов добиться этого. Например, можно использовать комбинацию microtime
и rand
, но можно приложить еще больше усилий для того, чтобы ваша соль была уникальной.
Хотя вероятность столкновения ничтожна, имейте в виду, что хэширование вашей соли с помощью MD5 или других алгоритмов, подверженных столкновениям, уменьшит вероятность того, что ваша соль уникальна без причины.
EDIT: Замените rand()
на mt_rand()
. Как отметил Майкл, это лучше, чем rand
.