PHP: rfc:password_hash

«соленое» хеширование паролей: делаем правильно

Если вы являетесь веб-разработчиком, система учетных записей пользователей должна быть создана. Защита паролем системы учетных записей пользователей является ее самым важным компонентом.

Безопасность пользователей часто нарушается, поэтому вы должны быть готовы защищать пароли ваших посетителей от хакеров.

Солевое хеширование – самый эффективный метод защиты паролей. Как правильно его применять, подробно описано в этой статье.

Идеи, вызывающие споры, и распространенные заблуждения относительно хеширования паролей.

Одной из таких базовых и неправильных тем является хэширование паролей. На этой странице я постараюсь объяснить, как правильно хэшировать.

Односторонние функции – это алгоритмы хэширования. Они преобразуют любые данные в необратимый “отпечаток пальца” фиксированной длины.

В качестве альтернативы алгоритмы могут лишь незначительно изменять входное значение (см. предыдущий пример).

Это отлично подходит для защиты паролей, поскольку позволяет нам хранить пароль в зашифрованном виде и одновременно проверять правильность входа пользователя в систему.

Типичные блок-схемы процедуры регистрации и аутентификации учетной записи в системе на основе хэша:

  1. Пользователь создает учетную запись;
  2. Хэш-код пароля вычисляется и сохраняется в базе данных. Пароль, записанный открытым текстом (незашифрованным) на жестком диске, не имеет смысла;
  3. Когда пользователь пытается войти в систему, хэш-код, вычисленный по введенному паролю, сравнивается с хэш-кодом реального пароля (полученного из базы данных);
  4. Если хэш-коды совпадают, пользователю предоставляется доступ. Если это не так, пользователю сообщается, что он ввел неверные данные для доступа к учетной записи;
  5. Шаги 3 и 4 повторяются каждый раз, когда кто-то пытается получить доступ к своей учетной записи.

Никогда не сообщайте пользователю, что его имя пользователя или пароль неверны, во время шага 4. Выводите сообщение “Неверное имя пользователя или пароль”, если вы видите только общее. RU помешает хакерам определить правильные пароли, не имея доступа к информации о пароле.

Следует отметить, что хэш-функции для защиты паролей отличаются друг от друга. Хэш-функции, используемые для реализации структур данных, таких как хэш-таблицы, не предназначены для быстрого выполнения.

Единственные хэш-функции, которые можно использовать для реализации паролей, – это криптографические. Три криптографические хэш-функции – SHA256, RipeMD и WHIRLPOOL.

Легко предположить, что использование паролей требует применения криптографической хэш-функции для каждого действия. Это совсем не так. Простые хэш-коды могут быть использованы для восстановления паролей различными способами.

Однако существует несколько простых стратегий, с помощью которых можно значительно снизить эффективность атак. Посмотрите на этот сайт, чтобы проиллюстрировать, почему необходимо использовать эти методы.

Можно отправить список хэш-кодов для взлома и получить результаты менее чем через минуту. Очевидно, что простое хеширование паролей не удовлетворяет наши потребности в безопасности.

В следующем разделе мы рассмотрим несколько типичных методов взлома простых паролей.

Атаки по словарю

Атака с полностью побежденным:

Самый быстрый способ расшифровать хэш-код – это вычислить пароль для каждой догадки и посмотреть, совпадает ли он с самим паролем.

Угаданная комбинация является паролем, если хэш-коды совпадают. Атаки по словарю и перебором – два наиболее популярных метода взлома паролей.

Файл со словами и паролями, которые потенциально могут использоваться в качестве строк паролей, используется в атаке по словарю. Каждая буква в файле хэшируется, и хэш-код пароля сравнивается с ней.

Если слова совпадают, то они являются паролем. Для создания таких файлов могут быть извлечены слова из больших текстовых файлов и даже из реальных баз данных паролей. Словари часто используют дополнительную обработку, например, : для более эффективного использования, заменяя слова “lit spike” эквивалентами (“h3110”).

Атака “грубой силы” перебирает все возможные комбинации символов до определенной длины. Эти атаки требуют больших вычислительных мощностей и являются наименее эффективными с точки зрения количества хэш-кодов, которые могут быть взломаны после выполнения.

Пароли должны быть достаточно длинными, чтобы перебор всех комбинаций символов не занимал слишком много времени.

В мире не существует способа защиты от атак методом перебора или по словарю. Хотя существуют альтернативы, их невозможно избежать. Если ваша система хеширования паролей надежна, единственный способ взломать ее – подвергнуть каждый хеш-код атаке по словарю или перебором.

Для взлома большого количества хэш-кодов одного типа очень эффективны таблицы поиска. Основная концепция заключается в создании таблиц поиска для паролей из словаря путем вычисления их хэш-кодов.

Даже если они содержат многие миллиарды хэшей, идеально реализованные таблицы поиска могут обрабатывать сотни обращений к хэш-кодам в секунду.

Попробуйте взломать следующие хэш-коды sh256 с помощью бесплатного кода от CrackStation, если вы хотите узнать больше о том, как работают таблицы поиска и насколько быстро они на самом деле.

Менее чем за секунду эти хеш-коды могут быть взломаны.

Используя упомянутый выше инструмент, вы можете сгенерировать собственный хэш-код и попытаться его взломать.

Без предварительно сгенерированной таблицы поиска такая атака позволяет злоумышленнику использовать атаку по словарю или перебором одновременно на большое количество хэш-кодов.

Далее злоумышленник разрабатывает таблицу поиска, которая связывает список лиц пользователей с хэш-кодом каждого пароля из взломанной базы данных пользователей. Список пользователей, чьи пароли угадывает злоумышленник, получается путем хэширования каждого предполагаемого пароля и использования таблицы поиска.

Пользователи, которые пользуются общим паролем, являются целью атаки.

Метод, который позволяет найти компромисс между временем поиска и использованием памяти, – это использование радужных таблиц. В них таблицы поиска похожи на таблицы поиска.

Решения для многих хэш-кодов можно хранить в том же объеме памяти, если таблицы меньше. Любой хэш-код пароля md5 длиной до 8 символов может быть взломан с помощью радужных таблиц.

Метод, который мы рассмотрим далее, предотвращает взлом хэш-кода с использованием радужных таблиц и строк поиска.

Радужные таблицы и поиск работают только потому, что каждый пароль хэшируется абсолютно одинаково.

Пароль будет соответствовать хэш-коду, если он принадлежит тому же пользователю. Мы можем остановить атаку, если она повторится.

Добавляя случайное число в начало или конец паролей, вы можете добавить случайный элемент в хэш-коды. В результате все строки, полученные в вышеупомянутом примере, представляют собой совершенно разные слова.

Соль обычно сохраняется в базе данных учетных записей пользователей вместе с хэш-кодом для проверки точности пароля или его соответствия требованиям пользователя.

Возможно, не секрет, где находится соль. Просто таблицы обратного поиска и радужные таблицы бесполезны при использовании случайного значения. Нападающий не знает о природе таблицы или соли, которая будет использоваться.

Атака обратного поиска не удается, если солевая таблица, используемая для хэширования паролей каждого пользователя, отличается.

В следующем разделе мы рассмотрим типичные ошибки, возникающие при использовании соли.

Соль не должна быть сокращена или использована дважды.

В этом разделе рассматривается еще одно широко распространенное заблуждение, связанное с хешированием паролей: абсурдные комбинации абсурдных комбинаций. Очень просто увлечься и попытаться комбинировать различные хэш-функции в надежде получить более точный результат.

Хотя в практической деятельности от них мало толку. Они лишь вызывают проблемы с совместимостью хэш-кодов, а иногда даже их деградацию. Никогда не создавайте свой собственный алгоритм шифрования; всегда придерживайтесь стандартов, установленных профессионалами.

Существует вероятность того, что использование нескольких хэш-функций замедлит вычисления и расшифровку. Однако этот метод может стать менее практичным, поскольку он делает взлом намного медленнее – на это уходят часы!

Вот несколько примеров странных хэш-функций, которые я встречал на форумах в Интернете.

Каждый пароль хэшируется абсолютно одинаково, что является единственной причиной эффективности радужных таблиц и вечных поисковых строк. Пароли двух пользователей, имеющих одинаковые пароли, будут совпадать.

Включив случайный элемент в каждый хэш-код, мы можем остановить атаки.

Добавляя случайное число в начало или конец паролей, мы можем внести элемент случайности в хэш-коды. Как видно из приведенного выше примера, это приводит к тому, что из одного и того же хэш-кода пароля каждый раз генерируются совершенно разные строки.

Для проверки правильности пароля требуется больше соли. Обычно она сохраняется как часть самой строки или вместе с хэш-кодом.

Нет необходимости держать соль в секрете. Просто таблицы обратного поиска и радуга теряют свою полезность при использовании случайного значения. Нападающий не знает, какой будет соль. Единственная информация, которую он имеет о ней заранее, получена из карты радуги или таблицы поиска.

Атака с использованием обратной таблицы поиска становится бесполезной, если каждый пользователь хранит пароли в своей соли.

Наиболее частые ошибки, допускаемые при использовании соли, будут рассмотрены более подробно в следующем разделе.

Короткая соль и повторное использование соли – неверные.

В этом разделе рассматривается еще одно широко распространенное заблуждение о хешировании паролей: нелепые комбинации байтовых алгоритмов. Очень просто увлечься и попытаться комбинировать различные хэш-функции в надежде получить более точный результат.

Теоретически это не очень полезно. Такие действия приводят лишь к проблемам совместимости кода. Никогда не пытайтесь разработать свой собственный алгоритм шифрования; всегда следуйте рекомендациям, изложенным профессионалами.

Существует вероятность того, что использование нескольких хэш-функций замедлит вычисления и, соответственно, расшифровку. Однако можно еще больше ускорить этот переход, обрабатывая данные в нескольких хранилищах или взломав две разные системы.

Похожее:  Система "Город" - система приема платежей от населения, Челябинск, Челябинская область

Вот несколько причудливых хэш-функций, с которыми я сталкивался на форумах в Интернете:

  • md5(sha1(пароль))
  • md5(md5(соль) md5(пароль))
  • sha1(sha1(пароль))
  • sha1(str_rot13(пароль соль))
  • md5(sha1(md5(md5(пароль) sha1(пароль)) md5(пароль)))
  • Не используйте ни одну из них.

Имейте в виду, что весь этот раздел неверен. Согласно многочисленным письмам, которые я получал, хэш-функции – это хорошая вещь. В идеале атакующий не должен знать об используемом хэш-файле.

Из-за сложной хэш-функции атакующий не может быть заранее вычисленной радужной таблицей, и вычисления занимают больше времени.

Когда злоумышленник знает алгоритм, он не может атаковать хеш-код.

Сложные вычисления хэш-функции занимают больше времени, но время вычислений постоянно. Если распараллеливание крайне затруднительно, предпочтительнее использовать итерационный алгоритм (такие методы рассматриваются ниже). Проблемы с радужной таблицей также решаются путем настройки хэш-кода и добавления в него соли.

Нет никаких проблем, если вы хотите использовать стандартную “сумасбродную” хэш-функцию, например HMAC или HMAC. Однако если вычисление хэш-кода занимает больше времени, чем ожидалось, прочитайте раздел ниже о растягивании ключей.

Сравните эти незначительные преимущества с опасностью случайного внедрения совершенно ненадежной хэш-функции и проблемами совместимости, возникающими при использовании сложных алгоритмов. Для решения элементарных задач лучше использовать проверенные, стандартизированные алгоритмы.

Такие входные данные необходимы для хэш-функций, которые преобразуют произвольные объемы данных в строки фиксированной длины. Такое столкновение невозможно обнаружить из-за способа создания криптографических хэш-функций. Криптологи время от времени замечают “атаки” на хэш-функции, которые упрощают поиск коллизий.

Недавней иллюстрацией является хэш-функция MD5, для которой действительно были обнаружены столкновения.

Атаки коллизий показывают, что существует вероятность того, что строка, содержащая пароль пользователя, будет иметь точно такой же хэш-код. Хотя маловероятно, что такие коллизии “случайно” возникнут на практике, наличие коллизий в MD5 требует большой вычислительной мощности.

Для всех практических целей пароль, который был хэширован с помощью MD5 и соли, так же безопасен, как и тот, который был записан с помощью SHA256 или соли. По возможности используйте более безопасные алгоритмы хэширования, такие как SHA256 или RipeMD.

Как правильно делать хеширование

В этом разделе объясняется процесс шифрования паролей. Основы жизненного опыта рассматриваются во втором подразделе. В последующих подразделах основные принципы хэш-кодов расширяются и становятся более устойчивыми к взлому.

Фундаментальный: сет

Мы видели, как хитрые хакеры могут использовать радужные диаграммы и таблицы поиска для быстрой расшифровки основных хэш-кодов. Мы выяснили, что решение этой проблемы заключается в использовании соли для внесения случайного компонента. Но откуда взять соль и что для этого нужно?

Для создания соли используется криптографически защищенный генератор псевдослучайных чисел (CSPRNG). Эти генераторы очень сильно отличаются от стандартных. Например, функция C rand() имеет уникальные характеристики и отличается только использованием dancer ().

Криптографически стойкие генераторы предназначены для того, чтобы быть стойкими в том смысле, что они обеспечивают высокий уровень случайности и полностью непредсказуемы, как следует из их названия.

Наша соль не должна иметь никаких предсказуемых свойств.

Некоторые генераторы, доступные для популярных платформ программирования, приведены в таблице ниже:

Пароли и соли должны быть уникальными для каждого пользователя. Пароль должен хэшироваться свежей случайной солью каждый раз, когда пользователь меняет его или меняет свой пароль. Никогда не используйте соль повторно.

Существует множество вариаций, и соль также должна быть длинной. Длина соли может быть скорректирована на основе жизненного опыта. И хэш-код, и соль должны храниться в таблице учетных записей пользователей.

Сохраните пароль:

  1. Сгенерировать длинную случайную соль с помощью криптографически стабильного генератора псевдослучайных чисел;
  2. Присоединить соль к паролю и вычислить хэш с помощью стандартной криптографической хэш-функции, например SHA256;
  3. Сохранить соль и хэш в записи базы данных пользователя.

Проверка пароля:

  1. Извлечь соль и хэш-код пользователя из базы данных;
  2. Добавить соль к введенному паролю и вычислить хэш-код с помощью той же функции;
  3. Сравнить хэш-код введенного пароля с хэш-кодом базы данных. Если они идентичны, то пароль верен. Если это не так, то пароль неверен.

Внизу страницы вы можете найти решения для хеширования паролей на языках PHP, CS и Java.

Вам может быть интересно, где выполняется операция вычисления хэш-кода, если вы создаете веб-приложение. Как следует отправлять пароль на сервер, если он был хэширован в браузере пользователя с помощью JavaScript?

Если JavaScript можно использовать для просмотра хэш-кода пароля пользователя.

Представьте себе веб-сайт, который вычисляет хэш-код паролей в браузерах пользователей, не отправляя информацию на сервер. Веб-сайт получает хэш-код из браузера и проверяет, совпадает ли он с кодом в базе данных, чтобы аутентифицировать пользователя. Это может показаться безопасным, но это не так.

Проблема заключается в том, что пароль пользователя заменяется хэш-кодом на стороне клиента. Для аутентификации пользователю достаточно предоставить серверу хэш-код своего пароля. Злоумышленник может использовать хэш-код пользователя для входа на сервер без пароля пользователя, если ему удастся его получить.

Это означает, что если хакер получит доступ к базе данных хэш-кодов этого сайта, не угадав ни одного пароля, то его действия будут успешными.

Это не означает, что вычисление хэш-кода внутри браузера или на сервере запрещено.

Хорошей идеей является хэширование пароля в браузере. Но имейте в виду, что HTTPS (SSL/TRS) нельзя заменить хэшированием на стороне клиента.

Третья сторона может изменить код JavaScript во время загрузки, чтобы удалить функцию хеширования, если соединение между браузером и серверами ненадежное.

  • Некоторые веб-браузеры не поддерживают JavaScript, а некоторые пользователи отключают JavaScript в своем браузере. Поэтому для максимальной совместимости ваше приложение должно определить, поддерживает ли браузер пользователя JavaScript, и, если нет, эмулировать хэш на стороне клиента на сервере;
  • Вы также должны “солить” хэш-коды на стороне клиента. Предлагаемое решение заключается в написании сценария на стороне клиента, который запрашивает у сервера соль пользователя. Поскольку вы выполняете хэширование и используете соль (хорошую соль) на стороне сервера, вы можете использовать имя пользователя (или адрес электронной почты), скомбинированное со специфической для сайта строкой (например, именем домена) в качестве соли на стороне клиента.

Соль гарантирует невозможность целенаправленных атак.

Эти атаки хорошо работают с видеокартами, которые могут вычислять миллиарды хэш-кодов в секунду. Мы можем применить технику растягивания ключа, чтобы сделать их менее эффективными.

Основная цель – сделать хэш-функцию настолько медленной, чтобы атаки по словарю были слишком медленными, чтобы быть полезными даже при использовании быстрой видеокарты и специализированного оборудования. Хеш-функция должна быть медленной, чтобы сдерживать атаки, и в то же время быстрой для пользователя.

Использование уникальной хэш-функции, которая потребляет много процессорной мощности, – это растягивание ключа. Постарайтесь не создавать свою собственную, поскольку итеративное хэширование не поможет вам в этом.

Используйте общий алгоритм, например PBKDF2 или bcrypt. В языке программирования PHP используется алгоритм PBKDF2.

В этих алгоритмах используется счетчик итераций или коэффициент надежности. От этого значения зависит скорость работы хэш-функции.

Чаще всего лучшим способом выбора этого параметра является быстрый тест на устройстве для определения значения, при котором хэш-код вычисляется за минуту. Чтобы не повлиять на работу пользователя, ваша программа должна быть максимально надежной.

Для обработки огромного объема запросов на аутентификацию вам потребуется больше вычислительной мощности, если вы используете хэширование с растягиванием ключей в веб-приложении.

Хотя я по-прежнему советую растягивать ключ, используйте низкое значение числа итераций. Определите количество итераций проверки подлинности, исходя из имеющейся у вас вычислительной мощности (или предполагаемой частоты запросов).

Заставляя пользователей вводить капчу при каждом входе в систему, вы устраните угрозу отказа в обслуживании. Количество итераций может быть увеличено или уменьшено в будущем, если вы захотите.

Проверьте реализацию алгоритмов растягивания ключей для пользовательского браузера, если вы хотите использовать растягивание ключей в веб-приложении, но все еще сомневаетесь, стоит ли это делать (в том числе с помощью JavaScript). PBKDF2 является частью криптобиблиотеки Stanford JavaScript Crypto Library.

Чтобы систему можно было использовать с более медленными клиентами, количество итераций должно быть небольшим. В случае, если браузер пользователя не поддерживает JavaScript, система может отправлять вычисления на сервер.

Хеширование все равно необходимо, даже если клиентская сторона растягивает ключ. Сгенерированный клиентом пароль должен быть хэширован так же, как если бы вы уже знали пароль по умолчанию.

Атака по словарю может быть использована для пароля до тех пор, пока атакующий имеет доступ к хэш-коду, чтобы определить, является ли заявленный пароль точным или нет. Теперь к хэш-коду необходимо подобрать секретный ключ.

Хеш-код может быть использован для проверки пароля только тем, у кого есть ключ. Это можно сделать двумя способами. Или хэш-код может быть зашифрован с помощью секретного ключа или шифра типа AES.

Как бы просто это ни казалось, это не так. Даже если система взломана, ключ необходимо держать в секрете от злоумышленников. Ключ все равно может быть взломан, если злоумышленник не имеет доступа к системе в целом.

Ключ должен храниться в другой системе, например, на сервере проверки пароля или в другом устройстве с датчиками.

Для любой крупномасштабной службы (более 100 000) я настоятельно рекомендую использовать этот метод. Он необходим для любого сервиса с более чем 1 000 000 учетных записей пользователей.

Похожее:  Особенности входа на сайты при помощи WebMoney Keeper WinPro - WebMoney Wiki

Вы можете воспользоваться преимуществами моделирования на обычном веб-сервере, даже если у вас нет специального оборудования или выделенных серверов.

Отключая возможность доступа ко всей файловой системе вашего сервера или его сети, SL injection – который защищает злоумышленников от доступа к локальной файловой системе – предотвращает большинство взломов баз данных.

Эти хэш-коды не будут уязвимы даже в случае взлома вашей базы данных обычными SL-атаками, если вы сгенерируете случайный ключ и сохраните его в недоступном из Интернета файле или заключите его в соленые хэш-коды (слева) от них.

При установке приложения генерируйте ключ случайным образом, а не записывайте его в исходный код. Это не так надежно, как создание хэш-кода пароля с помощью другой системы. Это предпочтительнее, чем ничего.

Обратите внимание, что использование соли по-прежнему необходимо, несмотря на симуляцию. Злоумышленники в конечном итоге найдут способ получить ключи, поэтому необходимо солить и растягивать ключи для дополнительной защиты хэш-кодов.

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

Даже опытные разработчики должны понимать основы безопасности, чтобы создавать безопасные приложения. Уникальным ресурсом для изучения уязвимостей веб-приложений является проект Open Web Application Project (OWASP). Список десяти лучших уязвимостей от OWASP.

Если вы не решили проблемы из этого списка, не создавайте веб-приложение для хранения конфиденциальных данных. Все разработчики должны пройти достаточное обучение по безопасной разработке приложений, и это обязанность работодателя.

Сторонний “тест на проникновение” в приложение – разумная идея. Даже лучшие программисты допускают ошибки, поэтому пригласить эксперта по безопасности – хорошая идея.

Найдите надежного человека, который сможет регулярно проверять ваш код. Безопасность проекта должна быть проверена до начала дальнейшей работы.

Очень важно следить за своим сайтом на предмет нарушений безопасности. Я советую нанять отдельного человека, в чьи обязанности будет входить поиск и реагирование на нарушения безопасности.

Если будет обнаружено нарушение, хакер может использовать ваш сайт для заражения компьютеров посетителей вредоносными программами.

Прикрепить:

  • Исходный код на PHP, Java, C# или Ruby, приведенный в конце статьи;
  • Портативный PHP фреймворк для хэширования паролей OpenWall;
  • Любой современный и проверенный криптографический алгоритм хэширования, такой как SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3 и т.д. и т.п.
  • Проверенные алгоритмы растяжения ключа, такие как PBKDF2, bcrypt и scrypt;
  • Безопасные версии функции шифрования ($2y$, $5$, $6$).

Альтернативные методы использовать нельзя

  • Устаревшие хэш-функции, такие как MD5 или SHA1
  • Незащищенные версии криптографических функций ($1$, $2$, $2a$, $2x$, $3$)
  • Самостоятельно разработанные алгоритмы. Используйте только ту технологию, которая находится в открытом доступе и была тщательно протестирована опытными криптографами.

Несмотря на то, что MD5 и SHA1 не имеют криптографических недостатков, расшифровать их хэш-значения и сохранить пароли очень просто.

Я не советую их использовать. PBKDF2, использующий в своей реализации алгоритм SHA1, является исключением из этого правила.

Как сделать пароли пользователей сбрасываемыми, если они их забыли

На мой взгляд, в Интернете нет надежного способа сбросить пароль. Не позволяйте пользователям сбрасывать свои пароли, если ваша система имеет строгие требования к безопасности, например, требования к службе шифрования или системе предотвращения утечки паролей.

Для аутентификации пользователей, забывших свои пароли, многие веб-сайты используют цикл электронной почты. Для этого создайте случайный одноразовый токен, связанный с вашей учетной записью. Включите ссылку на него в письмо о сбросе пароля, которое получает пользователь.

Дайте пользователю новый пароль после того, как он перейдет по ссылке для сброса пароля, содержащей действительный маркер. Убедитесь, что их адрес электронной почты не связан с маркером.

Срок действия маркера должен истечь через 15 минут или после использования, в зависимости от того, что произойдет раньше.

Также выгодно, если пользователь запрашивает новый токен сброса или вводит пароль (указывая, что он помнит пароли). Токен можно использовать столько раз, сколько необходимо для доступа к учетным записям, если он не имеет срока действия.

Хотя S MTP является простым протоколом, в Интернете могут присутствовать вредоносные маршрутизаторы. После смены пароля почтовый аккаунт пользователя (в котором находится ссылка на сброс) может некоторое время находиться в опасности.

Сделав продолжительность маркера максимально возможной (например, 15 минут), вы снизите вероятность такого рода нападений.

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

Никогда не отправляйте пользователю новый пароль по электронной почте. Когда пользователи меняют свои пароли, используйте свежую случайную соль. Используйте новый пароль вместо хэширующей соли, которая использовалась ранее.

Ваша обязанность – выяснить, как была взломана система, и разобраться с восприимчивостью злоумышленников к взлому. Я настоятельно советую вам обратиться за помощью в стороннюю компанию по безопасности, если у вас нет опыта работы с нарушениями информационной безопасности.

Надейтесь, что никто не заметит, как вы закрываете брешь в системе безопасности. Однако, подвергая их дальнейшему риску, скрывая информацию о себе от пользователей, вы только портите свою репутацию.

Даже если вы все еще не уверены в обстоятельствах, сообщите о проблемах как можно скорее. Разошлите уведомление всем пользователям электронной почты и разместите сообщение со ссылкой на страницу с дополнительной информацией на главной странице вашего сайта.

Дайте пользователям краткое объяснение того, как защищены их пароли (надеюсь), а также того, как злоумышленник может использовать против них словарную атаку или полный перебор.

Любой пароль может быть использован злоумышленниками для доступа к учетной записи пользователя на другом сайте. Сообщите своим пользователям, что использование одного и того же пароля на нескольких веб-сайтах и сервисах подвергает их риску кражи личных данных.

Убедитесь, что в следующий раз они изменят свои служебные пароли. Чтобы избежать требуемой смены, большинство пользователей захотят “изменить” свой первоначальный пароль. Используйте хэш-код текущего пароля, чтобы убедиться, что они никогда не смогут сделать это снова, если вы не сможете вспомнить пароль.

Само собой разумеется, что злоумышленник может быстро взломать множество слабых паролей, даже при медленном хэшировании. Чтобы ограничить возможности злоумышленников использовать эти пароли, следует добавить для аутентификации в дополнение к текущему паролю еще и электронный адрес, пока пользователь не сменит логин.

Как сделать так, чтобы пользователи, забывшие пароль, могли это сделать?

Сообщите своим пользователям, какие личные данные хранятся на сайте. Если у вас есть доступ к номеру кредитной карты, вы должны посоветовать своим пользователям внимательно следить за своими последними и предстоящими транзакциями.

Не ограничивайте пользователей, если у вас нет строгих требований к безопасности. Следует поощрять пользователей отображать информацию о надежности пароля по мере его ввода.

Если вам нужна дополнительная защита, сделайте свой пароль длиной не менее 12 символов и убедитесь, что он содержит две буквы или цифры.

Усталость пользователей и плохой подбор паролей могут быть результатом принуждения пользователей менять свои пароли чаще, чем раз в шесть месяцев.

Вместо этого посоветуйте пользователям никогда и никому не сообщать свои пароли и менять их при каждом подозрении на взлом. Поощряйте сотрудников использовать рабочее время, чтобы помнить свои пароли, когда речь идет о бизнес-решениях. Обучайте сотрудников использовать рабочее время для изучения новых технологий для создания безопасных журналов сотрудников, начиная с настройки систем электронной почты и заканчивая установкой систем безопасности (ISP).

Все файлы сервера доступны любому, кто имеет доступ к вашей базе данных. Хеширование паролей используется для восстановления паролей после вторжения, а не для защиты сайта от взлома.

Используя двух пользователей для подключения к базе данных, вы можете предотвратить изменение хэш-кодов во время атаки SL injection. Второй – для кодов входа в систему, а второй – для кода “создать учетную запись”. В то время как код “login” должен иметь возможность только смотреть, код “create account” должен иметь возможность читать и писать в таблицу пользователей.

Структура Меркла-Дамгарда – это защитный механизм, используемый хэш-функциями MD5 и SHA2 против так называемых атак дополненной длины. В результате любая строка строк в записи может иметь значение H(pad X), которое может определить злоумышленник.

В этом сценарии злоумышленник может расшифровать дополнение H(ключевое сообщение) (повторное или многократное).

Ключ использовался для того, чтобы злоумышленники не смогли изменить сообщение и подставить другой действительный HASH, если хэш-код использовался в качестве кода аутентификации сообщения. Благодаря комбинации у преступников появился сильный аргумент, поэтому данная система потерпела неудачу (добавление сообщения).

Непонятно, как подобная атака может быть использована злоумышленниками для ускорения взлома паролей. Однако из-за возможности такой атаки не рекомендуется использовать простые хэш-функции.

Однажды хитрый криптограф может придумать хитрый способ использовать эти атаки для более быстрого получения доступа.

Чтобы обеспечить совместимость, выберите что-то одно и придерживайтесь этого. Соль обычно помещается перед паролем.

Похожее:  Авторизация на сессиях своими руками. Делаем логин в админке | Webdevkin

Зачем сравнивать одни и те же коды для “постоянной длины” времени, используя алгоритм хэширования, описанный в этой статье (length-constant)?

Злоумышленник не сможет расшифровать пароль в течение времени “неизменной длины”.

Общепринятый метод определения идентичности двух битовых последовательностей (т.е. Самый простой способ определить идентичность двух строк (или двух пар строк) – сравнить первый и второй или третий байт в одной строке, сравнивая первые два – пятый с шестым; четвертый с восьмым: как только вы обнаружите несовпадение битов, станет очевидно, что строки разные! После того, как это было обнаружено ранее с помощью Yandex code checker, можно сразу же вернуть отрицательный результат на исходный уровень для второй попытки проверки второй строки без потери данных из памяти компьютера.

Строки одинаковы, если сравнение было выполнено для обеих строк и не было обнаружено битовых ошибок. В зависимости от того, насколько точно они совпадают, это может занять разное время.

Стандартный алгоритм сравнения строк “xyzabc” и “axyz” показывает, что средний человек не заметит разницы в первых нескольких символах. С другой стороны, алгоритм сравнения рассматривает последовательность символов в строке “a”, когда сравнивает ее со строкой “b”.

Допустим, хакер пытается получить доступ к системе в Интернете, которая допускает только одну попытку аутентификации в секунду. Помимо собственно ключевого слова, атакующему также известны все параметры хэш-кода пароля (соль и тип функции).

Злоумышленник может использовать атаку по времени для извлечения части хэш-кодов и последующего их взлома в автономном режиме без ограничений системного программного обеспечения, если он сможет точно измерить, сколько времени требуется онлайн-системе для сравнения хэш-кода реального пароля с кодом пароля, предоставленного преступником или его источником в системе безопасности (например, локальным паролем). Это позволит избежать многих проблем при использовании вредоносного программного обеспечения на компьютере удаленного пользователя, а также минимизировать риск быть пойманным.

Все возможные битовые коды перечислены в первой строке. Каждая строка отправляется в онлайн-систему, и регистрируется время, необходимое для получения ответа.

Строка, содержащая первый бит хэш-кода по умолчанию, обрабатывается дольше всего. Как только злоумышленник узнает первый фрагмент, он может повторить атаку на следующую жертву.

Овладев хэш-кодом, злоумышленник может использовать свое оборудование для компрометации системы.

Атаки не могут быть осуществлены через сеть. Однако они были выполнены и продемонстрированы в реальной жизни. Благодаря этому код в данной статье сравнивает строки быстро и одновременно.

Здесь объясняется, зачем нужна функция SlowEquals (см. далее):

Вместо “==” для определения равенства двух целых чисел используется эксклюзивный оператор “ИЛИ”. если ниже, то почему

Если и только если два целых числа одинаковы, то операция исключающего ИЛИ над ними даст результат, равный нулю.

Значение переменной diff будет равно нулю или лучше нуля, если переменная a.length равна b; в противном случае оно будет противоположно нулю. Далее мы сравниваем биты с помощью исключающего ИЛИ, а затем выполняем побитовое И над результатом предыдущей операции.

В результате, если битов нет, переменная diff будет отлична от нуля. Переменная diff будет равна нулю в конце цикла только в том случае, если она была равна нулю до начала циклов сравнения a.length и b, поскольку побитовое ИЛИ никогда не обнуляет биты.

Оператор OR обычно используется для сравнения целых чисел. Поскольку он всегда переводится/считывается как решетка, мы должны использовать исключающее “И”.

Например, на C код “diff &= a == b” может скомпилироваться в следующие ассемблерные инструкции x86:

Благодаря ветвлению код выполняется с различной скоростью в зависимости от внутреннего состояния предиктора и равенства чисел.

Си-код “diff” подвергнется дополнительной перекодировке перед передачей в следующий код ассемблера.

Пароли вводятся пользователями на вашем сайте. Если ваша база данных взломана, а пароли ваших пользователей не защищены (большинство людей используют одинаковые пароли), они доверяют свою безопасность вам.

Ваши пользователи в безопасности, но и вы в опасности. Вы отвечаете за обеспечение их безопасности.

Примеры кода:

Образец кода на PHP
Образец кода на Java
Образец кода на ASP.NET (C#)
Образец кода на Ruby (on Rails)

Cryptographic hash functions are practically irreversible

Используя математические операции, которые крайне сложно и трудоемко отменить, например, оператор modulo, хэш-функции ведут себя как односторонние функции.

Остаток от деления определяется оператором modulo. Например, 5 mod 3 равно 2, потому что целочисленное деление дает 2 как остаток от 5/3.

Поскольку один и тот же вход всегда дает один и тот же результат, эта операция является детерминированной: математически, 5/3 всегда равно 2.

Знание того, что x, деленное на y, напоминает 2, но не более того, ничего не говорит нам о x и y, только то, что результат операции модуляции равен 2.

Чтобы x mod y возвращало 2, вместо x и y можно использовать бесконечное множество значений:

7 mod 5=29 mod 7=22 mod 3=210 mod 8=2...

Password_hash()

Errors:

Функция возвращает false, если возникают какие-либо ошибки.

Normal Operation:
With BCrypt, the output of crypt() is checked for error states (output < 13 characters). If there was an error in hashing, false is returned (this shouldn’t happen due to the verification of the parameters, but it’s there in case something fails). Otherwise, the output of crypt() is returned directly.

Важно помнить, что вывод crypt() (и, соответственно, password_hash()) содержит все данные, необходимые для последующей проверки хэша. Поэтому старые хэшированные пароли будут продолжать работать и правильно проверяться, даже если алгоритм хэширования по умолчанию изменится или пользователь изменит свой алгоритм.

Если мы рассмотрим формат вывода хэша:

basic_usage.php
<?phpvar_dump(password_hash("rasmuslerdorf", PASSWORD_BCRYPT,array("cost"=>7,"salt"=>"usesomesillystringfor")));// string(60) "$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"?>

Обратите внимание, что указан алгоритм для использования ($2y$); в данном случае bcrypt. 07$ представляет собой предоставленный параметр стоимости. Предложенная соль – это некая глупая строка. Сгенерированный хэш – последний компонент, это e2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi.

Чтобы проверить хэш, crypt() или password_verify() понадобится только эта конечная хэш-строка. Поскольку соль является частью сгенерированного хэша, нет необходимости хранить ее отдельно. Кроме того, поскольку алгоритм также хранится в сгенерированном хэше, нет необходимости хранить его отдельно.

Password_needs_rehash()

Errors:

On error, it will return NULL

Нормальная деятельность:

Алгоритм и заданные параметры сравниваются с предоставленным параметром хэша. По сути, это обертка вокруг функции password_get_info() для проверки того, что предоставленный хэш соответствует заданным параметрам конфигурации. Это можно использовать для решения вопроса о том, нужно ли переделывать хэш после изменения опций (например, повышения стоимости bcrypt, переключения алгоритмов и т.д.).

basic_usage.php
<?php$password="rasmuslerdorf";$hash= password_hash($password, PASSWORD_BCRYPT,array("cost"=>7,"salt"=>"usesomesillystringfor")));if(password_verify($password,$hash)){if(password_needs_rehash($hash, PASSWORD_BCRYPT,array('cost'=>8))){
        update_password_in_db($password);}
    log_user_in();}else{
    error_wrong_password();}?>

В стране пользователей это может быть реализовано на практике следующим образом

user_needs_rehash.php
<?phpfunction password_needs_rehash($hash,$algo,array$options=array()){$info= password_get_info($hash);$return=$algo!=$info['algo'];// Skip salt parameter if supplied to options$return|=array()!=array_diff_assoc($info['options'],$options);return$return;}?>

Как использовать функции password_hash и password_verify в php (php: hypertext preprocessor :: статья: 492)

Безопасность пользователей в Интернете также имеет решающее значение.

Выгода

Одним из пунктов защиты пользователя является его пароль; чем больше хэш-строк в строковых данных, тем сложнее взломать пароль.

Когда то для хеширования пароля достаточно было функции “md5”, но сегодня этого мало: https://secure.php.n … swords.fasthash:

PHP.NET рекомендует для хеширования пароля использовать функцию password_hash, а для проверки пароля функцию password_verify.

Проблема в том, что некоторые люди не знают, как их использовать. Я попытаюсь объяснить это сейчас.

Описания функций можно прочитать на официальном сайте PHP:

password_hash: http://php.net/manua … ssword-hash.php.

password_verify: http://php.net/manua … word-verify.php.

И так, при регистрации или смене пароля, сценарий с формы принимает пароль в таком виде, как его ввел пользователь, этот пароль обрабатываем функцией password_hash:

Теперь переменная

$hash

– это пароль, который был кэширован; мы храним его в базе данных. Пароль должен быть проверен перед авторизацией пользователя. Если это так, то пользователь соглашается использовать свой пароль, а если он не соответствует тому, что хранится в базе данных, то выдается ошибка. Здесь используется простое сравнение строк, например:

Поскольку функция контроля отсутствует, она не подходит.

password_hash

Каждый раз возвращает одну и ту же строку (хэш) обрабатывая один пароль:

При сравнении простой строки пароль неизменно оказывается неверным.

Проверять хэш пароля, что был создан функцией password_hash, следует функцией password_verify. Так же сценарий при авторизации пользователя принимает пароль в том виде, что вводил пользователь и в таком же виде вставляем его в функцию password_verify первым параметром. Второй параметр должен быть хешированный пароль, что сохранен в БД:

Вот и все.

В PHP 7.2 появился новый тип хеширования: “argon2”. Чтобы хэшировать пароль этим типом, указывайте вторым параметром в функции password_hash константу PASSWORD_ARGON2I:

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector