it-swarm.com.de

Wie kann ich einen Passwort-Hash in PHP entschlüsseln?

Ich muss ein Passwort entschlüsseln. Das Passwort wird mit der Funktion password_hash verschlüsselt.

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);

Nehmen wir nun an, dass $ crypted in einer Datenbank gespeichert ist (es gibt eine "Benutzer" -Tabelle mit Benutzernamen, Passwörtern usw.) und ich muss mich anmelden: Ich muss sehen, ob das vom Benutzer eingegebene Passwort dem verschlüsselten Passwort entspricht in der Datenbank gespeichert.

Dies ist der SQL-Code ...

$sql_script = 'select * from USERS where username="'.$username.'" and password="'.$inputpassword.'"';

... aber $ inputpassword wird nicht verschlüsselt, also ist es nicht gleich dem, was im Passwortfeld der Tabellenbenutzer gespeichert ist ...

Gibt es also eine Funktion, die nach der Verwendung von password_hash entschlüsselt werden kann? Oder soll ich meine Verschlüsselungsmethode ändern? Oder was noch?

10
dariodp

Bcrypt ist ein Einweg-Hash-Algorithmus. Sie können Hashes nicht entschlüsseln. Verwenden Sie password_verify , um zu prüfen, ob ein Passwort mit dem gespeicherten Hash übereinstimmt:

<?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.';
}
?>

Führen Sie in Ihrem Fall die SQL-Abfrage nur mit dem Benutzernamen aus:

$sql_script = 'select * from USERS where username="'.$username.'"';

Führen Sie die Kennwortüberprüfung in PHP mit einem Code aus, der dem obigen Beispiel ähnelt.

Bearbeiten: Das Erstellen der Abfrage auf diese Weise ist sehr gefährlich. Wenn Sie die Eingabe nicht ordnungsgemäß entschlüsseln, ist der Code für SQL-Injection-Angriffe anfällig. Siehe this SO, um zu verhindern, wie SQL-Injection verhindert wird.

18
Gergo Erdosi

Ich muss ein Passwort entschlüsseln. Das Passwort wird mit .__ verschlüsselt. password_hash-Funktion.

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);

Es ist mir nicht klar, ob Sie password_verify benötigen, oder Sie versuchen, nicht autorisierten Zugriff auf die Anwendung oder Datenbank zu erlangen. Andere haben über password_verify gesprochen, so können Sie sich unautorisierten Zugriff verschaffen. Das ist, was Bösewichte oft tun, wenn sie versuchen, Zugang zu einem System zu erhalten.

Erstellen Sie zunächst eine Liste mit Klartextkennwörtern. Eine Klartextliste kann aufgrund der massiven Verstöße gegen Daten durch Unternehmen wie Adobe an verschiedenen Stellen gefunden werden. Sortieren Sie die Liste und nehmen Sie dann die obersten 10.000 oder 100.000.

Zweitens erstellen Sie eine Liste der verdauten Kennwörter. Verschlüsseln oder verschlüsseln Sie das Passwort einfach. Basierend auf Ihrem Code oben, sieht es nicht so aus, als würde ein Salz verwendet (oder es ist ein festes Salz). Dies macht den Angriff sehr einfach.

Drittens: Führen Sie für jedes verdaute Kennwort in der Liste eine Auswahl aus, um einen Benutzer zu finden, der das Kennwort verwendet:

$sql_script = 'select * from USERS where password="'.$digested_password.'"'

Viertens Gewinn.

Anstatt einen Benutzer auszuwählen und zu versuchen, sein Kennwort zu ändern, wählt der Bösewicht ein allgemeines Kennwort und versucht, einen Benutzer zu finden, der es verwendet. Wahrscheinlichkeiten sind auf der Seite des schlechten Kerls ...

Da der Bösewicht diese Dinge tut, müssten SienichtBenutzer gebräuchliche Passwörter wählen lassen. In diesem Fall werfen Sie einen Blick auf ProCheck, EnFilter oder Hyppocrates (ua). Sie filtern Bibliotheken, die falsche Kennwörter ablehnen. ProCheck erzielt eine sehr hohe Komprimierung und kann mehrere Millionen Word-Kennwortlisten in einer 30-KB-Datei speichern.

1
jww

Die Passwörter können nicht entschlüsselt werden, da dies eine Schwachstelle für Benutzer darstellt. Sie können also einfach die password_verify()-Methode verwenden, um die Kennwörter zu vergleichen.

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

dabei ist $upass das vom Benutzer eingegebene Passwort und $userRow['user_pass'] das Feld user_pass in der Datenbank, das mit der Funktion password_hash() verschlüsselt wird.

0
user8838403

es scheint, als hätte jemand endlich ein Skript zum Entschlüsseln von password_hash . erstellt. checkout: 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";
}
?>
0
Cholis

Verwenden Sie die Funktion password_verify ()

if (password_vertify($inputpassword, $row['password'])) {
  print "Logged in";
else {
    print "Password Incorrect";
}
0
user10693192