No Image

Что такое хеш пароля

СОДЕРЖАНИЕ
0 просмотров
22 января 2020

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

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

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

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

Почему популярные хеширующие функции, такие как md5() и sha1() не подходят для паролей?

Такие хеширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом "грубой силы" для определения оригинальных вводимых данных.

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

Если популярные хеширующие функции не подходят, как же я тогда должен хешировать свои пароли?

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

PHP 5.5 предоставляет встроенное API хеширования паролей, которое безопасно работает и с хешированием и с проверкой паролей. Также есть » библиотека PHP для совместимости, доступная с PHP 5.3.7.

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

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

Учтите, что, если вы используете функцию crypt() для проверки пароля, то вам нужно предостеречь себя от атак по времени, применяя сравнение строк, которое занимает постоянное время. Ни операторы PHP == и ===, ни функция strcmp() не являются таковыми. Функция же password_verify() как раз делает то, что нужно. Настоятельно рекомендуется использовать встроенное API хеширования паролей, если есть такая возможность.

Что такое соль?

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

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

password_hash() создает случайную соль в случае, если она не была передана, и чаще всего это наилучший и безопасный выбор.

Как я должен хранить свою соль?

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

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

Здравствуйте уважаемый посетитель!

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

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

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

Читайте также:  Старый телевизор тошиба настройка каналов

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

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

  • Зачем нужно хешировать пароли
  • Вскрываем пароль при слабо защищенном хеше
  • Защищаемся от ‘грубой силы’ замедляя хеш-функцию
  • Усложняем хеш добавляя ‘соль’
  • Исходные файлы сайта

Зачем нужно хешировать пароли

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

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

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

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

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

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

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

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

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

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

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

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

Вскрываем пароль при слабо защищенном хеше

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

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

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

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

Читайте также:  Чем отличается плазменный телевизор от жидкокристаллического

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

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

Итак, приступим. В PHP для вычисления MD5-хэша обычно используют встроенную функцию "md5()", обязательным параметром которой является строковая переменная, соответствующая исходной комбинации.

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

//Получение MD5-хеша с помощью функции md5()

$hash = md5 ($password);

echo nl2br ( ‘MD5: пароль — ‘ .$password. ‘, хеш — ‘ .$hash. "
" );

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

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

Что такое хеш?

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

Как работает хеш?

Например, мое имя — Brian — после преобразования хеш-функцией SHA-1 (одной из самых распространенных наряду с MD5 и SHA-2) при помощи онлайн-генератора будет выглядеть так: 75c450c3f963befb912ee79f0b63e563652780f0. Как вам скажет, наверное, любой другой Брайан, данное имя нередко пишут с ошибкой, что в итоге превращает его в слово brain (мозг). Это настолько частая опечатка, что однажды я даже получил настоящие водительские права, на которых вместо моего имени красовалось Brain Donohue. Впрочем, это уже другая история. Так вот, если снова воспользоваться алгоритмом SHA-1, то слово Brain трансформируется в строку 97fb724268c2de1e6432d3816239463a6aaf8450. Как видите, результаты значительно отличаются друг от друга, даже несмотря на то, что разница между моим именем и названием органа центральной нервной системы заключается лишь в последовательности написания двух гласных. Более того, если я преобразую тем же алгоритмом собственное имя, но написанное уже со строчной буквы, то результат все равно не будет иметь ничего общего с двумя предыдущими: 760e7dab2836853c63805033e514668301fa9c47.

Впрочем, кое-что общее у них все же есть: каждая строка имеет длину ровно 40 символов. Казалось бы, ничего удивительного, ведь все введенные мною слова также имели одинаковую длину — 5 букв. Однако если вы захешируете весь предыдущий абзац целиком, то все равно получите последовательность, состоящую ровно из 40 символов: c5e7346089419bb4ab47aaa61ef3755d122826e2. То есть 1128 символов, включая пробелы, были ужаты до строки той же длины, что и пятибуквенное слово. То же самое произойдет даже с полным собранием сочинений Уильяма Шекспира: на выходе вы получите строку из 40 букв и цифр. При всем этом не может существовать двух разных массивов данных, которые преобразовывались бы в одинаковый хеш.

Вот как это выглядит, если изобразить все вышесказанное в виде схемы:

Читайте также:  Цветной картридж где какой цвет

Для чего используется хеш?

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

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

Вы даже можете провести простой эксперимент: попробуйте при помощи специального сайта произвести преобразование какого-нибудь простого пароля вроде «123456» или «password» из их хеш-значений (созданных алгоритмом MD5) обратно в текст. Вероятность того, что в базе хешей найдутся данные о введенных вами простых паролях, очень высока. В моем случае хеши слов «brain» (8b373710bcf876edd91f281e50ed58ab) и «Brian» (4d236810821e8e83a025f2a83ea31820) успешно распознались, а вот хеш предыдущего абзаца — нет. Отличный пример, как раз для тех, кто все еще использует простые пароли.

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

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

Где еще можно использовать хеш-функции помимо систем хранения паролей и защиты медиафайлов? На самом деле задач, где используется хеширование, гораздо больше, чем я знаю и тем более могу описать в одной статье. Однако есть одна особенная область применения хешей, особо близкая нам как сотрудникам «Лаборатории Касперского»: хеширование широко используется для детектирования зловредных программ защитным ПО, в том числе и тем, что выпускается нашей компанией.

Как при помощи хеша ловить вирусы?

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

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

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

Комментировать
0 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
Adblock detector