2010-02-03 2 views
9

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

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

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

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

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

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

$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'; 
$salt = '$2a$07$'; 

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

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

Вы добавили '$ 2a $ 07 $' дважды к значению соли, это намеренно? – meagar

+0

Да. Вот почему я публикую. Если вы удалите одну из этих строк, функция склепа будет случайным образом возвращать зашифрованную строку. Я хотел бы удалить строку из цикла for и сохранить строку в функции crypt. Когда я удаляю его, функция крипты выходит из строя. – timmay

+0

Если вы запустите этот код так, как он есть, он не подведет. Удалите одну из этих строк $ 2a $ 07 $, и она не удалась. – timmay

ответ

3

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

+0

Я не уверен, почему он работает, если вы дважды добавляете идентификатор соли, но, возможно, один из $ во втором id заставляет его перестать разбирать соль после этого или аналогично. > _ < –

+0

Ничего себе, ты прав. Он не провалился один раз. Я просто удалил последние два символа в строке base64. – timmay

+0

Спасибо, мой друг. – timmay

3

Я знаю, этот вопрос практически древней истории сейчас, но на благо тех, кто считает его с помощью поиска Google, есть довольно подробное описание того, как Bcrypt/EksBlowfish соли действуют в ответ на этот вопрос:

Why does crypt/blowfish generate the same hash with two different salts?

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

Смежные вопросы