PHP склеп и соль - уточнение, пожалуйста - PullRequest
9 голосов
/ 03 февраля 2010

Я был здесь вчера и получил несколько действительно хороших ответов.Я взял то, что получил, и собрал, что, я думаю, будет довольно безопасным алгоритмом.У меня проблема с использованием blowfish с циклом for, который генерирует соль.

Я использую символы base64 и цикл for для получения случайной строки.Я хочу взять эту сгенерированную строку и вставить ее в функцию crypt в качестве соли.

Поскольку документация о blowfish очень скудна, а в документации PHP на самом деле об этом даже не упоминается, я вроде как закололаздесь, в темноте.

Действительно странная вещь - если вы запустите этот код таким, какой он есть сейчас, он не потерпит неудачу.Удалите из * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.Насколько я понимаю, blowfish состоит в том, что зашифрованная строка должна начинаться с '$ 2a $ 07 $' и заканчиваться на '$', следовательно, конкатенация в функции crypt. Мне действительно не нужна начальная строка надцикл и просто хотел избавиться от него.

Я также хотел бы получить разъяснения о наилучшей практике хранения случайных солей, либо в базе данных или путем сохранения выходных данных функции cryptв базе данных?

Вчера не было никакого реального кода, просто обсуждение. Я хотел бы собрать немного кода сегодня и иметь кое-что, что является довольно безопасным. Если кто-то может придуматьлучший алгоритм, я всегда открыт.

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';

for($i=0; $i<60; $i++)
{
    $salt .= $base64[rand(0,63)];
}

return crypt('password', '$2a$07$'.$salt.'$');

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

Я знаю, что этот вопрос является практически древней историей, но для любого, кто найдет его при поиске в Google, в ответе на этот вопрос есть довольно подробное описание того, как работают соли bcrypt / EksBlowfish:

Почему crypt / blowfish генерирует одинаковый хеш с двумя разными солями?

Краткий ответ, как сказал caf, использует алфавит base64, составленный из [a-zA-Z0-9./], с$ как нулевой (НЕ 0) символ завершения / заполнения.Если вы используете какие-либо символы за пределами этого диапазона или $ слишком рано, это приведет к ошибке или не будет интерпретировать всю соль.

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

Кажется, что crypt() не любит + символ в соли, а также множество других специальных символов (*, % и т. Д.). Если вы отфильтровываете их, это должно работать при каждой попытке (и не нужно повторять строку идентификатора соли).

...