Определения типов хэшей при помощи скрипта hash-Identifier для расшифровки паролей
Когда вы имеете дело с неизвестным хэшем, первый шаг – корректная идентификация типа.
Определения типов хэшей при помощи скрипта hash-Identifier для расшифровки паролей
Автор: Kody
Хэши обычно используются для хранения конфиденциальной информации, как, например, учетных записей, которые не должны находиться в открытом виде. При помощи утилит наподобие Hashcat мы можем взломать эти хэши однако только в случае, если знаем алгоритм генерации. Используя инструменты навроде скрипта hash-identifier, можно легко определить тип любых хэшей, чтобы затем указать правильный режим при работе с Hashcat.
Помимо взлома хэшей hash-identifier также полезен для идентификации алгоритма, используемого при выдаче контрольной суммы для загрузки файлов. Кроме того, этот скрипт помогает определить, к какому приложению относится хэшированный файл или значение (например, SQL базе или какому-либо другому формату, специфичному для конкретного поставщика).
Что такое хэш и как расшифровать пароль?
Как было сказано ранее, пароли, извлекаемые из базы данных или компьютера, обычно хранятся в виде хэшей, а не в открытом виде. Функция хэширования преобразует пароли в хаотичный набор символов и чисел, которые не должны быть обратимы обратно в пароль.
Однако два или более одинаковых пароля, при использовании одной и той же функции, будут иметь один и тот же хэш. Соответственно, при помощи этой функции можно получить набор хэшей для списка паролей, а затем использовать этот перечень для обнаружения подходящего пароля. Подобным образом работает множество утилит для взлома.
Хотя хранение пароля в виде хэша лучше, чем в открытом виде, вероятность взлома все равно остается, если у злоумышленника хороший набор правил или словарь, которые можно использовать в Hashcat или другой подобной программе.
Если вы много работаете с хэшами, то легко увидите разницу между разными и часто используемыми типами.
Например, сможете ли вы на глаз определить, к какому типу относятся хэши, указанные ниже?
Хотя вы могли видеть и тот и другой хэш ранее, ответ на вопрос, какой хэш — MD5, а какой — SHA1, не столь очевиден. Еще большая путаница может возникнуть со схожими типами хэшей, относящиеся к разным режимам в Hashcat. В случае с хэшами, приведенными выше, этот факт имеет чрезвычайно важное значение.
При использовании Hashcat для взлома этого хэша мы должны установить опцию –m с целью работы в нужном режиме. Для взлома хэша MD5 мы бы указали режим 0.
В итоге, установив нужный алгоритм и используя хороший словарь, после расшифровки хэша мы получили слово «hashcat».
Какие хэши поддерживаются?
На данный момент Hashcat в состоянии расшифровать большое количество хэшей. В репозитории на GitHub для утилиты hash-identifier список поддерживаемых хэшей очень внушителен:
Что понадобится
Для начала нужно установить Python3 на вашем компьютере (есть версии для разных платформ). Кроме того, вам понадобится утилита Hashcat, которую можно загрузить, используя команду apt install hashcat, после обновления системы при помощи команд apt update и apt upgrade.
Если вы хотите сгенерировать ваши собственные хэши для тестового взлома, то можете воспользоваться командой в формате echo —n PLAINTEXT | (HASHTYPE)sum. Например, при создании хэша SHA1 для слова «nullbyte» я запустил следующую команду:
Шаг 1. Загрузка и установка Hash-Identifier
Установить скрипт, написанный на Python, – очень просто. Откройте терминал и запустите следующую команду:
Затем посмотрите содержимое директории hash-identifier:
Вы должны обнаружить файл hash—id.py, который можно запустить при помощи команды ниже:
Шаг 2. Идентификация неизвестных хэшей
В качестве пробного подхода при помощи hash-identifier попробуем опознать следующие пять неизвестных хэшей:
Для начала в командной строке вводим первую строку и быстро получаем результат, что скорее всего имеем дело с хэшем, используемым в MySQL, который попробуем взломать чуть позже.
Второй хэш, показанный ниже, опознается как SHA256. Другой вероятный вариант — Haval256.
Третий хэш опознается как SHA1:
Четвертый хэш опознается как SHA512:
Наконец, пятый и последний хэш опознается как MD5:
Все прошло без особых проблем. Следующий шаг – поиск нужного режима, соответствующего обнаруженному типу, который будет указываться в Hashcat во время взлома.
Шаг 3. Подбор режима в Hashcat
При поиске нужного режима мы можем взглянуть на огромный список хэшей, поддерживаемых в Hashcat. Сокращенный вариант с наиболее популярными типами приведен ниже:
В списке выше есть два примера, которые могут соответствовать первому хэшу (7196759210defdc0), рассмотренному нами в предыдущем шаге. На первый взгляд, режим 200 «MySQL323» наиболее соответствует. Подтвердить гипотезу можно при помощи проверки тестового хэша в hash-identifier.
Точное совпадение с нужным хэшем:
Если мы попробуем другой тип (300), то увидим, что результаты не совпадают.
Соответственно, еще раз убеждаемся, что режим 200 выбран правильно.
Шаг 4. Расшифровка хэша при помощи Hashcat
После идентификации типа хэша и подбора нужно режима можно приступать к расшифровке пароля в Hashcat. Вначале нужно создать словарь с паролями, который будет использоваться в Hashcat для атаки на хэш. В сети есть много доступных списков, например, RockYou, но в нашем случае мы будем создавать тестовый словарь example.dict с несколькими паролями.
Если вы все еще находитесь внутри скрипта hash-identifier, нажмите Ctrl—C, а затем откройте файл в текстовом редакторе nano, запустив следующую команду:
После добавления нескольких предполагаемых паролей, один из которых – «hashcat», нажимаем Ctrl—X для выхода из редактора и вводим Y, чтобы сохранить изменения в файле. Теперь мы можем использовать этот файл в качестве словаря вместе с ранее выбранным режимом для взлома хэша. Базовая команда выглядит примерно так:
Вместо значения HASH_VALUE указываем хэш 7196759210defdc0, вместо MODE_NUMBER – подобранный ранее режим 200. Результат работы показан ниже. Если у вас старая система, как в моем случае – нужно указать параметр –force.
В результате мы получили 7196759210defdc0:hashcat и смогли расшифровать хэш посредством сравнения с элементами словаря из файла example.dict.
Когда вы имеете дело с неизвестным хэшем, первый шаг – корректная идентификация типа. Хотя скрипт hash-identifier – не идеален, но позволяет без особых проблем опознать наиболее распространённые хэши и отличить разные типа хэшей, которые выглядят одинаково, но требуют разных режим работы в Hashcat. Даже если hash-identifier не уверен, с каким типом вы имеете дело, сравнение с результатами примеров с сайта Hashcat, может помочь в идентификации.
Надеюсь это руководство, посвященное опознанию неизвестных хэшей, вам понравилось.
Обзор инструментов для вскрытия хэша: John the Ripper password cracker и MDCrack
John the Ripper password cracker предназначен для вскрытия различных типов хэшей, которые применяются во множестве ПО и ОС, от MySQL до OpenBSD. В программе реализованы возможности: брутфорс пароля, подбор пароля по словарю и гибридная атака. А также signle и external способы подбора пароля, специфичные для этой программы. О всех способах будет рассказано ниже.
Одной из особенностей программы является тот факт, что при вскрытии большого количества паролей «за раз», велика возможность того, что они вскроются быстрее, чем бы вскрылись по отдельности. А также инкремент пароля производится «интеллектуально», о чём будет сказано ниже.
В программе имеются два ограничения: john может вскрывать хэши только с солью — для вскрытия обычных хэшей вам потребуется соответствующий патч или готовая спец. сборка программы; можно брутфорсить пароль длиной не более 8-ми символов (но при атаке по словарю такого лимита нет).
Salt (соль, «затравка») — это метод усложнения вычисления хэша. К примеру, во FreeBSD, при вычислении хэша от пароля, сначала генерируются два случайных символа, которые конкатенируются к паролю, от полученной строки вычисляется хэш, и к полученному хэшу прибавляются эти два символа, давая результирующий хэш.
Для тестирования скорости программы на вашем компьютере, запустите её с флагом ‘—test’. Результат будет выдан в c/s, т.е. в символах в секунду, а не в h/s (хэш в секунду), как это принято в других программах этого типа. Но каждый следующий символ образует новый пароль. А значит, перебирая, к примеру, 3500 символов в секунду, мы генерируем 3500 новых паролей в секунду. Следовательно, цифры, которые даёт команда john —test — это и есть хэши в секунду.
Для начала работы программы, запишите вскрываемый хэш в файл: user:hash, где user — это любая строка, и hash — вскрываемый вами хэш. Если вам требуется вскрыть сразу несколько хэшей, то нужно записать их всех в один файл. Как сказано выше, велика вероятность того, что так все хэши вскроются быстрее, чем если бы они были записаны в разные файлы по отдельности. Например, создадим файл bla.pass такого содержания:
Что бы начать перебор, дайте команду john bla.pass. Программа скажет о количестве загруженных хэшей, о количестве различных salt-ов (в старых unix-системах salt был фиксированным, т.е. одинаковым у всех паролей) и о типе хэшей. Тип хэша может определится не верно. Так, если попытаться вскрыть обычный md5_128bit (без salt), то рассматриваемая в этой статье версия john-а определит этот хэш как NT LM DES, и начнёт подбор пароля, заведомо безрезультатно.
После начала перебора, может пройти вечность до того, как пароль вскроется. Что бы попытаться вскрыть пароль в разумные сроки, у john-а есть целый арсенал различных типов подбора (режимов работы), правил, фильтров и гибкий файл конфигурации. Далее будут коротко рассмотрены режимы работы john-а. Дополнительную информацию читайте в документации к программе.
Single crack mode — поиск пароля по косвенным уликам. Первыми кандидатами в пароли становятся имя пользователя, «GECOS», «Full Name» — поля его учётной записи и название домашней директории пользователя. А также используются правила (гибридная атака) для полученных данных, и возможных паролей становиться больше. Но не так много как в прилагаемом к программе словаре. Поэтому это самый быстрый способ. Он завершает свою работу (перебирает все возможные этим способы варианты паролей) за несколько секунд.
Wordlist — подбор пароля по словарю. Основной словарь весит более чем 600 Mb, распространяется на двух дисках. В нём собраны наиболее употребляемые пароли более чем на 20 языках. Стоит этот сборник паролей 28.25$. Также доступен малый сборник паролей размером 11 Mb. Эффективность этого сборника сомнительна, поскольку он также содержит пароли на более чем 20 языках. У режима wordlist есть «подрежим»: wordlist с правилами (rulets). Это гибридный вид подбора пароля. Набор применяемых правил можно изменять и дополнять своими. Правила описаны в файле конфигурации спецсимволами и специальными флагами, которые читает и обрабатывает john-овский препроцессор правил.
Incremental — грубый перебор, т.е. брутфорс. Настройки перебора хранятся в файле конфигурации. При переборе, программа равномерно распределяет частоту инкремента по длине пароля и набору символов (That’s one reason why this mode deals with trigraph frequencies, separately for each character position and for each password length, to crack as many passwords as possible within a limited time). Есть пять подрежимов инкрементного режима: «All», «Alnum», «Alpha», «Digits» и «LanMan». К примеру «Digits» будет перебирать лишь цифры, «Alpha» — лишь строчные латинские буквы. Также есть возможность создания своего подрежима инкрементного режима. Подробнее — в документации.
External — этот режим даёт возможность применять «фильтры», описанные в файле конфигурации на языке Си с использованием четырёх callback-функций. С помощью этого можно написать свой алгоритм перебора. Но несколько основных уже написаны в файле конфигурации, и ими можно пользоваться.
Все режимы можно совмещать. По дефолту (если не указывать режим и ничего не менять в конфигах) программа сначала отработает single-режим, затем попытается подобрать пароль по словарю, прилагаемому к программе (всего лишь 3108 паролей), затем начнёт перебор паролей (перейдёт в инкрементный режим) длиной от 0 до 8 с азбукой в 96 символов (латинские строчные, латинские заглавные, цифры и символы).
Практический совет: пробуйте сначала те режимы и подрежимы, которые заканчивают свою работу (в случае неудачи) быстрее всех. После завершения работы в режимах single, wordlist и wordlist with rulets, вы, вероятно, начнёте брутфорсить пароль в подрежиме «All». Это может оказаться вашей большой ошибкой, которая отнимет у вас слишком много времени. Вместо этого, сначала попробуйте более быстрые подрежимы в порядке возрастания количества символов: «Digits» (10 цифр), «Alpha» (26 латинских строчных букв), «Alnum» (36 символов — буквы + цифры) и т.п. Поскольку пользователи часто используют простые пароли, сперва следует попробовать более быстрые подрежимы инкрементного перебора. Это может значительно сэкономить вам время.
mdcrack
Программа нацелена на достижение максимальной скорости перебора пароля. Версия программы 1.2 имеет открытый исходный код, но поддерживает всего лишь три вида хэшей: MD4, MD5 и NTLM1. Программа версии 1.5 и 1.7 поддерживает большее число хэшей, в том числе и md5_freebsd, но исходный код в открытом виде не предоставляется. Программу mdcrack удобно использовать для брутфорса, когда стандартная сборка программы john вам не подошла, т.е. когда вам необходимо вскрыть хэш без соли (без salt).
Пример вызова программы mdcrack:
После этой команды создастся «сессия», и если вы прервёте перебор, дайте команду mdcrack (без параметров) для возврата к прерванной сессии. Для удаления сессии, дайте команду mdcrack -d.
По завершению или после прерывания работы программы, она выдаёт информацию о производительности компьютера (среднее количество хэшей в секунду).
Флаг -W используется для создания файла предварительно рассчитанных пар pass:hash. Для чтения такого файла используется флаг -R. Для более быстрой работы чтения/записи используется флаг -F.
Флаги -b и -e используются для указания challegne-значения. В некоторых протоколах передачи данных, передаваемый хэш пароля шифруется (вычисляется хэш от передаваемого хэша). Пароль, на который он шифруется в данном контексте называется challegne.
Стоит отметить, что программа mdcrack ищет в хэше коллизии. Дело в том, что одному хэшу может соответствовать несколько паролей (но вероятность этого очень мала), причём разной длины. Если пользователь задал пароль из 9 символов, при подборе такого пароля может выясниться, что другой, более короткий пароль, к примеру из двух символом, имеет точно такой же хэш. И если его ввести атакуемой системе — он будет воспринят как правильный.
Расшифровка паролей md5. Онлайн шифрование MD5. Обзор средств для декодирования хеш-кода MD5
md5() нельзя расшифровать, так как он ничего не шифрует. Он хеширует. Термина «расхешировать» нет.
Хеширование, это преобразование данных произвольного размера в короткую строку (или число) фиксированной длины. Для алгоритма md5 результатом является 32-разрядное 16-ричное число (называемое хешем или дайджестом).
Содержащиеся из имени пользователя и пароля обычно хранятся в базе данных сервера. Много лет назад пароли, хранящиеся в базе данных, были четким текстом, поэтому можно восстановить потерянные пароли. Это, очевидно, небезопасно, потому что хакер, которому удается взломать сервер, мгновенно получит доступ к тысячам паролей. Помимо этого, менее безопасные люди, вероятно, будут использовать один и тот же пароль для всех онлайн-сервисов, и это потенциально позволит хакеру получить доступ ко всем другим сервисам, принадлежащим пользователю.
Если он соответствует, то вам разрешено войти в систему. Это также улучшает функцию восстановления пароля, отправляя только что сгенерированный пароль, а не позволяя восстановить старый пароль. Хотя и не напрямую, можно выполнить обратный поиск. Однако после ручного тестирования каждой базы данных мы обнаружили, что половина из них больше не работает. Это по-прежнему полезно, потому что результаты отображаются в реальном времени без необходимости обновления веб-страницы.
Немного разбираясь в математике, можно сообразить: множество входных значений (строка произвольного размера), практически бесконечно, в то время как количество возможных результатов, представляет собой вполне конечное число – 1632. Следовательно, взаимнооднозначного соответствия между двумя множествами быть не может. Следовательно, зная результирующий хеш, получить исходную строку невозможно, т.к. для одного хеша возможных исходных строк может быть любое количество.
Помимо этого, они также сделали свой список слов более эффективным, применяя интеллектуальное словосочетание. Форма позволяет до 5 хэш-значений за раз, и результат отображается мгновенно в нижней части формы. Поиск основан на нескольких онлайн-базах данных, а также на двигателях с использованием радужных таблиц. Полезным советом является то, что текстовое поле может поддерживать несколько хэшей максимум до 500, помещая каждый хеш в новую строку.
Любой взломанный хеш, содержащий 8 или более символов, потребует оплаты в размере 195 руб, чтобы открыть пароль, в то время как все, что меньше 8 символов, бесплатно. Полезная функция идентификации хэша полезна для определения типа используемого хэша.
Изначальная задача md5, вообще, ни к хранению паролей, ни к web-программированию не относится. md5 вычисляет контрольные суммы. Например, при передаче большого файла по каналу связи, где возможны ошибки, вместе с ним можно передать его md5-хеш, после чего приемник так же может вычислить хеш полученных данных и сравнить с пришедшим, чтобы удостовериться, что сбоев при передаче не произошло. Либо, вы можете распространять свою программу и выложить у себя на сайте хеш её архива. И пользователь, получивший её из других источников, может проверить, а не залезал ли в неё злой хакер и не прицепил ли в конце какой-нибудь вирус. Одно из свойств md5-алгоритма – значительное отличие хеша, даже при незначительных изменениях во входных данных.
Расшифровка хеша онлайн
Хотя они не упоминаются нигде на их веб-сайте, кажется, что хеш-треск, содержащий 6 символов или меньше, свободен, в то время как строки, содержащие 7 символов или более, требуют оплаты. Теперь что мы будем делать, если ключ меньше ввода? Это имеет место в большинстве ситуаций. Если ключ был такой же длины, как и вход, это не было бы интересно, потому что вам также нужно было бы передать ключ тому человеку, которого вы хотите прочитать на входе. Напротив, когда ключ и вход имеют одинаковую длину, невозможно, чтобы кто-то взломал шифр.
Хеширование паролей
Вообще-то, дыра в безопасности не в этом. При настройке БД вменяемым администратором, никто посторонний доступа получить не должен. Однако народ у нас администраторам не доверяет и пароли в базе шифрует. Т.е. в большинстве случаев, как уже выяснили, не шифрует, а хеширует.
Так что, когда ключ меньше ввода, вы просто повторно применяете его, пока не дойдете до конца ввода. Вы можете видеть, что мы просто повторяем ключ. Чем меньше ключ, тем легче будет взломать ваш шифр. Даже если действие не определено, информация перемещается по сети, которая должна быть отправлена в тот же файл.
Идея этого учебника заключается в том, чтобы объяснить, как шифровать пароль и тем самым препятствовать его перемещению в виде обычного текста по сети. Хеш-функцию можно понимать как алгоритм, который берет строку и преобразует ее в другую строку конечного размера.
В большинстве случаев это выглядит следующим образом:
1. При регистрации пользователя, введенный им пароль хешируется. В простейшем случае просто md5($password). И именно хеш заносится в базу. Исходный пароль не сохраняется нигде.
2. При авторизации пользователь вводит пароль, который отправляется на сервер. На сервере он так же хешируется и сравнивается с хешем в базе. Т.е. не хеш из базы преобразуется к нормальному виду, а наоборот.
Добавить библиотеку для шифрования
Событие для отправки пароля для шифрования
Злоумышленник, получивший доступ к базе может узнать только хеши, а не исходные пароли, так что его дальнейшая задача усложнится.
Подбор пароля при известном хеше
Поиск коллизии, имея из исходных данных только хеш, можно осуществить только одним способом – банальным перебором всех значений.
Классическое приложение имеет много вариантов, но мы перечислим наиболее распространенные, которых в большинстве случаев будет достаточно. Общая командная строка выглядит так. В качестве исполняемого файла мы выберем тот, который соответствует выбранному дистрибутиву.
- Обычно мы будем использовать атаку со словарем или грубой силой.
- Полный список комбинаций появляется в справке.
Время на подбор составляет: * .
Количество перебираемых хешей пропорционально мощности множества всех возможных значений хеша, т.е. 1632, т.е, примерно, 1038. С учетом того, что md5 достаточно длительный для вычисления алгоритм, время подбора выливается на современных компьютерах в достаточно ощутимый промежуток.
Хотя, это время подбора абстрактного значения. Если у вас пароль может содержать латинские символы в обоих регистрах и цифры и иметь длину от 6 до 15 символов, то общее число вариантов – (26*2 + 10)15 – (26*2 + 10)5 = 1026. А с учетом того, что большинство пользователей не будет набирать более 10 символов – 1018. Что уже несколько веселее для взломщика. Если требуется подобрать пароль только к одному пользователю, имея базу по всем пользователям сайта, то делите это число еще и на их количество.
Пароли, хранящиеся в настольных приложениях
Существует несколько способов обнаружения и восстановления этих паролей. В зависимости от этих паролей мы вставили их в настольное приложение, в браузер или в базу данных. Если нам не удастся, то мы можем сбросить его. Таким образом, мы можем войти в панель администрирования, добавить новый пароль и повторно отредактировать файл. 
И, прежде всего, не плохо, и используйте эти инструменты только для восстановления собственных паролей. Если кто-то хочет внести свой вклад, пожалуйста, оставьте комментарий. . Нет информации, чтобы изменить хеш на исходное значение.
Обращаю внимание, что это средние теоретические цифры. Существует вероятность, что вы наткнетесь на нужный вариант уже на первой итерации. Примерно 1 на 1018.
Так же это все верно при случайной генерации пароля. Однако, треть учетных записей администраторов ломается вводом пароля «god». А еще треть – «admin».
Алгоритм хеширования
Простой md5(md5($password)) увеличит время подбора вдвое. Добавьте туда логин, идентификатор пользователя и секретную строку: md5(md5($password.$login).$secret). Перемешайте все это и сделайте так, чтобы никто не узнал точный алгоритм. На каждом сайте немного изменяйте его.
То, что предлагают эти сайты, — это так называемый радужный стол. Техника состоит из той же логики, что и грубая сила. Эта схема работает только для хэшей без «прыжка». Сценарий автоматически генерирует в бесконечном цикле все возможные комбинации символов.
В настоящее время несколько сайтов гарантируют наличие комбинаций из 5 полных символов и почти завершение 6 символов. Чтобы лучше понять, посмотрите пример логики. Кажется, легко создать хеши, однако вам нужно создать комбинации. Вот пример размера 2.
Пока это кажется легким, но представьте себе 5 комбинаций. Сколько возможных комбинаций существует в 5 домах? В этот момент комбинации идут от триллионов записей. Как эти сайты возвращают значение хэша? Просто просматривайте базу данных. Поэтому рекомендуется избегать коротких паролей, менее 6 символов, а также паролей, содержащих простые символы.
Все, вы неуязвимы.
Недостатки
Автоматическая авторизация
В простейшем случае в куках хранятся логин и пароль в открытом виде. Это не совсем здорово, так как куки можно перехватить или просто подсмотреть в браузере. В FireFoxе это вообще делается просто в меню. Поэтому, перед сохранением в куки над этими данными так же следует немного поиздеваться.
Простой пример пароля, где, конечно, сайты радужных таблиц уже имеют свои хэши. При создании пароля попытайтесь сделать что-то вроде этого. Смешайте специальные символы, прописные и строчные буквы, цифры. Наконец, чем больше и сложнее, тем меньше шансов оказаться в радужном столе или сломаться грубой силой.
Веб-сайт, который возвращает исходный пароль пользователю, небезопасен. Когда вы найдете сайт, который делает это, избегайте его использования, если у вас есть важная информация, особенно финансовые транзакции. Отягчающим фактором в этом является то, что большинство пользователей используют один и тот же пароль для всего. Службы электронной почты, учетные записи социальных сетей, даже пароль кредитной карты.
Однако здесь нужно помнить следующую вещь – паролем является, по сути, не то, что вводит пользователь в форму, а то, что поступает на вход серверу. Если человек получает куки, которые посылаются серверу, он может послать их с тем же успехом, вне зависимости от того, открытый там пароль или хеш. По большому счету, основное преимущество – хеш сложнее визуально запомнить, чем обычный пароль.
Обзор средств для декодирования хеш-кода MD5
То есть, если вы можете получить пароль, у вас будет паспорт для почти всех или всех учетных записей, которые этот пользователь имеет в сторонних службах. К сожалению, пользователь отказывается от собственной безопасности для «практичности». На данный момент ответственность поставщиков услуг заставляет пользователя создавать сложные пароли. Сложность зависит от бизнес-модели сервиса.
Как расшифровать MD5-хэш: общие принципы
Чтобы присоединиться к сообществу, пользователи оригинальной игры подключаются к одному из серверов компании и управляют своим именем пользователя, электронной почтой и паролем. Взлом был обнаружен исследователем безопасности Трой Хант, который сказал, что получил данные от контакта, который активно участвует в продаже этого типа информации. Детали были отправлены на веб-сайт уведомлений о нарушениях ученого, Я был обналичен? Где пользователи могут проверить, были ли скомпрометированы их учетные записи.
Хранить авторизационные данные в куках можно по разному. Например, можно завести табличку в базе: id-пользователя => рандомный хеш. И хранить в куках этот самых хеш. При каждой авторизации его можно менять и перезаписывать куку. Можно привязать его к IP, чтобы, даже узнав его, плохие дяди не смогли попасть на сайт с другой машины. Но при этом пользователи модемов идут лесом.
Подробности включают электронные письма и слабо маскированные пароли, которые могут быть легко декодированы хакерами. Более короткие ключевые слова особенно плохо устойчивы к методу «грубой силы», в котором программа автоматически экспериментирует со всеми возможными комбинациями чисел, букв и специальных символов, пока не найдет правильный пароль.
Обратившись к пользователям службы, веб-сайт материнской платы сообщил, что служба даже сообщила своим пользователям о мероприятии. «Плохо, что они были захвачены в первую очередь, но это еще хуже, но они не сказали нам об этом», — сказал один американский игрок.
Однако этим мы ставим под сомнения все предыдущие выкрутасы с паролем. Ведь, получив доступ к базе, хакер теперь может не подбирать пароль к хешу, а установить себе нужную куку.
Можно хранить в куках хеш по типу того, что в базе. Но нужно опять таки смотреть, чтобы не обесценить все наши попытки зашифровать пароль. Если хранить в базе и в куке одинаковый хеш, то опять все хеширования становятся бессмысленными. Даже при разных алгоритмах нужно долго думать. Например:
Код: PHP
$hash2Base = md5($login.$password);
$hase2Cookie = md5($login.md5($login.$password));
Ну и что? Узнав из базы hash2Base, элементарно вычисляем $hash2Cookie = md5($login.$hash2Base) и кладем себе в куку.
Молчаливые действия или больше ошибок?
Обратившись к публикации, представитель спасательной шлюпки сказал, что он некоторое время знал о неисправности. Когда это произошло в начале января, мы решили, что для наших пользователей лучше всего было заставить пароль сбросить пароль, не давая хакерам понять, что у них мало времени для действий. Мы сделали это через несколько недель. Мы не храним личные данные о игроках, поэтому он не просачивался, — сказал он.
Что такое MD5-хэш?
По данным материнской платы, служба сообщила, что она не была проинформирована о пользователях, пострадавших от вторжения, но не пояснила, почему она не выявила возникновение после вышеупомянутого сброса. Опрошенные игроки говорят, что они не получили никакого предупреждения, чтобы изменить свои ключевые слова до сих пор.
Вариантов масса. Главное понимать, что автоматической авторизацией мы открываем еще один вход на сайт и следить за всем приходится вдвое тщательнее.
Простой подбор
Решается это просто – запрещением авторизоваться одному пользователю чаще определенного времени (да даже чаще двух секунд).
Блокированием IP, с которого идет слишком много вопросов. Можно сделать даже на уровне сервера. Правда, достаточно легко обходится путем использования прокси-серверов.
Построение отпечатка всех комбинаций букв, цифр и специальных символов невозможно, потому что можно хранить максимальное количество отпечатков пальцев, чтобы найти пароли относительно простыми, но иногда очень используется. В Интернете есть несколько сайтов, каждый из которых предлагает более или менее полный охват.
Если это так, настоятельно рекомендуется менять и добавлять символы. Также рекомендуется добавить соль соли в пароль до измельчения, так что вы можете исправить атаки словаря . Только если вы не можете увеличить размер пароля, что крайне редко. Пароль не может быть бесконечным. Короче говоря, ничто не было бы возможно. С другой стороны, он может быть сколь угодно большим. Но даже несмотря на это, мне кажется — всегда можно увеличить его: если взять размер самого большого пароля, который может быть сохранен в памяти высокого класса, вы наверняка сможете проверить все значения за конечное время.
Даже без этих элементарных действий, важная помеха, это скорость ответа сервера. Если сценарий обрабатывается, например, 1 секунду процессорного времени, то чаще проверять пароль просто невозможно.
Подчеркиваю – процессорного времени. Не стоит пытаться защититься при помощи sleep(2) во время авторизации. Эта функция выводит процесс на заданное время из очереди процессов, и он не занимает ресурсов. Послав несколько запросов параллельно, хакер нейтрализует эту задержку.
Бывает, что забудешь код от входной двери, и стоишь, ждешь того, у кого память лучше твоей. Хотя самая лучшая память у ученых. Они еще помнят те времена, когда им за новые знания пятки каленым железом прижигали. Иначе бы они не придумали такую страшную штуку, как расшифровка MD5 . А до этого они умудрились ее еще и зашифровать!
Что такое MD5?
MD5 является одним из алгоритмов хеширования на 128-битной основе. Под хешированием понимают преобразование входных данных по определенному алгоритму в битовую строку определенной длины. При этом полученный в ходе вычислений результат представлен в шестнадцатеричной системе исчисления. Она называется хешем, хеш-суммой или хеш-кодом.
Процесс хеширования широко применяется в программировании и веб-индустрии. В основном для создания уникальных значений в ассоциативных массивах, идентификаторов.
Область применения хеш-кодов:
- Создание электронных подписей;
- Хранение паролей в базах данных систем безопасности;
- В рамках современной криптографии для создания уникальных ключей онлайн;
- Проверка подлинности и целостности элементов файловой системы ПК.
MD5 как стандарт хеширования был разработан в 1991 году для создания уникального хеш-кода от заданного значения с последующей проверкой его подлинности.
Утилита md5sum, предназначенная для хеширования данных заданного файла по алгоритму MD5, возвращает строку. Она состоит из 32 чисел в шестнадцатеричной системе исчисления (016f8e458c8f89ef75fa7a78265a0025).
То есть хеш, полученный от функции, работа которой основана на этом алгоритме, выдает строку в 16 байт (128) бит. И эта строка включает в себя 16 шестнадцатеричных чисел. При этом изменение хотя бы одного ее символа приведет к последующему бесповоротному изменению значений всех остальных битов строки:

Проблемы надежности MD5
Казалось бы, такая характеристика MD5 должна обеспечивать 100% гарантии неуязвимости и сохранения данных. Но даже этого оказалось мало. В ходе проводимых исследований учеными был выявлен целый ряд прорех и уязвимостей в этом уже распространенном на тот момент алгоритме. Основной причиной слабой защищенности MD5 является относительно легкое нахождение коллизий при шифровании.
Под коллизией понимают возможность получения одинакового результата вычислений хеш-функции при разных входных значениях.
Проще говоря, чем больше вероятность нахождения коллизий, тем надежность используемого алгоритма ниже. Вероятность нахождения коллизий при шифровании более надежными хеш-функциями практически сводится к 0.
То есть большая вероятность расшифровки паролей MD5 является основной причиной отказа от использования этого алгоритма. Многие криптологи (специалисты по шифрованию данных ) связывают низкую надежность MD5 с малой длиной получаемого хеш-кода.
Область применения алгоритма хеширования:
- Проверка целостности файлов, полученных через интернет – многие инсталляционные пакеты программ снабжены хеш-кодом. Во время активации приложения его значение сравнивается со значением, расположенным в базе данных разработчика;
- Поиск в файловой системе продублированных файлов – каждый из файлов снабжен своим хеш-кодом. Специальное приложение сканирует файловую систему компьютера, сравнивая между собой хеши всех элементов. При обнаружении совпадения утилита оповещает об этом пользователя или удаляет дубликат. Одной из подобных программ является :

- Для хеширования паролей – в семействе операционных систем UNIX каждый пользователь системы имеет свой уникальный пароль, для защиты которого используется хеширование на основе MD5 . Некоторые системы на основе Linux также пользуются этим методом шифрования паролей.
Обзор средств для декодирования хеш-кода MD5
Иногда при работе с компьютером или поврежденными базами данных требуется декодировать зашифрованное с помощью MD5 значение хеша.
Удобнее всего использовать специализированные ресурсы, предоставляющие возможность сделать это online :
- md5.web-max.ca – данный сервис обладает простым и понятным интерфейсом. Для получения декодированного значения нужно ввести хеш и заполнить поле проверочной капчи:

- md5decrypter.com – аналогичный сервис;
- msurf.ru – данный ресурс имеет простой русскоязычный интерфейс. Его функционал позволяет не только расшифровывать значения хеш-кодов, но и создавать их:

Если происмотреться к значениям декодинга, отображенных на показонном выше рисунке, то становится понятно, что процесс расшифровки почти не дает результатов. Эти ресурсы представляют собой одну или несколько объединенных между собой баз данных, в которые занесены расшифровки самых простых слов.
При этом данные декодирования хеша MD5 даже такой распространенной части пароля как «админ » нашлись лишь в одной базе. Поэтому хеши паролей, состоящих из более сложных и длинных комбинаций символов, практически невозможно расшифровать.
Создание хеша MD5 является односторонним процессом. Поэтому не подразумевает обратного декодирования первоначального значения.
Основы безопасности при использовании MD5
Этот стандарт кодирования является одним из самых распространенных методов защиты данных не только в прикладном, но и в веб-программировании. Поэтому не будет лишним обезопасить свой md5 hash от намеренного взлома.
Основным способом, гарантирующим безопасность хеша вашего пароля, является использование «соли ». Он основан на добавлении к паролю нескольких случайных символов и последующем хешировании результата.
Во многих языках программирования для этого используются специальные классы и функции. Не являются исключением из правил и серверные языки программирования.
Создать хеш-код MD5 в php можно с помощью нескольких функций:
- md5() – в качестве одного из параметров принимает значение «соли »;
- crypt() – в отличие от предыдущей эта функция полностью автоматизирует весь процесс, в том числе и генерирование значения соли.
String crypt (string $str [, string $salt ])
При использовании функции md5() в PHP для задания значения соли используют методы генерации случайных чисел. Например, rand() :
password_hash
password_hash() создаёт хеш пароля используя сильный, необратимый алгоритм хеширования.
В данный момент поддерживаются следующие алгоритмы:
- PASSWORD_DEFAULT — используется алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, что используемый алгоритм может со временем меняться на более сильный, когда таковой добавляется в PHP. Соответственно и длина результата может со временем меняться. В связи с этим рекомендуется выбирать длину поля для хранения в базе данных более 60 символов (255 символов могло быть хорошим вариантом).
- PASSWORD_BCRYPT — использует алгоритм CRYPT_BLOWFISH . Генерирует стандартный хеш, совместимый с генерированным функцией crypt() с использованием идентификатора "$2y$". В результате будет сгенерирована строка длиной 60 символов или false в случае возникновения ошибки.
- PASSWORD_ARGON2I — Использовать алгоритм хеширования Argon2i. Этот алгоритм доступен только если PHP собран с поддержкой Argon2.
- PASSWORD_ARGON2ID — Использовать алгоритм хеширования Argon2id. Этот алгоритм доступен только если PHP собран с поддержкой Argon2.
Поддерживаемые опции для PASSWORD_BCRYPT :
salt ( string ) — для самостоятельного задания соли для хеширования. Обратите внимание, что это приведёт к переопределению и предотвращению автоматического создания соли.
Если не задано, то password_hash() будет генерировать случайную соль для каждого хешируемого пароля. Это предпочтительный режим работы.
Эта опция объявлена устаревшей. Рекомендуется использовать автоматически генерируемую соль. Начиная с PHP 8.0.0 явно заданная соль игнорируется.
cost ( int ) — задаёт необходимую алгоритмическую сложность. Пример использования этого значения можно посмотреть на странице посвящённой функции crypt() .
Если не задано, то будет использовано значение по умолчанию 10 . Это хорошая базовая стоимость, но вы можете её увеличить в зависимости от возможностей своего оборудования.
Поддерживаемые опции для PASSWORD_ARGON2I и PASSWORD_ARGON2ID :
memory_cost ( int ) — Максимальный размер памяти (в килобайтах), которую можно использовать для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_MEMORY_COST .
time_cost ( int ) — Максимально возможное время, которое можно потратить для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_TIME_COST .
threads ( int ) — Количество потоков, которые можно использовать для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_THREADS .
Доступно только тогда, когда PHP использует libargon2, но не при реализации libsodium.
Список параметров
Использование алгоритма PASSWORD_BCRYPT приведёт к обрезанию поля password до максимальной длины 72 байта.
Константа, обозначающая используемый алгоритм хеширования пароля.
Ассоциативный массив с опциями. За документацией по поддерживаемым опциям для каждого алгоритма обратитесь к разделу Константы алгоритмов хеширования паролей.
Если не задано, то будет использована стандартная стоимость и соль будет генерироваться автоматически.
Возвращаемые значения
Возвращает хешированный пароль.
Использованный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация, необходимая для проверки хеша будет в него включена. Это позволит функции password_verify() проверять хеш без необходимости отдельного хранения информации о соли и алгоритме.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | password_hash() больше не возвращает значение false в случае возникновения ошибки, вместо этого будет выброшено исключение ValueError , если алгоритм хеширования пароля недействителен или Error , если хеширование пароля не удалось из-за неизвестной ошибки. |
| 8.0.0 | Параметр algo теперь допускает значение null . |
| 7.4.0 | Параметр algo сейчас ожидает строку ( string ), но всё ещё принимает число ( int ) для обратной совместимости. |
| 7.4.0 | Модуль sodium обеспечивает альтернативную реализацию паролей Argon2. |
| 7.3.0 | Добавлена поддержка алгоритма хеширования паролей Argon2id с помощью PASSWORD_ARGON2ID . |
| 7.2.0 | Добавлена поддержка хеширующего алгоритма Argon2i с помощью PASSWORD_ARGON2I . |
Примеры
Пример #1 Пример использования password_hash()
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Пример использования password_hash() с ручным заданием стоимости
Результатом выполнения данного примера будет что-то подобное:
Пример #3 Пример поиска хорошего значения стоимости для password_hash()
<?php
/**
* Данный код замерит скорость выполнения операции хеширования для вашего сервера
* с разными значениями алгоритмической сложности для определения максимального
* его значения, не приводящего к деградации производительности. Хорошее базовое
* значение лежит в диапазоне 8-10, но если ваш сервер достаточно мощный, то можно
* задать и больше. Данный скрипт ищет максимальное значение, при котором
* хеширование уложится в 50 миллисекунд.
*/
$timeTarget = 0.05 ; // 50 миллисекунд.
$cost = 8 ;
do <
$cost ++;
$start = microtime ( true );
password_hash ( «test» , PASSWORD_BCRYPT , [ «cost» => $cost ]);
$end = microtime ( true );
> while (( $end — $start ) < $timeTarget );
echo «Оптимальная стоимость: » . $cost ;
?>
Результатом выполнения данного примера будет что-то подобное:
Пример #4 Пример использования password_hash() с Argon2i
Результатом выполнения данного примера будет что-то подобное:
Примечания
Настоятельно рекомендуется использовать автоматическую генерацию соли. Данная функция самостоятельно создаст хорошую соль, если вы не будете ей мешать подсовывая свою.
Как было замечено выше, опция salt была объявлена устаревшей в PHP 7.0 и будет вызывать соответствующее предупреждение. Поддержка ручного задания соли может быть удалена в более новых версиях.
Замечание:
Рекомендуется протестировать данную функцию на вашем железе для определения оптимального значения алгоритмической сложности. Убедитесь, что с выбранной сложностью функция выполняется быстрее 100 миллисекунд для интерактивных систем. Скрипт показанный выше поможет вам выбрать подходящее значение.
- Любой новый алгоритм должен присутствовать в ядре как минимум 1 полный релиз PHP для того, чтобы его можно было установить по умолчанию. Таким образом, если, к примеру, новый алгоритм был добавлен в 7.5.5, то задать по умолчанию его можно будет только в 7.7 (7.6 будет тем самым полным релизом, в течение которого он должен присутствовать, от 7.6.0 до 7.7.0). Но если новый алгоритм добавлен в 7.6.0, то его также можно будет задать по умолчанию в 7.7.0.
- Алгоритм по умолчанию может быть изменён только в полном релизе (7.3.0, 8.0.0, и т.д.), но не в промежуточных. Единственное исключение — это если в текущем алгоритме найдена критическая уязвимость.
Смотрите также
- password_verify() — Проверяет, соответствует ли пароль хешу
- password_needs_rehash() — Проверяет, что указанный хеш соответствует заданным опциям
- crypt() — Необратимое хеширование строки
- sodium_crypto_pwhash_str() — Получить ASCII-кодированный хеш
User Contributed Notes 12 notes
Since 2017, NIST recommends using a secret input when hashing memorized secrets such as passwords. By mixing in a secret input (commonly called a «pepper»), one prevents an attacker from brute-forcing the password hashes altogether, even if they have the hash and salt. For example, an SQL injection typically affects only the database, not files on disk, so a pepper stored in a config file would still be out of reach for the attacker. A pepper must be randomly generated once and can be the same for all users. Many password leaks could have been made completely useless if site owners had done this.
Since there is no pepper parameter for password_hash (even though Argon2 has a «secret» parameter, PHP does not allow to set it), the correct way to mix in a pepper is to use hash_hmac(). The «add note» rules of php.net say I can’t link external sites, so I can’t back any of this up with a link to NIST, Wikipedia, posts from the security stackexchange site that explain the reasoning, or anything. You’ll have to verify this manually. The code:
<?php
// register.php
$pepper = getConfigVariable ( «pepper» );
$pwd = $_POST [ ‘password’ ];
$pwd_peppered = hash_hmac ( «sha256» , $pwd , $pepper );
$pwd_hashed = password_hash ( $pwd_peppered , PASSWORD_ARGON2ID );
add_user_to_database ( $username , $pwd_hashed );
?>
<?php
// login.php
$pepper = getConfigVariable ( «pepper» );
$pwd = $_POST [ ‘password’ ];
$pwd_peppered = hash_hmac ( «sha256» , $pwd , $pepper );
$pwd_hashed = get_pwd_from_db ( $username );
if ( password_verify ( $pwd_peppered , $pwd_hashed )) <
echo «Password matches.» ;
>
else <
echo «Password incorrect.» ;
>
?>
Note that this code contains a timing attack that leaks whether the username exists. But my note was over the length limit so I had to cut this paragraph out.
Also note that the pepper is useless if leaked or if it can be cracked. Consider how it might be exposed, for example different methods of passing it to a docker container. Against cracking, use a long randomly generated value (like in the example above), and change the pepper when you do a new install with a clean user database. Changing the pepper for an existing database is the same as changing other hashing parameters: you can either wrap the old value in a new one and layer the hashing (more complex), you compute the new password hash whenever someone logs in (leaving old users at risk, so this might be okay depending on what the reason is that you’re upgrading).
Why does this work? Because an attacker does the following after stealing the database:
password_verify(«a», $stolen_hash)
password_verify(«b», $stolen_hash)
.
password_verify(«z», $stolen_hash)
password_verify(«aa», $stolen_hash)
etc.
(More realistically, they use a cracking dictionary, but in principle, the way to crack a password hash is by guessing. That’s why we use special algorithms: they are slower, so each verify() operation will be slower, so they can try much fewer passwords per hour of cracking.)
Now what if you used that pepper? Now they need to do this:
password_verify(hmac_sha256(«a», $secret), $stolen_hash)
Without that $secret (the pepper), they can’t do this computation. They would have to do:
password_verify(hmac_sha256(«a», «a»), $stolen_hash)
password_verify(hmac_sha256(«a», «b»), $stolen_hash)
.
etc., until they found the correct pepper.
If your pepper contains 128 bits of entropy, and so long as hmac-sha256 remains secure (even MD5 is technically secure for use in hmac: only its collision resistance is broken, but of course nobody would use MD5 because more and more flaws are found), this would take more energy than the sun outputs. In other words, it’s currently impossible to crack a pepper that strong, even given a known password and salt.