ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Этот ответ был написан в 2008 году.
С тех пор PHP дал нам password_hash
и password_verify
, и с момента их появления они являются рекомендуемым методом хеширования и проверки пароля.
Теория ответа все еще хорошо читается.
TL; DR
Этикет
- Не ограничивайте количество символов, которые пользователи могут вводить для паролей. Это делают только идиоты.
- Не ограничивайте длину пароля. Если ваши пользователи хотят получить предложение с суперкалифрагистическим выражением, не запрещающее им использовать его.
- Никогда не храните пароль своего пользователя в виде обычного текста.
- Никогда не посылайте по электронной почте пароль вашему пользователю , за исключением случаев, когда они потеряли свои, и вы отправили временный.
- Никогда, никогда не регистрируйте пароли каким-либо образом.
- Никогда не хэшируйте пароли с SHA1 или MD5 или даже SHA256! Современные взломщики могут превышать 60 и 180 миллиардов хэшей в секунду (соответственно).
- Не смешивайте bcrypt и с raw выводом hash () , либо используйте шестнадцатеричный вывод, либо base64_encode его. (Это относится к любому входу, в котором может содержаться мошенник
\0
, что может серьезно ослабить безопасность.)
Dos
- Используйте scrypt, когда можете; bcrypt если не можешь.
- Используйте PBKDF2, если вы не можете использовать ни bcrypt, ни scrypt, с хешами SHA2.
- Сбросить все пароли при взломе базы данных.
- Реализуйте разумную минимальную длину 8-10 символов, плюс требуйте как минимум 1 заглавную букву, 1 строчную букву, число и символ. Это улучшит энтропию пароля, что, в свою очередь, усложнит его взлом. (См. Раздел «Что делает хороший пароль?» Для обсуждения).
В любом случае, зачем хешировать пароли?
Цель хеширования паролей проста: предотвратить злонамеренный доступ к учетным записям пользователей путем взлома базы данных. Таким образом, цель хеширования паролей состоит в том, чтобы удержать хакеров или взломщиков, затратив им слишком много времени или денег для вычисления паролей в виде простого текста. А время / стоимость - лучшие сдерживающие факторы в вашем арсенале.
Еще одна причина, по которой вам нужен надежный и надежный хэш для учетных записей пользователей, - это предоставление вам достаточно времени для изменения всех паролей в системе. Если ваша база данных взломана, вам понадобится достаточно времени, чтобы на минимум заблокировать систему, если не поменять каждый пароль в базе данных.
Джеремия Гроссман, технический директор Whitehat Security, заявил в своем блоге после недавнего восстановления пароля, которое требовало взлома его защиты паролем:
Интересно, что, пережив этот кошмар, я узнал ОЧЕНЬ много, чего не знал о взломе паролей, хранении и сложности. Я понял, почему хранение паролей намного важнее, чем сложность паролей. Если вы не знаете, как хранится ваш пароль, то все, от чего вы действительно можете зависеть - это сложность. Это может быть общеизвестно для паролей и крипто-профессионалов, но для среднего специалиста по InfoSec или веб-безопасности я сильно сомневаюсь .
(Акцент мой.)
Что делает хороший пароль в любом случае?
Энтропия . (Не то чтобы я полностью разделял точку зрения Рэндалла.)
Короче говоря, энтропия - это количество вариаций в пароле. Когда пароль состоит только из строчных латинских букв, это всего 26 символов. Это не большая вариация. Буквенно-цифровые пароли лучше, с 36 символами. Но допускается верхний и нижний регистр, с символами, примерно 96 символов. Это намного лучше, чем просто буквы. Одна проблема состоит в том, чтобы сделать наши пароли запоминающимися, мы вставляем шаблоны, что уменьшает энтропию. Oops!
* 1 089 * Паэнтропия ssword
приблизительно легко. Использование полного диапазона символов ascii (примерно 96 набираемых символов) дает энтропию 6,6 на символ, что при 8 символах для пароля все еще слишком мало (52,679 бит энтропии) для будущей безопасности. Но есть и хорошая новость: более длинные пароли и пароли с символами Юникода действительно увеличивают энтропию пароля и усложняют его взлом.
На сайте Crypto StackExchange дольше обсуждается вопрос об энтропии паролей. Хороший поиск в Google также даст много результатов.
В комментариях, которые я говорил с @popnoodles, он отметил, что применение политики паролей длиной X с множеством букв, цифр, символов и т. Д. Может реально уменьшить энтропию, сделав схему паролей более предсказуемы. Я согласен. Randomess, как можно более случайный, всегда является самым безопасным, но наименее запоминающимся решением.
Насколько я могу судить, лучший пароль в мире - Catch-22. Либо это не запоминающееся, слишком предсказуемое, слишком короткое, слишком много символов Юникода (трудно набрать на устройстве Windows / Mobile), слишком длинный и т. Д. Ни один пароль не достаточно хорош для наших целей, поэтому мы должны защищать их, как будто они были в форте Нокс.
Лучшие практики
Bcrypt и scrypt являются текущими лучшими практиками. Scrypt будет лучше, чем bcrypt во времени, но он не воспринимается как стандарт Linux / Unix или веб-серверами и еще не опубликовал подробные обзоры своего алгоритма. Но все же будущее алгоритма выглядит многообещающим. Если вы работаете с Ruby, есть scrypt gem , который поможет вам, и Node.js теперь имеет свой собственный пакет scrypt . Вы можете использовать Scrypt в PHP через расширение Scrypt или расширение Libsodium (оба доступны в PECL).
Я настоятельно рекомендую прочитать документацию для функции crypt , если вы хотите понять, как использовать bcrypt, или найти себе хорошую оболочку или использовать что-то еще как PHPASS для более унаследованной реализации. Я рекомендую минимум 12 раундов bcrypt, если не 15 до 18.
Я передумал об использовании bcrypt, когда узнал, что bcrypt использует только расписание ключевых слов blowfish с механизмом переменных затрат. Последнее позволяет увеличить стоимость взлома пароля путем увеличения и без того дорогого расписания ключей blowfish.
Средние практики
Я почти не могу представить эту ситуацию больше. PHPASS поддерживает PHP 3.0.18–5.3, поэтому его можно использовать практически во всех возможных установках, и его следует использовать, если вы точно не знаете , что ваша среда поддерживает bcrypt.
Но предположим, что вы вообще не можете использовать bcrypt или PHPASS. Что тогда?
Попробуйте реализовать PDKBF2 с максимальным количеством раундов , которое может выдержать ваша среда / приложение / восприятие пользователя. Наименьшее число, которое я бы порекомендовал, это 2500 раундов. Кроме того, обязательно используйте hash_hmac () , если это возможно, чтобы сделать операцию более трудной для воспроизведения.
Будущие практики
В PHP 5.5 появилась библиотека для полной защиты паролем , которая избавляет от любых трудностей при работе с bcrypt. Хотя большинство из нас придерживаются PHP 5.2 и 5.3 в большинстве распространенных сред, особенно на общих хостах, @ircmaxell создал уровень совместимости для предстоящего API, обратно совместимого с PHP 5.3.7.
Криптография, обзор и отказ от ответственности
Вычислительная мощность, необходимая для взлома хешированного пароля, не существует. Единственный способ «взломать» пароль для компьютеров - это воссоздать его и смоделировать алгоритм хеширования, используемый для его защиты. Скорость хэша линейно связана с его способностью к грубому принуждению. Хуже того, большинство алгоритмов хеширования можно легко распараллелить, чтобы они работали еще быстрее. Вот почему такие дорогостоящие схемы, как bcrypt и scrypt, так важны.
Вы не можете предвидеть все угрозы или пути атаки, поэтому вы должны приложить все усилия, чтобы защитить своих пользователей заранее . Если вы этого не сделаете, то вы можете даже упустить тот факт, что на вас напали, пока не стало слишком поздно ... и вы несете ответственность . Чтобы избежать этой ситуации, начните действовать параноиком. Атакуйте свое собственное программное обеспечение (внутренне) и пытайтесь украсть учетные данные пользователя или изменить учетные записи других пользователей или получить доступ к их данным. Если вы не проверяете безопасность своей системы, вы не можете винить никого, кроме себя.
Наконец: я не криптограф. Что бы я ни говорил, это моё мнение, но мне кажется, что оно основано на здравом смысле ... и много читаю. Помните, будьте настолько параноиком, насколько это возможно, делайте вещи настолько сложными, насколько это возможно, а затем, если вы все еще беспокоитесь, свяжитесь с хакером или криптографом в белой шляпе, чтобы узнать, что они говорят о вашем коде / системе.