Как создать случайную длинную соль для использования в хешировании? - PullRequest
14 голосов
/ 10 февраля 2010

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

Ответы [ 4 ]

60 голосов
/ 10 февраля 2010

edit: расширение mcrypt устарело. Для новых проектов взгляните на
random_bytes (int $ length)
и расширение натрия (по состоянию на ядро ​​php 7.2).


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

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

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

3 голосов
/ 10 февраля 2010

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

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

Читайте о поведении случайного и случайного.

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

С

2 голосов
/ 12 июля 2012

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

/* 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;
}
0 голосов
/ 10 февраля 2010

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

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

РЕДАКТИРОВАТЬ: заменить rand() на mt_rand(). Как заметил Майкл, это лучше чем rand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...