web-dev-qa-db-fra.com

Comment décrypter un mot de passe en PHP?

J'ai besoin de 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);

Supposons maintenant que $ crypted est stocké dans une base de données (il existe une table "utilisateurs", avec noms d'utilisateur, mots de passe, etc.) et que je dois me connecter: 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 de la table users ...

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

10
dariodp

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

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

Dans votre cas, exécutez la requête SQL en utilisant uniquement le nom d'utilisateur:

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

Et effectuez la validation du mot de passe dans PHP en utilisant un code similaire à l'exemple ci-dessus.

Edit: Construire la requête de cette manière est très dangereux. Si vous n'échappez pas correctement l'entrée, le code sera vulnérable aux attaques par injection SQL. Voir this SO réponse sur la façon d'empêcher l'injection SQL.

18
Gergo Erdosi

J'ai besoin de déchiffrer un mot de passe. Le mot de passe est crypté avec Fonction password_hash.

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

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

Commencez par créer une liste de mots de passe en texte brut. Une liste de textes en clair peut être trouvée à plusieurs endroits en raison des violations massives des données par des entreprises comme Adobe. Triez la liste puis prenez le top 10 000 ou 100 000 ou plus.

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

Troisièmement, pour chaque mot de passe digéré de la liste, effectuez une sélection pour tenter de trouver un utilisateur utilisant le mot de passe:

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

Quatrièmement, le profit.

Ainsi, plutôt que de choisir un utilisateur et d'essayer de renverser son mot de passe, le méchant choisit un mot de passe commun et tente de trouver un utilisateur qui l'utilise. Les chances sont du côté du méchant ...

Parce que le méchant fait ces choses, il vous incomberait de not permettre aux utilisateurs de choisir des mots de passe communs. Dans ce cas, jetez un coup d’œil à ProCheck, EnFilter ou Hyppocrates (et autres). Ils filtrent les bibliothèques qui rejettent les mauvais mots de passe. ProCheck réalise une compression très élevée et peut digérer des millions de listes de mots de passe Word dans un fichier de données de 30 Ko.

1
jww

Les mots de passe ne peuvent pas être déchiffrés car cela crée une vulnérabilité pour les utilisateurs. Donc, vous pouvez simplement utiliser la méthode password_verify() 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 saisi par l'utilisateur et $userRow['user_pass'] le champ user_pass de la base de données crypté par la fonction password_hash().

0
user8838403

il semble que quelqu'un ait finalement créé un script pour déchiffrer password_hash . le checkout celui-ci: 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