Как я могу продать bcrypt в приложении PHP (и я должен)? - PullRequest
6 голосов
/ 24 августа 2010

Я участвую в относительно зрелом проекте PHP с открытым исходным кодом. Недавно я обнаружил, что он хранит пароли в виде простых хеш-кодов MD5, что довольно утомительно для меня. Я подумал, что если я собирался это исправить, я мог бы также сделать все правильно (тм), поэтому я хотел бы использовать bcrypt.

Во-первых, то, что я нашел для других языков: bcrypt-ruby , похоже, использует либо оригинальный код C из OpenBSD, либо java-код jBCrypt . py-bcrypt - это тонкая оболочка вокруг кода BSD. BCrypt.net - это прямой порт jBCrypt .

Теперь, сам PHP поддерживает bcrypt (хотя и обманчиво называемый просто 'blowfish') в функции crypt . Однако версии до 5.3 требуют поддержки самой системы, обычно предоставляемой crypt_blowfish . phpass такой же, и рекомендует установить PHP 5.3 или Suhosin .

Поскольку многие пользователи приложения используют стандартный виртуальный хостинг, я не хочу требовать какой-либо специальной настройки сервера. Я надеялся просто украсть код из релиза PHP 5.3, но он написан на C, и (из небольшого объема чтения, который я только что сделал) я не могу требовать использования C-расширения для пользователей проекта.

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

Итак, я представляю вам два (многочастных) вопроса:

  1. Получило ли мое отсутствие знания PHP лучшее от меня? Могу ли я действительно использовать одну из уже созданных реализаций?
  2. Должен ли я вместо этого просто создать простую петлевую функцию, которая несколько раз вызывает sha1() или md5() в течение некоторого настраиваемого числа раз?

Ответы [ 3 ]

7 голосов
/ 24 августа 2010

Получает ли мое отсутствие знания PHP лучшее от меня?Могу ли я действительно использовать одну из уже созданных реализаций?

К сожалению, вы правы.До версии 5.3.0 PHP не поддерживал bcrypt по умолчанию.Вместо этого он полагался на поддержку ОС (проверьте константу CRYPT_BLOWFISH).Как вы указали, Suhosin является опцией в этом случае.

Должен ли я вместо этого просто создать простую циклическую функцию, которая несколько раз вызывает sha1 () или md5 () для некоторыхнастраиваемое количество раз?

Лучший совет, когда дело доходит до криптографии, - «не бросай свой».Повторные вызовы sha1() или md5() могут или не могут повысить безопасность.

Авторы bcrypt, с другой стороны, объясняют свои дизайнерские решения по этой статье .

1 голос
/ 07 июня 2012

Одним из преимуществ phpass, который вы не затронули, было то, что он автоматически возвращается к использованию DES и, наконец, MD5 в качестве базового шифра, если CRYPT_BLOWFISH недоступен.Оболочка использует их таким образом, что даже реализация md5 значительно более безопасна, чем простой хеш.

1 голос
/ 12 августа 2011

К сожалению, вы не можете использовать bcrypt с Blowfish, если вы не используете PHP 5.3 или не используете расширение Suhosin или, возможно, операционная система не поддерживает Blowfish в своей реализации bcrypt.

Таким образом, в этом случае лучше всего использовать SHA-256 или SHA-512 с растягиванием клавиши (и, конечно, солью). Но когда дело доходит до безопасности, использование собственного решения никогда не является хорошей идеей.

...