Каков правильный формат соли для раздува с использованием крипты PHP? - PullRequest
15 голосов
/ 09 февраля 2010

Я прочитал информацию, предоставленную в PHP Manual Entry для crypt(), но я все еще не уверен в том, какой формат соли для запуска алгоритма Blowfish.

В соответствии с ручным вводом, я должен использовать '$ 2 $' или '$ 2a $' как начало строки из 16 символов. Однако в приведенном ниже примере они используют гораздо более длинную строку: '$2a$07$usesomesillystringforsalt$', что указывает на то, что любая строка, которую я предоставляю, будет нарезана и нарезана кубиками для соответствия модели.

Проблема, с которой я сталкиваюсь, на самом деле вызывает алгоритм Blowfish против STD_DES. Пример:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $26HdMTpoODt6

Этот хеш, очевидно, не является вихревым, и на самом деле STD_DES только с первыми двумя символами соли, которые используются для соли. Однако в примере с руководством по PHP их соль начинается с '$2a$07$', поэтому, если я добавлю эти три символа в один и тот же код, я получу следующее:

$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt); 
// $hash = $2a$07$b1b2ee48991281a439da2OHi1vZF8Z2zIA.8njYZKR.9iBehxLoIC

Я заметил, что могу предоставить некоторую разницу в символах, которые здесь показаны как '07$', например, 04$ и 15$ оба работают, но 01$ до 03$ не работают (генерирует пустую строку), а значения, такие как 99$ и 85$, заставляют его снова вернуться к STD_DES.

Вопрос:

Каково значение этих трех символов, следующих за строкой '1030 *', которая, как я полагаю в руководстве, указывает функции crypt использовать метод blowfish.

Согласно руководству, '$2a$' должно быть достаточно, чтобы указать crypt() использовать метод blowfish; в чем же значение следующих трех символов? Что же тогда является правильным форматом для соли, если эти три символа настолько значимы?

1 Ответ

15 голосов
/ 09 февраля 2010

Число, следующее за 2a, указывает log2 количества раундов, которое нужно выполнить. Например, 10 означает 1024 раунда. Обычно 10 нормально. Не используйте слишком большие числа, иначе ваш пароль будет проверяться вечно.

См. Почему BCrypt.net GenerateSalt (31) возвращается сразу? для чего-то связанного. : -)

...