J'utilise sha256 pour chiffrer le mot de passe. Je peux enregistrer le mot de passe crypté sha256 dans mysql. Mais je ne peux pas me connecter avec la même clause.
Insérer le code:
<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";
Sélectionnez le code:
<?php
error_reporting(E_ALL ^ E_NOTICE);
@mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
@mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
//get user input
$username = $_POST['username'];
$ppasscode = $_POST['ppasscode'];
//$passcodeen = hash('sha256', $ppasscode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
//get session value from mysql
$query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());
Y a-t-il quelque chose qui ne va pas? Je suis très confus. Merci.
Serait-ce une faute de frappe? (deux ps dans ppasscode, prévu?)
$_POST['ppasscode'];
Je voudrais m'assurer et faire:
print_r($_POST);
et assurez-vous que les données y sont exactes, puis indiquez à quoi elles devraient ressembler:
echo hash('sha256', $_POST['ppasscode']);
Comparez cette sortie à ce que vous avez dans la base de données (manuellement). En faisant cela, vous explorez vos points d'échec possibles:
Tout d'abord, sha256 est un algorithme de hachage, pas un type de cryptage. Un cryptage nécessiterait un moyen de décrypter les informations à leur valeur d'origine (collisions mises à part).
En regardant votre code, il semble que cela devrait fonctionner si vous fournissez le paramètre correct.
Essayez d’abord d’utiliser une chaîne littérale dans votre code et vérifiez sa validité au lieu d’utiliser la variable $_POST[]
.
Essayez de déplacer la comparaison de la requête de la base de données vers le code (obtenez le hachage pour l'utilisateur donné et comparez-le au hachage que vous venez de calculer)
Mais surtout, avant de déployer cela de manière publique, n'oubliez pas de nettoyer vos entrées. Ne permettez pas à du SQL arbitraire d'être inséré dans les requêtes. La meilleure idée serait d'utiliser des requêtes paramétrées.
Vous devez utiliser un hachage adaptatif comme http://en.wikipedia.org/wiki/Bcrypt pour sécuriser les mots de passe
La première chose à faire est de comparer les fonctions de SHA et d’opter pour l’algorithme le plus sûr compatible avec votre langage de programmation (PHP).
Vous pouvez ensuite consulter la documentation officielle pour implémenter la fonction hash()
qui reçoit en argument l’algorithme de cryptage que vous avez choisi et le mot de passe brut.
sha256 => 64 bits
sha384 => 96 bits
sha512 => 128 bits
Plus l'algorithme de cryptage est sécurisé, plus le coût en termes de temps de cryptage et de décryptage côté serveur est élevé.
$hashedPassword = hash('sha256', $password);
Une meilleure solution consiste simplement à utiliser le script de compatibilité excellent d'Anthony Ferrara:
https://github.com/ircmaxell/password_compat
S'il vous plaît, et aussi, lors de la vérification du mot de passe, ajoutez toujours un moyen (de préférence asynchrone, afin que cela n'affecte pas le processus de vérification des attaques par horloge) pour mettre à jour le hachage si nécessaire.