ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Этот ответ был написан в 2008 году.
С тех пор PHP дал нам password_hash
и password_verify
, с момента их появления, они являются рекомендуемым методом хеширования и проверки пароля.
Теория ответа все еще хорошо читается.
TL; DR
Этикет
- Не ограничивайте количество символов, которые пользователи могут вводить для паролей. Только идиоты делают это.
- Не ограничивайте длину пароля. Если ваши пользователи хотят получить предложение с суперкалифрагистическим выражением, не запрещающее им использовать его.
- Не удаляйте HTML-код и специальные символы в пароле.
- Никогда не храните пароль своего пользователя в виде обычного текста.
- Никогда не отправляйте пароль пользователю по электронной почте, за исключением случаев, когда он потерял свой, и вы отправили временный пароль .
- Никогда, никогда не регистрируйте пароли каким-либо образом.
- Никогда не хэшируйте пароли с SHA1 или MD5 или даже с SHA256! Современные взломщики могут превышать 60 и 180 миллиардов хэшей в секунду (соответственно).
- Не смешивайте bcrypt и с необработанным выводом hash () , либо используйте шестнадцатеричный вывод, либо base64_encode. (Это относится к любым данным, которые могут содержать мошенников
\0
, что может серьезно ослабить безопасность.)
ДОС
- Используйте Scrypt, когда можете; bcrypt если не можешь.
- Используйте PBKDF2, если вы не можете использовать bcrypt или scrypt, с хэшем SHA2.
- Сбросьте все пароли, когда база данных взломана.
- Реализуйте разумную минимальную длину 8-10 символов, плюс требуйте как минимум 1 заглавную букву, 1 строчную букву, число и символ. Это улучшит энтропию пароля, что, в свою очередь, усложнит его взлом. (См. Раздел «Что делает хороший пароль?» Для некоторых дебатов.)
Зачем хешировать пароли?
Цель хеширования паролей проста: предотвратить злонамеренный доступ к учетным записям пользователей путем взлома базы данных. Таким образом, цель хеширования паролей состоит в том, чтобы удержать хакеров или взломщиков, затратив им слишком много времени или денег для вычисления паролей в виде простого текста. И время / стоимость - лучшие сдерживающие факторы в вашем арсенале.
Еще одна причина, по которой вам нужен хороший и надежный хэш для учетных записей пользователей, - это предоставление вам достаточно времени для изменения всех паролей в системе. Если ваша база данных взломана, вам потребуется достаточно времени, чтобы хотя бы заблокировать систему, если не поменять каждый пароль в базе данных.
Джеремия Гроссман, технический директор Whitehat Security, заявил в блоге White Hat Security после недавнего восстановления пароля, которое требовало взлома его защиты паролем:
Интересно, что, живя в этом кошмаре, я узнал много, чего не знал о взломе паролей, хранении и сложности. Я понял, почему хранение паролей намного важнее, чем сложность пароля. Если вы не знаете, как хранится ваш пароль, то все, от чего вы действительно можете зависеть - это сложность. Это может быть общеизвестно для паролей и крипто-профессионалов, но для среднего специалиста по InfoSec или веб-безопасности я в этом сильно сомневаюсь.
(Акцент мой.)
Что делает хороший пароль в любом случае?
Энтропия . (Не то чтобы я полностью разделяю точку зрения Рэндалла.)
Короче говоря, энтропия - это то, насколько сильно варьируется пароль. Когда пароль состоит только из строчных латинских букв, это всего 26 символов. Это не большая вариация. Буквенно-цифровые пароли лучше, с 36 символами. Но допускается верхний и нижний регистр, с символами, примерно 96 символов. Это намного лучше, чем просто буквы. Одна проблема состоит в том, чтобы сделать наши пароли запоминающимися, мы вставляем шаблоны, что уменьшает энтропию. К сожалению!
Энтропия пароля легко аппроксимируется . Использование полного диапазона символов 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, так важны.
Вы не можете , возможно , предвидеть все угрозы и пути атак, и поэтому вы должны сделать ваши лучшие усилия , чтобы защитить пользователей фронт . Если вы этого не сделаете, то вы можете даже упустить тот факт, что на вас напали, пока не стало слишком поздно ... и вы несете ответственность . Чтобы избежать этой ситуации, начните действовать параноиком. Атакуйте свое собственное программное обеспечение (внутренне) и пытайтесь украсть учетные данные пользователя или изменить учетные записи других пользователей или получить доступ к их данным. Если вы не проверяете безопасность своей системы, вы не можете винить никого, кроме себя.
Наконец: я не криптограф. Что бы я ни говорил, это моё мнение, но мне кажется, что оно основано на здравом смысле ... и много читаю. Помните, будьте настолько параноиком, насколько это возможно, постарайтесь как можно сложнее вмешиваться, а затем, если вы все еще волнуетесь, свяжитесь с хакером или криптографом в белой шляпе, чтобы узнать, что они говорят о вашем коде / системе.