Я участвую в относительно зрелом проекте 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, ни с офигенная рыба, и ошибка здесь может быть одновременно опасной и трудноразличимой.
Итак, я представляю вам два (многочастных) вопроса:
- Получило ли мое отсутствие знания PHP лучшее от меня? Могу ли я действительно использовать одну из уже созданных реализаций?
- Должен ли я вместо этого просто создать простую петлевую функцию, которая несколько раз вызывает
sha1()
или md5()
в течение некоторого настраиваемого числа раз?