Каков правильный формат соли blowfish с использованием PHP-склепа?

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

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

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

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

Этот хэш, очевидно, не является водоворотом, и на самом деле STD_DES, причем только первые два символа соли используются для соли. Однако в примере с PHP Manual их соль начинается с '$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.

Вопрос:

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

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

Ответы

Ответ 1

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

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