php password_verify ne fonctionne pas avec la base de données
Je suis à l'aide de php 5.4 avec cette rétro-compatibilité script: https://github.com/ircmaxell/password_compat/blob/master/lib/password.php
qui ne devrait pas grave, parce que je peux obtenir le hachage et la vérification des processus de travail dans ma fonction d'enregistrement:
$hash = password_hash($pass, PASSWORD_DEFAULT);
echo $pass;
echo $hash;
if( password_verify($pass,$hash) )
echo 'success';
else echo 'failure';
//success is always shown
//EXAMPLE INPUT
$pass = 'password';
//EXAMPLE OUTPUT
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSsuccess
mais chaque fois que j'essaie de stocker la valeur de hachage dans une base de données MySQL puis de la récupérer pour la fonction vérifier, il échoue toujours. Voici ma fonction de connexion:
function user_login( $mysqli, $email, $pass ){
$err_msg = 'login: '.$mysqli->error.' | '.$email;
if( $stmt = $mysqli->prepare('SELECT password FROM users WHERE email=?') ) :
if( !$stmt->bind_param('s', $email) ) log_sql_error( $err_msg );
if( !$stmt->execute() ) log_sql_error( $err_msg );
if( !$stmt->bind_result( $hash ) ) log_sql_error( $err_msg );
if( $stmt->fetch() === FALSE ) log_sql_error( $err_msg );
if( !$stmt->close() ) log_sql_error( $err_msg );
//I can see that these values are identical to the ones
//echoed out in the registration function
echo $pass;
echo $hash;
if( password_verify($pass,$hash) )
echo 'success';
else echo 'failure';
else : log_sql_error( $err_msg );
endif;
}
//failure is always shown
//EXAMPLE INPUT
$pass = 'password';
//EXAMPLE OUTPUT
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSfailure
Mon "mot de passe" de la colonne a ce type de données: VARCHAR(255) NOT NULL
Pas afficher les erreurs php, et la seule chose que je peux penser, c'est que la valeur de hachage n'est pas formaté de la même manière quand il s'agit de la base de données que lorsqu'il est allé, mais quand je reprends les valeurs, ils semblent être identiques.
Sinon, comment puis-je déboguer ce /quel est le problème avec mon code?
Grâce
Mise à JOUR:
Cela a sans doute quelque chose à voir avec le codage:
$hardcode_hash = '$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS';
echo $hash;
echo '<br/>';
echo $hardcode_hash;
echo '<br/>';
if( $hash == $hardcode_hash )
echo 'success';
else echo 'failure';
//OUTPUT
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS
failure
comment dois-je reformater le SQL de la valeur pour correspondre à la sortie de password_hash? Voici ce que j'ai essayé:
(string)$hash
utf8_encode($hash)
si je fais:
$hash = settype($hash,"string");
if($hash == $hardcode_hash)
retourne vrai, mais password_verify($pass, $hash)
renvoie toujours false
source d'informationauteur Cbas
Vous devez vous connecter pour publier un commentaire.
Trouvé le problème. quand j'ai fait cela:
imprimé 90, ce qui est étrange, car il n'y avait certainement pas d'espaces à la fin quand j'ai imprimé le succès ou l'échec de message, et le domaine a un varchar longueur de 255
J'ai ajouté cette ligne:
Et maintenant il fonctionne très bien.
Étrange, que personne d'autre ne semble avoir rencontré ce problème. Il y a des postes similaires sur password_verify, mais aucun d'eux ce type de conversion, ou la conversion de la matière:
php password_verify ne fonctionne pas
password_verify php correspondent pas
http://forums.phpfreaks.com/topic/283407-need-help-with-password-verify/
À l'aide de PHP 5.5 password_hash et password_verify fonction
Une chose qui me dérange, c'est ce qui empêche le code de compatibilité ascendante. Comment vais-je savoir que le hachage est de 60 caractères par défaut changements?
Juste pour référence future. J'ai eu le même problème avec les mots de passe de l'échec pour aucune raison. Quand j'ai pris un coup d'oeil plus proche, j'ai vu que le champ mot de passe dans la base de données n'a pas été assez grand pour stocker l'intégralité de hachage afin que certains caractères ont été coupées. Après l'augmentation de la taille de la base de données de terrain, il a parfaitement fonctionné.
J'ai eu le même problème que vous avec ça ne fonctionne pas, pour une raison quelconque, il semble pour aider à mettre l':
dans le code même si ma chaîne est déjà de 60 caractères.
J'ai eu le même problème et il n'a toujours pas de travail malgré les assurer de ma base de données, les colonnes de type varchar(255), que le hash de 60 caractères, et d'assurer mon encodage est UTF-8, tout le chemin à travers. Je suis assez nouveau à PHP et SQL donc je ne vais pas faire semblant de comprendre exactement pourquoi cela a fonctionné, mais j'ai réussi à régler le problème, alors j'espère que ce post aidera d'autres gens avec le même problème.
Il s'est avéré que la raison sous-jacente password_verify() n'était pas la vérification de mon hachages était parce que j'avais fait une déclaration qui a utilisé une procédure stockée précédemment dans le script sans aller chercher tous les résultats de la requête correctement à effacer la mémoire tampon, avant de fermer et de rouvrir la connexion pour effectuer la requête suivante. L'appel de next_result() sur le mysqli_link après la clôture de l'instruction assurez-vous que les résultats sont consommés.
En outre, j'ai été ensuite à l'aide d'une autre instruction préparée avec une procédure stockée pour faire l'insert pour le mot de passe, mais j'ai encore besoin de faire des appels à store_result() et free_result() même si aucun des ensembles de résultats ont été renvoyées de l'insert. Je suppose que la combinaison de ces choses était en train de corrompre mes données quelque part le long de la ligne, résultant en password_verify() pour retourner false en apparence identique et les tables de hachage.
Cette réponse était pour un problème différent, mais je l'ai trouvé très utile pour apprendre comment bien fermer préparées avec des procédures stockées.