ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: этот ответ был написан в 2008 году.
С тех пор PHP предоставил нам password_hash и _ 2_ и, с момента их появления, они являются рекомендуемым методом хеширования и проверки паролей.
Тем не менее, теория ответа все еще хорошо читается.
TL;DR
Не делать
- Не ограничивайте количество символов, которые пользователи могут вводить для паролей. Это делают только идиоты.
- Не ограничивайте длину пароля. Если вашим пользователям нужно предложение с supercalifragilisticexpialidocious в нем, не мешайте им его использовать.
- Не удаляйте и не экранируйте HTML и специальные символы в пароле.
- Никогда не храните пароль пользователя в виде обычного текста.
- Никогда не отправляйте по электронной почте пароль своему пользователю , кроме случаев, когда он потерял свой пароль, а вы отправили ему временный пароль.
- Никогда и никогда не регистрируйте пароли каким-либо образом.
- Никогда не хешируйте пароли с SHA1, MD5 или даже SHA256! Современные взломщики могут превышать 60 и 180 миллиардов хэшей / второй (соответственно).
- Не смешивайте bcrypt и raw < / em> вывод hash (), либо используйте шестнадцатеричный вывод, либо base64_encode. (Это относится к любому входу, который может содержать мошеннический
\0, что может серьезно ослабить безопасность.)
Dos
- По возможности используйте scrypt; bcrypt, если не можете.
- Используйте PBKDF2, если вы не можете использовать bcrypt или scrypt с хешами SHA2.
- Сброс всех паролей при взломе базы данных.
- Обеспечьте разумную минимальную длину 8–10 символов, а также потребуйте минимум 1 букву в верхнем регистре, 1 букву в нижнем регистре, число и символ. Это улучшит энтропию пароля, что, в свою очередь, затруднит его взлом. (См. Раздел «Что такое хороший пароль?» Для обсуждения некоторых вопросов.)
Зачем вообще хешировать пароли?
Цель хеширования паролей проста: предотвратить злонамеренный доступ к учетным записям пользователей путем компрометации базы данных. Таким образом, цель хеширования паролей - отпугнуть хакера или взломщика, потратив слишком много времени или денег на вычисление паролей в виде простого текста. А время / стоимость - лучшие сдерживающие факторы в вашем арсенале.
Еще одна причина, по которой вам нужен хороший и надежный хэш для учетных записей пользователей, - это дать вам достаточно времени для изменения всех паролей в системе. Если ваша база данных скомпрометирована, вам потребуется достаточно времени, чтобы как минимум как минимум заблокировать систему, если не изменить все пароли в базе данных.
Джеремайя Гроссман, технический директор Whitehat Security, заявил на Блог White Hat Security после недавнего восстановления пароля, потребовавшего взлома его защиты паролем грубой силой:
Интересно, что, пережив этот кошмар, я узнал МНОГО, чего не знал, о взломе паролей, их хранении и сложности. Я понял, почему хранение паролей намного важнее сложности паролей. Если вы не знаете, как хранится ваш пароль, то все, на что вы действительно можете положиться, - это сложность. Это может быть хорошо известно профессионалам в области паролей и криптографии, но для среднего эксперта по информационной безопасности или веб-безопасности я очень сомневаюсь Это.
(Акцент мой.)
В любом случае, что делает пароль хорошим?
Энтропия. (Не то чтобы я полностью разделял точку зрения Рэндалла.)
Короче говоря, энтропия - это степень вариации пароля. Когда пароль состоит только из строчных латинских букв, это всего 26 символов. Это не большая вариация. Лучше использовать буквенно-цифровые пароли, состоящие из 36 символов. Но допустимый верхний и нижний регистр с символами составляет примерно 96 символов. Это намного лучше, чем просто буквы. Одна из проблем заключается в том, что для того, чтобы наши пароли запоминались, мы вставляем шаблоны, что снижает энтропию. Ой!
Энтропия пароля легко приблизительно. Использование полного диапазона символов ascii (примерно 96 печатных символов) дает энтропию 6,6 на символ, что при 8 символах для пароля все еще слишком мало (52,679 бит энтропии) для обеспечения безопасности в будущем. Но есть и хорошие новости: более длинные пароли и пароли с символами Unicode действительно увеличивают энтропию пароля и затрудняют его взлом.
Энтропия паролей более подробно обсуждается на Crypto StackExchange сайт. Хороший поиск в Google также даст много результатов.
В комментариях я разговаривал с @popnoodles, который указал, что принудительное применение политики паролей длины X с использованием X многих букв, цифр, символов и т. Д. Может фактически снизить энтропию, сделав схему паролей более предсказуемой. Я согласен. Randomess, как можно более случайный, всегда является самым безопасным, но наименее запоминающимся решением.
Насколько я могу судить, лучший в мире пароль - это Catch-22. Либо он не запоминающийся, либо слишком предсказуемый, либо слишком короткий, либо слишком много символов Юникода (трудно вводить на устройстве Windows / Mobile), слишком длинный и т. Д. Никакой пароль не подходит для наших целей, поэтому мы должны защищать их так, как будто они были в Форт-Ноксе.
Лучшие практики
Bcrypt и scrypt - это современные лучшие практики. Scrypt со временем будет лучше, чем bcrypt, но он не стал стандартом для Linux. / Unix или веб-серверами, и еще не опубликовал подробных обзоров своего алгоритма. Но все же будущее алгоритма выглядит многообещающим. Если вы работаете с Ruby, вам поможет scrypt gem, а теперь в Node.js собственный пакет scrypt. Вы можете использовать Scrypt в PHP через расширение Scrypt или Libsodium (оба доступны в PECL).
Я настоятельно рекомендую прочитать документацию по функции шифрования, если вы хотите понять, как использовать 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.
Вы не можете предвидеть все угрозы или пути атак, поэтому вы должны приложить все усилия, чтобы защитить своих пользователей заранее. Если вы этого не сделаете, то можете даже упустить тот факт, что на вас напали, пока не станет слишком поздно ... и вы несете ответственность. Чтобы избежать этой ситуации, начните с паранойи. Атакуйте ваше собственное программное обеспечение (изнутри) и попытайтесь украсть учетные данные пользователя или изменить учетные записи других пользователей или получить доступ к их данным. Если вы не проверяете безопасность своей системы, вы не можете винить никого, кроме себя.
Напоследок: я не криптограф. Все, что я сказал, это мое мнение, но я думаю, что оно основано на старом добром здравом смысле ... и большом количестве чтения. Помните, будьте как можно более параноиком, старайтесь как можно сложнее вмешиваться, а затем, если вы все еще беспокоитесь, обратитесь к хакеру в белой шляпе или криптографу, чтобы узнать, что они говорят о вашем коде / системе.
person
Robert K
schedule
30.12.2008