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

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

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

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

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

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

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

Читайте о поведении случайных и урбандов.

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

C.

Здесь я нашел функцию для генерации случайной строки:

 /* random string */ function rand_string( $length ) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $size = strlen( $chars ); for( $i = 0; $i < $length; $i++ ) { $str .= $chars[ rand( 0, $size - 1 ) ]; } return $str; } 

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

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

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