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

StackOverflow https://stackoverflow.com/questions/2235434

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Нет правильного решения

Другие советы

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


Если расширение 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 и повторным хешированием для паролей (т.относительно короткие строки) атаки методом перебора занимают одинаковое количество времени независимо от того, насколько сложен алгоритм хеширования.

С.

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

/* 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top