Как я могу дешифровать хеш-пароль в 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()
.