Как расшифровать пароль php
Как я могу расшифровать хэш пароля в PHP?
5 ответов
В вашем случае запустите SQL-запрос, используя только имя пользователя:
И выполните проверку пароля в PHP, используя код, аналогичный приведенному выше примеру.
То, как вы строите запрос, очень опасно. Если вы не параметризуете вход должным образом, код будет уязвим для атак с использованием SQL-инъекций. См. этот ответ о переполнении стека о том, как предотвратить SQL-инъекцию.
Пароли не могут быть расшифрованы, так как это создает уязвимость для пользователей. Итак, вы можете просто использовать метод password_verify() для сравнения паролей.
Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash.
Сначала создайте список паролей в виде простого текста. Список в виде простого текста можно найти во многих местах из-за массовых утечек данных со стороны таких компаний, как Adobe. Отсортируйте список, а затем возьмите 10 000 или около 100 000 лучших.
Во-вторых, создайте список переваренных паролей. Просто зашифруйте или хешируйте пароль. Судя по приведенному выше коду, не похоже, что используется соль (или ее фиксированная соль). Это делает атаку очень легкой.
В-третьих, для каждого переваренного пароля в списке выполните выборку, чтобы попытаться найти пользователя, использующего этот пароль:
Поскольку злоумышленник делает эти вещи, вам следует не разрешать пользователям выбирать общие пароли. В этом случае обратите внимание на ProCheck, EnFilter или Hyppocrates (и др.). Они фильтруют библиотеки, которые отклоняют неверные пароли. ProCheck обеспечивает очень высокую степень сжатия и может преобразовывать списки паролей из нескольких миллионов слов в файл данных размером 30 КБ.
Хэширование паролей в PHP 5.5 с использованием нового API
Использование BCrypt является общепринятым и лучшим способом для хэширования паролей, но большое количество разработчиков по-прежнему используют старые и слабые алгоритмы, вроде MD5 и SHA1. Некоторые разработчики даже не используют соль для хэширования. Новый API хэширования в PHP 5.5 ставит своей целью привлечь внимание к BCrypt, упрощая работу с ним. В этой статье я расскажу об основах использования нового API для хеширования в PHP.
password_hash()
Хотя функция crypt() довольно безопасна, она, по мнению многих, слишком сложная. Некоторые разработчики, чтобы не возиться с ней, используют слабую соль и слабый алгоритм для генерирования хэша, например:
Но функция password_hash() позволяет упростить нашу жизнь и обезопасить наш код. Когда вам нужно получить хэш пароля, просто скормите его в эту функцию, и она вернет хэш, который можно хранить в базе данных.
Вот и все! Первым параметром является строка пароля, который необходимо захэшировать, а второй параметр определяет алгоритм, который должен быть использован для генерирования хэша.
Алгоритм по умолчанию, в настоящее время, BCrypt, но более сильный алгоритм может быть установлен по умолчанию, когда-нибудь в будущем, и, возможно, он будет генерировать большие строки. Если вы используете PASSWORD_DEFAULT в ваших проектах, обязательно храните хэш в колонке, размером больше 60 символов. Установка размера колонки до 255 может быть хорошим выбором. Вы также можете использовать PASSWORD_BCRYPT в качестве второго параметра. В этом случае результат всегда будет 60 символов.
Главное здесь в том, что вам не нужно заботиться о значении соли и стоимости вычисления хэша. Новый API будет делать это за вас. И соль является частью хэша, так что вам не придется хранить его отдельно. Если вы хотите использовать вашу собственную соль (или стоимость вычисления), вы можете сделать это путем передачи третьего аргумента функции:
Таким образом, Вы будете всегда идти в ногу с актуальными мерами безопасности. Если PHP позже примет решение о применении более мощного алгоритма хеширования, ваш код может воспользоваться им без изменений.
password_verify()
Теперь, когда вы видели, как генерировать хэши с новым API, давайте посмотрим, как проверить пароль. Мы просто берем хэш из базы, и пароль, введенный пользователем и передаем их в эту функцию. password_verify() возвращает true, если хэш соответствует указанному паролю.
Соль является частью хэша и именно поэтому нам не придется возиться с ней отдельно.
password_needs_rehash()
Что делать, если вам нужно изменить соль или стоимость вычисления для сохраненных паролей? Например, вы решили усилить безопасность и увеличить стоимость вычисления или изменить соль. Или PHP изменил алгоритм хэширования, используемый по умолчанию. В этих случаях вы хотели бы изменить существующие хэши паролей. Функция password_needs_rehash() проверяет, использует ли хэш пароля конкретный алгоритм, соль и стоимость вычисления.
Имейте в виду, что вам нужно сделать это, когда пользователь авторизуется на сайте, так как это единственный раз, когда у вас есть доступ к его незашифрованному паролю.
password_get_info()
Заключение
Новый API хэширования паролей, безусловно, удобнее, чем возня с crypt(). Если ваш сайт в настоящее время работает на PHP 5.5, то я настоятельно рекомендуется использовать новое API хэширования. Те, кто используют PHP 5.3.7 (или более новой версии), могут использовать библиотеку под названием password_compat которая эмулирует это API и автоматически отключает себя при использовании PHP версии 5.5+.
Как зашифровать / расшифровать данные в php?
Я в настоящее время студент, и я изучаю PHP, я пытаюсь сделать простой шифрование/дешифрование данных в PHP. Я сделал некоторые онлайн-исследования, и некоторые из них были довольно запутанными(по крайней мере для меня).
вот что я пытаюсь сделать:
у меня есть таблица, состоящая из этих полей (UserID,Fname,Lname,Email,Пароль)
то, что я хочу иметь, это зашифровать все поля, а затем расшифровать (можно ли использовать sha256 для шифрование/дешифрование, если не любой алгоритм шифрования)
еще одна вещь, которую я хочу узнать, это как создать один путь hash(sha256) в сочетании с хорошим «соль». (В основном я просто хочу иметь простую реализацию шифрования / дешифрования, hash(sha256)+salt) Сэр / мэм, ваши ответы будут очень полезны и будут очень признательны. Спасибо++
6 ответов
предисловие
начиная с определения таблицы:
безопасность
шифр и режим
выбор лучшего шифрования и Режима Шифрования выходит за рамки этого ответа, но окончательный выбор влияет на размер как ключа шифрования, так и вектора инициализации; для этого сообщения мы будем использовать AES-256-CBC, который имеет фиксированный размер блока 16 байт и размер ключа или 16, 24 или 32 байта.
ключ шифрования
хорошим ключом шифрования является двоичный blob, который генерируется из надежного генератора случайных чисел. Рекомендуется следующий пример (>= 5.3):
это можно сделать один или несколько раз (если вы хотите создать цепочку ключей шифрования). Сохранить как можно собственной.
вектор инициализации добавляет случайность шифрования и требуется для режима CBC. В идеале эти значения должны использоваться только один раз (технически один раз на ключ шифрования), поэтому обновление любой части строки должно его регенерировать.
функция предоставляется, чтобы помочь вам создать IV:
пример
хранение требования
дешифрования
расшифровка сохраненных значений аналогична:
аутентифицированного шифрования
вы можете дополнительно улучшить целостность сгенерированного шифрованного текста, добавив подпись, сгенерированную из секретного ключа (отличного от ключа шифрования) и шифрованного текста. Перед расшифровкой шифрованного текста сначала ставится подпись проверено (предпочтительно с помощью метода сравнения с постоянным временем).
пример
хеширования
хранение обратимого пароля в базе данных следует избегать как можно больше; вы хотите только проверить пароль, а не знать его содержимое. Если пользователь теряет свой пароль, лучше позволить ему сбросить его, а не отправлять им свой оригинальный (убедитесь, что пароль сброс может быть выполнен только в течение ограниченного времени).
применение хэш-функции является односторонней операцией; после этого ее можно безопасно использовать для проверки, не раскрывая исходные данные; для паролей метод грубой силы является возможным подходом к его раскрытию из-за его относительно короткой длины и плохого выбора пароля многими людьми.
алгоритмы хэширования, такие как MD5 или SHA1, были сделаны для проверки содержимого файла по известному хэш-значению. Они значительно оптимизированы для сделайте эту проверку как можно быстрее, сохраняя при этом точность. Учитывая их относительно ограниченное выходное пространство, было легко построить базу данных с известными паролями и соответствующими хэш-выходами-таблицами rainbow.
добавление соли к паролю перед хешированием сделало бы радужную таблицу бесполезной, но последние аппаратные достижения сделали поиск грубой силы жизнеспособным подходом. Вот почему вам нужен алгоритм хэширования, который намеренно медленный и просто невозможный оптимизировать. Он также должен иметь возможность увеличить нагрузку на более быстрое оборудование, не влияя на возможность проверки существующих хэшей паролей, чтобы сделать его будущим доказательством.
в настоящее время доступны два популярных варианта:
этот ответ будет использовать пример с bcrypt.
A хэш пароля может быть сгенерирован следующим образом:
на crypt() функция выполняет хэширование на основе алгоритма ( y$ для Blowfish), фактор стоимости (фактор 13 принимает грубо 0.40 s на машине 3GHz) и соль 22 письмена.
проверка
после того, как вы извлекли строку, содержащую информацию о пользователе, вы проверяете пароль следующим образом:
чтобы проверить пароль, вы называете crypt() снова, но вы передаете ранее вычисленный хэш как значение соли. Возвращаемое значение дает тот же хэш, если данный пароль хеш. Чтобы проверить хэш, часто рекомендуется использовать функцию сравнения с постоянным временем, чтобы избежать время атаки.
хэширование паролей с помощью PHP 5.5
PHP 5.5 представил функции хэширования пароля что вы можете использовать для упрощения вышеуказанного метода хэширования:
Как хранить пароли в БД (PHP). Шифрование, хеширование паролей
Почему нельзя хранить пароли в открытом виде
Но если в его руках окажутся логины и пароли, он может попытаться использовать эти данные для входа в почтовые сервисы (Gmail, Яндекс.Почта, Mail.ru и т.д.), социальные сети, мессенджеры, клиент-банки и т.д.
В тот же личный кабинет Пятёрочки, чтобы перевыпустить карту и потратить чужие бонусы.
В общем, пользователи сайта, которые везде используют одни и те же логины и пароли, могут получить кучу проблем.
Некоторые разработчики считают, что их приложение надёжно защищено и никаких утечек быть не может. Есть несколько причин, почему это мнение ошибочно:
Короче, пароли в открытом виде хранить нельзя.
Шифрование и хеширование
Разница между этими двумя действиями в том, можем ли мы из случайного набора символов получить исходную строку по какому-то известному алгоритму.
Приведу пример шифрования. У нас есть сообщение:
Зашифровали. Теперь для расшифровки нужно выполнить обратную операцию, сдвинуть все буквы на 1 символ назад. К слову, этот алгоритм шифрования называется шифр Цезаря (Википедия).
В отличие от шифрования, хеширование не имеет (вернее, не должно иметь) способа «расхешировать» строку обратно:
Шифрование паролей
Не надо шифровать пароли.
Алгоритм дешифровки можно украсть или подобрать. При использовании хеширования неважно, знает ли его алгоритм злоумышленник, это не особо поможет ему в получении исходного пароля из хеша.
Хеширование паролей и авторизация
Для хеширования паролей в PHP существует функция password_hash() :
Вторым параметром передаётся алгоритм хеширования. По-умолчанию это указанный нами bcrypt, но я рекомендую указывать его вручную, поскольку базовый алгоритм в будущем может поменяться. Будет грустно, если при очередном обновлении версии PHP на сайте отвалится авторизация.
Для проверки корректности введённого пользователем пароля используется функция password_verify() :
Таким образом, хранить исходный пароль больше нет смысла.
Да, разные алгоритмы хеширования генерируют хеш разной длины, поэтому рекомендуется хранить хеш в поле с типом VARCHAR(255).
Алгоритмы MD5 и SHA1
Для хеширования паролей их использовать нельзя!