Comment décrypter un hachage de mot de passe en PHP?

<!-Je dois déchiffrer un mot de passe. Le mot de passe est crypté avec la fonction password_hash.

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

maintenant, supposons que $crypted est stocké dans une base de données (il y a une table "users", avec des noms d'utilisateurs, des mots de passe, etc) et je dois faire un login: je dois voir si le mot de passe entré par l'utilisateur correspond au mot de passe crypté stocké dans la base de données.

C'est le code sql...

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

...mais $inputpassword n'est pas crypté, il n'est donc pas égal à ce qui est stocké dans le champ Mot de passe des utilisateurs de la table...

Donc, il y a une fonction pour déchiffrer après l'utilisation de password_hash? Ou dois-je changer ma méthode de chiffrement? Ou quoi d'autre?

10
demandé sur dariodp 2014-06-04 00:51:40

4 réponses

Bcrypt est un algorithme de hachage à Sens Unique, vous ne pouvez pas décrypter les hachages. Utilisez password_verify pour vérifier si un mot de passe correspond au hash stocké:

<?php
// See the password_hash() example to see where this came from.
$hash = 'y$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

dans votre cas, lancez la requête SQL en utilisant seulement le nom d'utilisateur:

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

et faire la validation du mot de passe en PHP en utilisant un code qui est similaire à l'exemple ci-dessus.

Edit: construire la requête de cette façon est très dangereux. Si vous n'échappez pas à l'entrée correctement, le code sera vulnérable aux attaques par injection SQL. Voir répondez donc à la question Comment prévenir L'injection de SQL.

16
répondu Gergo Erdosi 2017-05-23 12:32:26

j'ai besoin de décrypter un mot de passe. Le mot de passe est crypté avec password_hash fonction.

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

il n'est pas clair pour moi si vous avez besoin d' password_verify, ou vous essayez d'obtenir un accès non autorisé à l'application ou la base de données. D'autres ont parlé de password_verify, donc voici comment vous pouvez obtenir un accès non autorisé. De son ce qui les méchants souvent lorsqu'ils tentent d'accéder à un système.

tout d'abord, créez une liste de mots de passe en texte clair. Une liste de textes peut être trouvé dans un certain nombre d'endroits en raison des violations massives de données par des entreprises comme Adobe. Trier la liste et ensuite prendre les 10 000 ou 100 000 premiers ou plus.

Deuxièmement, créez une liste de mots de passe digérés. Simplement crypter ou de hacher le mot de passe. D'après le code ci-dessus, il ne semble pas qu'un sel soit utilisé (ou un sel fixe). Cela rend l'attaque très facile.

Troisième, pour chaque digéré mot de passe dans la liste, effectuez une sélection dans une tentative de trouver un utilisateur qui est à l'aide de le mot de passe:

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

quatrième, le profit.

Donc, plutôt que de choisir un utilisateur et essaye de changer leur mot de passe, le méchant choisit un mot de passe commun et tente de trouver un utilisateur qui l'utilise. Les chances sont sur le mauvais gars...

parce que le méchant fait ces choses, il vous faudrait laissez les utilisateurs choisir des mots de passe communs. Dans ce cas, jetez un coup d'oeil à ProCheck, EnFilter ou Hyppocrates (et al.). Ils sont filtrage des bibliothèques qui rejettent les mauvais mots de passe. ProCheck obtient une compression très élevée, et peut digérer des listes de mots de passe word de plusieurs millions dans un fichier de données de 30KB.

0
répondu jww 2017-02-02 09:10:49

il semble que quelqu'un a enfin créé un script pour décrypter password_hash. caisse: 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 = 'y$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
répondu Cholis 2017-09-23 16:16:54

les mots de passe ne peuvent pas être déchiffrés car will crée une vulnérabilité pour les utilisateurs. Ainsi, vous pouvez simplement utiliser password_verify() méthode pour comparer les mots de passe.

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

$upass est le mot de passe entré par l'utilisateur et $userRow['user_pass'] est le champ user_pass dans la base de données qui est crypté par password_hash() fonction.

0
répondu Ashish Joshi 2017-12-17 07:06:57