Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash.
$password = 'examplepassword'; $crypted = password_hash($password, PASSWORD_DEFAULT);
Теперь давайте предположим, что $ crypted хранится в базе данных (есть таблица «users», с именами пользователей, паролями и т. Д.), И мне нужно сделать логин: я должен проверить, соответствует ли пароль, введенный пользователем, зашифрованным паролем хранящихся в базе данных.
Это код sql …
$sql_script = 'select * from USERS where username="'.$username.'" and password="'.$inputpassword.'"';
… но $ inputpassword не зашифрован, поэтому он не равен тому, что хранится в поле пароля пользователей таблицы …
Итак, есть функция для дешифрования после использования password_hash? Или я должен изменить свой метод шифрования? Или что еще?
Bcrypt – это алгоритм одностороннего хэширования, вы не можете расшифровывать хэши. Используйте password_verify, чтобы проверить, соответствует ли пароль сохраненному хешу:
<?php // See the password_hash() example to see where this came from. $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } ?>
В вашем случае запустите SQL-запрос, используя только имя пользователя:
$sql_script = 'select * from USERS where username="'.$username.'"';
И выполните проверку пароля в PHP, используя код, аналогичный приведенному выше примеру.
Изменить: Построение запроса таким образом очень опасно. Если вы не избежите ввода правильно, код будет уязвим для атак SQL-инъекций. См. Этот SO-ответ о том, как предотвратить SQL-инъекцию.
Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции password_hash.
$password = 'examplepassword'; $crypted = password_hash($password, PASSWORD_DEFAULT);
Мне это не понятно, если вам нужно password_verify
, или вы пытаетесь получить несанкционированный доступ к приложению или базе данных. Другие говорили о password_verify
, так вот как можно получить несанкционированный доступ. Его плохие парни часто делают, когда пытаются получить доступ к системе.
Сначала создайте список паролей с открытым текстом. Список простых текстовых сообщений можно найти в нескольких местах из-за серьезных нарушений данных от компаний, таких как Adobe. Сортируйте список, а затем возьмите верхние 10 000 или 100 000 или около того.
Во-вторых, создайте список переваренных паролей. Просто зашифруйте или хешите пароль. Основываясь на вашем коде выше, он не выглядит как соль используется (или ее фиксированная соль). Это делает атаку очень легкой.
В-третьих, для каждого переваренного пароля в списке выполните выбор в попытке найти пользователя, который использует пароль:
$sql_script = 'select * from USERS where password="'.$digested_password.'"'
В-четвертых, прибыль.
Таким образом, вместо того, чтобы выбирать пользователя и пытаться изменить пароль, плохой парень выбирает общий пароль и пытается найти пользователя, который его использует. Коэффициенты на стороне плохого парня …
Поскольку этот плохой парень делает это, вам не следует позволять пользователям выбирать общие пароли. В этом случае взгляните на ProCheck, EnFilter или Hyppocrates (и др.). Они фильтруют библиотеки, которые отклоняют плохие пароли. ProCheck обеспечивает очень высокое сжатие и может переваривать многомиллионные списки паролей слов в файл данных 30 КБ.
Пароли не могут быть дешифрованы, так как это сделает уязвимость для пользователей. Таким образом, вы можете просто использовать метод password_verify()
для сравнения паролей.
if(password_verify($upass, $userRow['user_pass'])){ //code for redirecting to login screen }
где $upass
– пароль, введенный пользователем, а $userRow['user_pass']
– это поле user_pass в базе данных, которое зашифровывается функцией password_hash()
.
похоже, что кто-то наконец создал скрипт для дешифрования пароля. Оформить заказ: https://pastebin.com/Sn19ShVX
<?php error_reporting(0); # Coded by L0c4lh34rtz - IndoXploit # \n -> linux # \r\n -> windows $list = explode("\n", file_get_contents($argv[1])); # change \n to \r\n if you're using windows # ------------------- # $hash = '$2y$10$BxO1iVD3HYjVO83NJ58VgeM4wNc7gd3gpggEV8OoHzB1dOCThBpb6'; # hash here, NB: use single quote (') , don't use double quote (") if(isset($argv[1])) { foreach($list as $wordlist) { print " [+]"; print (password_verify($wordlist, $hash)) ? "$hash -> $wordlist (OK)\n" : "$hash -> $wordlist (SALAH)\n"; } } else { print "usage: php ".$argv[0]." wordlist.txt\n"; } ?>