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

Как в 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,

Другие вопросы по тегам