Как декодировать хеш php
Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash .
Теперь предположим, что $crypted хранится в базе данных (есть таблица «пользователей» с именами пользователей, паролями и т. Д.), И мне нужно выполнить вход: я должен проверить, совпадает ли пароль, введенный пользователем зашифрованный пароль, хранящийся в базе данных.
. но $inputpassword не зашифрован, поэтому он не равен тому, что хранится в поле пароля пользователей таблицы .
Итак, есть функция для расшифровки после использования password_hash ? Или мне следует изменить метод шифрования? Или что еще?
Bcrypt - это односторонний алгоритм хеширования, вы не можете расшифровать хеши. Используйте password_verify, чтобы проверить, соответствует ли пароль сохраненному хешу:
В вашем случае запустите SQL-запрос, используя только имя пользователя:
И выполните проверку пароля в PHP, используя код, аналогичный приведенному выше примеру.
То, как вы строите запрос, очень опасно. Если вы не параметризуете вход должным образом, код будет уязвим для атак с использованием SQL-инъекций. См. этот ответ о переполнении стека о том, как предотвратить SQL-инъекцию.
Пароли не могут быть расшифрованы, так как это создает уязвимость для пользователей. Итак, вы можете просто использовать метод password_verify() для сравнения паролей.
Где $upass - это пароль, введенный пользователем, а $userRow['user_pass'] - это поле user_pass в базе данных, зашифрованное функцией password_hash() .
Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash.
Мне не ясно, нужен ли вам password_verify , или вы пытаетесь получить несанкционированный доступ к приложению или базе данных. Другие говорили о password_verify , так что вот как вы можете получить несанкционированный доступ. Это то, что часто делают плохие парни, пытаясь получить доступ к системе.
Сначала создайте список паролей в виде простого текста. Список в виде простого текста можно найти во многих местах из-за массовых утечек данных со стороны таких компаний, как Adobe. Отсортируйте список, а затем возьмите 10 000 или около 100 000 лучших.
Во-вторых, создайте список переваренных паролей. Просто зашифруйте или хешируйте пароль. Судя по приведенному выше коду, не похоже, что используется соль (или ее фиксированная соль). Это делает атаку очень легкой.
В-третьих, для каждого переваренного пароля в списке выполните выборку, чтобы попытаться найти пользователя, использующего этот пароль:
Таким образом, вместо того, чтобы выбирать пользователя и пытаться изменить его пароль, злоумышленник выбирает общий пароль и пытается найти пользователя, который его использует. Шансы на стороне плохого парня .
Поскольку злоумышленник делает эти вещи, вам следует не разрешать пользователям выбирать общие пароли. В этом случае обратите внимание на ProCheck, EnFilter или Hyppocrates (и др.). Они фильтруют библиотеки, которые отклоняют неверные пароли. ProCheck обеспечивает очень высокую степень сжатия и может преобразовывать списки паролей из нескольких миллионов слов в файл данных размером 30 КБ.
мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash.
теперь предположим, что $crypted хранится в базе данных (есть таблица" пользователи", с именами пользователей, паролями и т. д.), И мне нужно сделать логин: я должен увидеть, соответствует ли пароль, введенный пользователем, зашифрованному паролю, хранящемуся в базе данных.
. но $inputpassword не зашифрован, поэтому он не равен тому, что хранится в поле password таблицы users.
Итак, есть функция для расшифровки после использования функция password_hash? Или я должен изменить свой метод шифрования? Или что еще?
Bcrypt-это односторонний алгоритм хэширования, вы не можете расшифровать хэши. Использовать функцию password_verify чтобы проверить, соответствует ли пароль сохраненному хэшу:
в вашем случае запустите SQL-запрос, используя только имя пользователя:
и сделать проверку пароля в PHP, используя код, аналогичный приведенному выше примеру.
Edit: построение запроса таким образом очень опасно. Если вы не избегаете ввода должным образом, код будет уязвим для атак SQL-инъекций. См.этой Итак, ответьте, как предотвратить SQL-инъекцию.
мне нужно расшифровать пароль. Пароль зашифрован функция функция password_hash.
Это не ясно для меня, если вам нужно password_verify , или вы пытаетесь получить несанкционированный доступ к приложению или базе данных. Другие говорили о password_verify , Так вот как вы можете получить несанкционированный доступ. Что плохие парни часто делают, когда они пытаются получить доступ к системе.
сначала создайте список простых текстовых паролей. Простой список текст можно найти в ряде мест из-за массовых нарушений данных от таких компаний, как Adobe. Отсортируйте список, а затем возьмите верхние 10,000 или 100,000 или около того.
во-вторых, создайте список перевариваются пароли. Просто шифровать или хэшировать пароль. Основываясь на вашем коде выше, это не похоже на использование соли (или ее фиксированной соли). Это делает атаку очень легко.
в-третьих, для каждого переваренного пароля в списке выполните выбор в попытке найти пользователя, который используя пароль:
таким образом, вместо того, чтобы выбрать пользователя и попытаться изменить свой пароль, плохой парень выбирает общий пароль и пытается найти пользователя, который его использует. Шансы на стороне плохого парня.
потому что плохой парень делает эти вещи, вам следовало бы не пусть пользователи выбирают общие пароли. В этом случае взгляните на ProCheck, EnFilter или Hyppocrates (и др.). Они фильтрация библиотек, отклоняющих неверные пароли. ProCheck достигает очень высокого обжатия, и может усвоить multi-million списки пароля слова в архив данных 30KB.
Я занимаюсь восстановлением исходников PHP из закодированного вида.
В этой статье я расскажу о том, как обстоят дела с кодированием и декодированием PHP в настоящее время.
Очень краткий ликбез по внутреннему устройству интерпретатора PHP
При выполнении PHP-скрипта, он парсится и компилируется в опкоды внутренней виртуальной машины PHP.
Из каждого файла PHP получаются:
— массив классов: в каждом классе — информация о классе, свойства класса и массив методов класса
— массив функций
— «тело скрипта» — код вне классов и функций
Для краткости, всю внутреннюю структуру скомпилированного файла, готового к выполнению, в этой статье я называю "опкодами".
Сами опкоды (операции внутренней виртуальной машины PHP) внутри какой-нибудь функции выглядят так:
Важный момент: файлы в скомпилированном виде достаточно сильно отличаются даже между подверсиями интерпретатора PHP. Оно и понятно: сам для себя скомпилировал — сам и выполнил.
Как работают энкодеры
Существуют два принципиально разных типа энкодеров.
Первые — работают исключительно средствами самого языка. Они делают код нечитаемым с помощью base64-кодирования, zip-ования, разных манипуляций со строками, и все в конце концов используют функцию eval(). Все это очень похоже на обфускаторы в Javascript. Выглядит это как-то так:
Юридические аспекты
Вообще говоря, декодирование PHP-файлов после коммерческих энкодеров — нелегально. Технически это связано с тем, что для полноценного декодирования нужно декомпилировать и анализировать сами энкодеры, а закон и пользовательские соглашения это прямо запрещают.
На территории Евросоюза есть такая лазейка: разрешается «обеспечивать совместимость экземпляров ПО, которыми вы владеете, и для этого, при необходимости, обходить встроенные системы защиты». При этом прямой запрет на reverse engineering у каждого энкодера все-таки имеет приоритет.
Получается, что «я скачал программу из Интернета, которая достала мне незашифрованные опкоды» или «я использовал специальную сборку интерпретатора PHP, которая сохраняет расшифрованные опкоды» — это условно-легальные способы декодирования. «Условно» — потому что если дело все-таки дойдет до суда, еще непонятно, кто окажется прав.
Понятное дело, что создатели энкодеров предпочли бы, чтобы закодированные файлы никто и никогда не мог бы раскодировать. Но у тех, кто остался с закодированные кодом после недобросовестных фрилансеров, или после исчезновения компании-разработчика (что бывает очень часто), мнение про декодирование — диаметрально противоположное.
Интересные факты и байки
Большая часть энкодеров последние пару лет всего лишь чуть-чуть меняет формат файлов «под капотом», и выпускается под видом новой версии.
При обфускации коротких имен достаточно часто возникают коллизии. Видимо, в таких случаях, тех.поддержка энкодеров просто советует не пользоваться обфускацией.
Фрилансеры настолько часто используют куски кода из документации PHP и со StackOverflow, что словарь, составленный из идентификаторов, взятых оттуда из примеров, позволяет обычно деобфусцировать под 90% всех имен в среднем проекте.
За все время работы я встретил всего лишь пять различных декомпиляторов PHP. Три из них были написаны русскоязычными программистами, еще один — китайцем и еще один — божились, что французом. Мелочь, а приятно — горд за «наших» :)
При этом большинство русскоязычных клиентов просит по-свойски сделать работу бесплатно :)
Один араб после длительного обсуждения его проекта, сообщил, что «мой бюджет — $15, но мы все понимаем… работы тут много, так что ты просто вышли все свои программы, а мы тут сами как-то все раскодируем».
Несколько раз получалось так, что декодировать определенный формат файлов мог только я. И одни и те же файлы приходили на декодирование через нескольких разных посредников одновременно.
Особенно меня повеселила такая история: негр с африканским именем и со швейцарским гражданством, разругался с фрилансером-программистом из Австралии, не заплатил ему за работу и остался с парочкой закодированных недоделанных файлов на своем сайте. Долго искал на фрилансерских биржах того, кто их раскодирует, пока наконец один индус не впарил ему свои услуги.
Три недели этот индус кормил заказчика завтраками, а сам усиленно искал реального исполнителя. Параллельно заказчик (жук еще тот) под другим именем и сам продолжал искать других декодировщиков на все тех же фрилансерских биржах. Нашел меня, отдал мне проект… и тут же, буквально через полчаса, ко мне постучался индус и с чувством явного облегчения стал уговоривать сделать и его проект тоже. Я сравнил файлы, и…
Конечно, стоило бы в воспитательных целях взять у обоих 100% предоплаты… но я просто заставил их пообщаться и разобраться между собой.
По итогам, индус до сих пор не забывает поздравить меня с днем рождения.
Заказчик даже дал мне бонус, а сейчас переехал в Эстонию (!) потому что там дешевле жить, и периодически уговаривает меня поучаствовать в каких-то его сомнительных прожектах.
UPD. Пришлось вырезать часть примера с eval-закодированым кодом, потому что Kaspersky выдавал на него предупреждение. Спасибо nokimaro!
Я в настоящее время студент, и я изучаю PHP, я пытаюсь сделать простой шифровать/расшифровывать данные в PHP. Я сделал некоторые онлайн-исследования, и некоторые из них были довольно запутанными(по крайней мере для меня).
вот что я пытаюсь сделать:
у меня есть таблица, состоящая из этих полей (UserID, Fname, Lname, Email, Пароль)
Я хочу, чтобы все поля были зашифрованы, а затем расшифрованы(можно ли использовать sha256 для шифрование / расшифровка, если нет алгоритма шифрования)
еще одна вещь, которую я хочу узнать, как создать один путь hash(sha256) в сочетании с хорошим "соль". (В основном я просто хочу иметь простую реализацию шифрования / дешифрования, hash(sha256)+salt) Сэр / мэм, ваши ответы будут очень полезны и будут очень оценены. Спасибо++
- поля Fname , Lname и Email будет зашифрован с помощью симметричного шифра, предоставленного OpenSSL,
- The IV поле будет хранить вектор инициализации используется для шифрования. Требования к хранению зависят от используемого шифра и режима; Подробнее об этом позже.
- The Password поле будет хэшироваться с помощью в один конец хэш пароля,
пример
давайте зашифруем поле имя, используя ранее $encryption_key и $iv ; для этого мы должны заполнить наши данные до размера блока:
хранение требования
зашифрованный вывод, как и IV, является двоичным; хранение этих значений в базе данных может быть выполнено с помощью назначенных типов столбцов, таких как BINARY или VARBINARY .
выходное значение, как и IV, является двоичным; чтобы сохранить эти значения в MySQL, рассмотрите возможность использования BINARY или VARBINARY столбцы. Если это не вариант, вы также можете преобразовать двоичные данные в текстовое представление с помощью base64_encode() или bin2hex() , для этого требуется от 33% до 100% больше места для хранения.
расшифровка сохраненных значений аналогична:
вы можете дополнительно улучшить целостность сгенерированного шифрованного текста, добавив подпись, сгенерированную из секретного ключа (отличного от ключа шифрования) и шифрованного текста. Перед расшифровкой зашифрованного текста сначала ставится подпись проверено (предпочтительно с помощью метода сравнения с постоянным временем).
Читайте также: