Какая реализация bcrypt рекомендуется для PHP 5.3?

Хорошо, я наконец-то понял bcrypt, как он работает и как хранить его в БД, так что я почти готов к работе. Теперь проблема заключается в том, чтобы выбрать, какую реализацию bcrypt использовать с PHP 5.3.

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

Вот те, что я нашел:

1) https://gist.github.com/marcoarment/1053158

2) http://www.openwall.com/phpass/

3) https://stackoverflow.com/a/6337021/869849

4) ... что-то еще?

Являются ли они взаимозаменяемыми или они производят разные хэши? Я хотел бы думать, что, поскольку все они «bcrypt», они дадут одинаковые результаты, но я не уверен (я тестировал 1) и 2) выше, и они кажутся взаимозаменяемыми, поскольку хэш, созданный 1), проверен 2) ).

Так какое же решение рекомендуется для PHP 5.3?


person ProgrammerGirl    schedule 27.03.2013    source источник
comment
Are these interchangeable, or do they produce different hashes? Почему бы вам не загрузить их и не попробовать?   -  person nickb    schedule 27.03.2013
comment
Лучшее решение: вам следует использовать библиотеку паролей, встроенную в PHP 5.5. Они выпустили версию с обратной совместимостью для PHP 5.3 и 5.4. См. здесь. Однако обратите внимание, что вам понадобится 5.3.7 или выше. В bcrypt до версии 5.3.7 была проблема с безопасностью, что означает, что новая библиотека не будет работать.   -  person Spudley    schedule 27.03.2013
comment
@nickb: я имел в виду в более общем плане, поскольку я действительно пробовал 1) и 2), и они кажутся взаимозаменяемыми, как упоминалось в моем посте выше.   -  person ProgrammerGirl    schedule 27.03.2013
comment
@Spudley: К сожалению, мой PHP ниже 5.3.7, иначе это было бы идеально. Что бы вы сказали, это следующий лучший вариант?   -  person ProgrammerGirl    schedule 27.03.2013
comment
@Programmer - тогда в идеале вам следует сразу обновиться (примечание: я упоминал, что в старых версиях bcrypt есть проблема с безопасностью). Если вы не можете обновить или не можете использовать библиотеку Password_compat по какой-либо другой причине, я бы посоветовал следующее: PasswordLib того же автора.   -  person Spudley    schedule 27.03.2013
comment
@Spudley: Хорошо, я только что обновился до PHP 5.3.22 по твоему совету. Итак, как мне установить рекомендованную вами библиотеку и как использовать ее для шифрования паролей моих пользователей?   -  person ProgrammerGirl    schedule 27.03.2013
comment
@Programmer - подождите, я опубликую это как ответ, а не здесь, в комментариях....   -  person Spudley    schedule 27.03.2013
comment
@Spudley: Ты потрясающий, большое спасибо! :)   -  person ProgrammerGirl    schedule 27.03.2013
comment
См. также фреймворк хеширования паролей PHP (PHPass) Openwall. Он портативный и защищен от ряда распространенных атак на пароли пользователей. Парень, написавший фреймворк (SolarDesigner), — это тот же парень, который написал John The Ripper, и сидит как судья в Соревновании по хэшированию паролей. Так что он кое-что знает об атаках на пароли.   -  person jww    schedule 12.10.2014


Ответы (2)


Лучшее решение: вам следует использовать библиотеку паролей, встроенную в PHP 5.5. Они выпустили версию с обратной совместимостью для PHP 5.3 и 5.4 под названием password_compat. Однако обратите внимание, что вам понадобится 5.3.7 или выше. В bcrypt до версии 5.3.7 была проблема с безопасностью, что означает, что новая библиотека не будет работать.

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

Установка

Обе библиотеки можно установить, просто загрузив их, скопировав в папку вашего сайта и включив их основной файл в свой код, т.е. require('password.php');.

Установка через Composer также возможна, если вы его используете.

Использование (при условии, что вы используете password_compat):

Чтобы создать пароль:

$hash = password_hash($password, PASSWORD_BCRYPT);

Чтобы подтвердить пароль:

if (password_verify($password, $hash)) {
    /* Valid */
} else {
    /* Invalid */
}

И это в принципе все, что вам нужно знать. Библиотека обрабатывает все остальные детали для вас, такие как солевой пароль и т. д.

[EDIT] Если вам нужно изменить «стоимость» алгоритма в соответствии с вашим комментарием, добавьте дополнительный параметр к вызову password_hash(), чтобы указать его, например:

password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

Полная документация доступна на странице загрузки, на которую я ссылался выше.

Действительно хорошая вещь в использовании библиотеки password_compat заключается в том, что она специально разработана для того, чтобы иметь тот же API и функциональность, которые встроены в PHP в качестве стандарта в PHP 5.5. Таким образом, если вы используете password_compat при работе с PHP 5.3 или 5.4, при переходе на PHP 5.5 у вас уже будет правильный код в вашей системе для использования новых встроенных функций пароля. Единственная разница будет заключаться в том, что вам не нужно include библиотеку.

person Spudley    schedule 27.03.2013
comment
Спасибо, Спадли! Что мне нужно будет сделать/изменить, когда я в конечном итоге перейду на PHP 5.5? - person ProgrammerGirl; 27.03.2013
comment
@Programmer — это имя библиотеки совместимости. Если вы позже переключитесь на PHP 5.5, вы можете просто удалить require('password.php'), и все будет в порядке, функция в PHP 5.5 будет иметь то же имя и те же параметры. - person martinstoeckli; 27.03.2013
comment
@Programmer - я изменил ответ, чтобы сделать его более понятным. :-) - person Spudley; 27.03.2013
comment
@Spudley: Круто, спасибо за разъяснение. Последний вопрос: как вы устанавливаете количество раундов (например, 8, 12 и т. д.) при создании хеша? - person ProgrammerGirl; 27.03.2013
comment
@Programmer - уже есть хорошее значение по умолчанию, равное 10, поэтому вы можете просто его не использовать. Если вы хотите использовать другой фактор стоимости, вы можете написать его так: password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]). - person martinstoeckli; 27.03.2013
comment
@martinstoeckli: Спасибо! Я слышал, что чем выше раунды/стоимость, тем лучше, если проверка не занимает слишком много времени (примерно около 1 секунды во время входа в систему). Так что я думаю использовать 13, так как мое оборудование может сделать это менее чем за 1 секунду. - person ProgrammerGirl; 27.03.2013
comment
@martinstoeckli прав, хотя обратите внимание, что синтаксис, который он использовал в комментарии выше, использует синтаксис короткого массива, для которого требуется PHP 5.4. (ОП утверждает, что у него 5.3). - person Spudley; 27.03.2013
comment
@Programmer - отредактированный ответ, включающий дополнительный пример с указанием параметра стоимости (т. е. функции «раундов», о которой вы спрашивали). - person Spudley; 27.03.2013
comment
@Programmer Я не хочу показаться задницей, но, поскольку вы работаете над функцией безопасности, я хотел бы предложить вам лучше прочитать документацию; ответ на количество раундов, как указать количество раундов и время, которое это (должно) занять, и еще несколько вопросов в комментариях, которые вы разместили, все были даны ответы в документация и/или ваш предыдущий вопрос. Я считаю довольно невежливым продолжать задавать вопросы, на которые люди тратят время, отвечая за вас, а вы не выполняете никакой работы. - person RobIII; 27.03.2013
comment
@Programmer: Кроме того, заявление о том, что я схожу с ума, глядя на все разные решения, не очень заслуживает доверия, если оба вопроса (этот и ваш предыдущий) разнятся всего в 50 минут. Либо вы не прикладываете много усилий, либо ваша планка сумасшествия установлена ​​на очень низкий порог ;-) Кроме того, password_compat упоминался в вашем предыдущем вопросе, но вы не удосужились взглянуть на него или упомянуть это в этом вопрос?? Почему? Я просто говорю... - person RobIII; 27.03.2013
comment
@RobIII: Я не понимаю, почему ты гоняешься за мной и доставляешь мне неприятности, вчера я провел весь день (а не 50 минут), исследуя bcrypt в N-й раз. Я очень мало знаю о шифровании, поэтому я не хочу делать НИКАКИХ предположений и рисковать сделать что-то не так, что в конечном итоге оставит огромную дыру в безопасности на моем сайте. Пожалуйста, не делайте предположений обо мне, поскольку вы меня не знаете и не знаете, сколько времени я потратил на изучение bcrypt. Спасибо. - person ProgrammerGirl; 27.03.2013
comment
@Programmer Я не преследую тебя (просто случайно наткнулся на этот вопрос, а также на твой предыдущий вопрос). Все, что я говорю, это то, что между обоими вопросами есть 50-минутный промежуток времени. В предыдущем вопросе многое было объяснено, упомянут пароль_compat, и многие (если не все) ваши вопросы на ЭТОТ вопрос уже был дан ответ. Все, что я хочу сказать, это то, что вам, возможно, придется читать внимательнее и постараться помнить, что другие люди тратят время, отвечая на ваши вопросы. Почтите (уважайте, если хотите) это время, изучив ответы close(r). Прошлое да будет в прошлом. - person RobIII; 27.03.2013
comment
@RobIII: Понятно, но, судя по отзывам и тому, сколько раз мои сегодняшние вопросы, связанные с bcrypt, попадали в избранное, я явно не единственный, у кого есть эти сомнения. Безопасность/шифрование очень сложны для тех из нас, кто не является экспертом в этом, и риски огромны, поэтому я всегда предпочитаю спрашивать (даже если это заставляет меня выглядеть глупо), а не предполагать, что я правильно что-то понял, когда ставки высоки. это высокое. В любом случае, спасибо за ваш совет. - person ProgrammerGirl; 27.03.2013

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

Есть изменения с 5.3 на 5.4 и страница обратной несовместимости примечаний к выпуску.

http://php.net/manual/en/migration54.incompatible.php

person Yousef Altaf    schedule 27.09.2014
comment
Я не могу найти на связанной странице ничего, что могло бы иметь какое-либо значение для использования password_hash(). - person martinstoeckli; 28.09.2014
comment
@martinstoeckli нет, дело не в password_hash(), а в обновлении с PHP 5.3.x до 5.5. У меня та же проблема, и я нашел решение для обновления до PHP 5.5, поэтому я прочитал об обновлении на этой странице. - person Yousef Altaf; 28.09.2014
comment
Хорошо, но какое это имеет отношение к вопросу тогда? - person martinstoeckli; 28.09.2014
comment
Я читал ответы об этом Лучшее решение: вы должны использовать библиотеку паролей, встроенную в PHP 5.5. Они выпустили версию с обратной совместимостью для PHP 5.3 и 5.4 под названием password_compat. Однако обратите внимание, что вам понадобится 5.3.7 или выше. В bcrypt до версии 5.3.7 была проблема с безопасностью, что означает, что новая библиотека не будет работать. поэтому я пишу, если вы пытаетесь обновиться до PHP 5.5, пожалуйста, ознакомьтесь с этим перед миграцией для тех, кто планирует обновление. это все. - person Yousef Altaf; 28.09.2014
comment
Что ж, эта проблема безопасности была исправлена ​​с помощью алгоритма 2y вместо 2a, оба создают хэши BCrypt. Даже если вы создали хэши с помощью 2a, вы можете проверить их с помощью PHP 5.5, поэтому он является обратно совместимым. Только с некоторыми очень странными и недействительными паролями юникода у вас могли возникнуть проблемы, но даже тогда использование 2a было лучшим доступным алгоритмом. - person martinstoeckli; 28.09.2014
comment
Спасибо @martinstoeckli за информацию, но у меня проблема с PHPass. Я не знаю, правильно ли это или нет, чтобы разместить ссылку на мой вопрос здесь, чтобы вы могли ее увидеть, но в любом случае, пожалуйста, просмотрите ее, и если вы можете помочь мне с этим, я буду очень признателен вам stackoverflow.com/questions /26034417/ - person Yousef Altaf; 28.09.2014
comment
Давайте продолжим обсуждение в чате. - person Yousef Altaf; 28.09.2014