Как создать случайную длинную соль для использования в хешировании?
Как в PHP сделать произвольную соль переменной длины для использования в хешировании? Допустим, я хочу сделать 16-символьную соль - как бы я это сделал?
4 ответа
Редактировать: расширение 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);
Читайте о поведении случайных и случайных.
В то время как другие правильно указали, что существуют некоторые проблемы с 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 или других склонных к столкновениям алгоритмов уменьшит вероятность того, что ваша соль уникальна безо всякой причины.
РЕДАКТИРОВАТЬ: заменить rand()
за mt_rand()
, Как заметил Майкл, это лучше, чем rand
,