Как я могу дешифровать хеш-пароль в PHP?

Мне нужно расшифровать пароль. Пароль зашифрован с помощью функции 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? Или я должен изменить свой метод шифрования? Или что еще?

Ответ 1

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-инъекций. См. this SO ответ о том, как предотвратить SQL-инъекцию.

Ответ 2

Мне нужно расшифровать пароль. Пароль зашифрован с помощью 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 КБ.

Ответ 3

Кажется, кто-то наконец создал script, чтобы расшифровать пароль_hash. checkout this one: 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";
}
?>

Ответ 4

Пароли не могут быть дешифрованы, так как это сделает уязвимость для пользователей. Таким образом, вы можете просто использовать метод password_verify() для сравнения паролей.

if(password_verify($upass, $userRow['user_pass'])){
     //code for redirecting to login screen }

где $upass - пароль, введенный пользователем, а $userRow['user_pass'] - поле user_pass в базе данных, которое зашифровывается функцией password_hash().