Как сгенерировать случайную длинную соль для использования при хешировании?
-
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
.