Vérifiez la Connexion avec Bcrypt Mot de passe
J'ai un site où je suis de la programmation d'un enregistrement/système de connexion avec bcrypt. J'ai inséré les détails de l'inscription avec le hachage de mot de passe dans la base de données. Mon problème est comment authentifier l'utilisateur à l'aide de ce mot de passe haché. Ci-dessous les codes que j'ai utilisé:
Action d'enregistrement:
<? ob_start();//Start buffer output ?>
<html>
<head>
<title>MySite: Registration Action</title>
</head>
<font face="arial">
<?php
session_start();
if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"])
{
//echo "Correct Code Entered";
//Do req stuff
$host="host"; //Host name
$username="username"; //Mysql username
$password="password"; //Mysql password
$db_name="db"; //Database name
$tbl_name="tbl"; //Table name
//Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
//Get values from form
$myusername=mysql_real_escape_string($_POST['myusername']);
$mypassword=mysql_real_escape_string($_POST['mypassword']);
$myemail=mysql_real_escape_string($_POST['myemail']);
$mysecrquest=mysql_real_escape_string($_POST['mysecrquest']);
$mysecransw=mysql_real_escape_string($_POST['mysecransw']);
$mypassword_rep=mysql_real_escape_string($_POST['mypassword_rep']);
$myemail_rep=mysql_real_escape_string($_POST['myemail_rep']);
$mysecransw_rep=mysql_real_escape_string($_POST['mysecransw_rep']);
$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22);
$encpass = crypt($mypassword, $salt);
//validate input
if (( !empty($myusername) && !empty($mypassword) && !empty($myemail) && !empty($mysecrquest) && !empty($mysecransw) )
&& (($mypassword_rep==$mypassword)&&($myemail_rep==$myemail)&&($mysecransw_rep==$mysecransw)))
{
//Insert data into mysql
$sql="INSERT INTO $tbl_name(username, salt, password, email, secrquest, secransw)VALUES('$myusername', '$salt', '$encpass', '$myemail', '$mysecrquest',
'$mysecransw')";
$result=mysql_query($sql);
//if successfully insert data into database, displays message "Successful".
if($result){
echo "<center><font color='green'>Congratulations! Your registration was Successful</font></center>";
echo "<BR>";
echo "<center><a href='somepage.php'>Somepage</a></center>";
}
}
else {
echo "<center><font color='red'>You have one or more invalid entries: Your Registration was not successful</font></center>";
echo "<br>";
echo "<center><a href='regpage.php'>Back</a></center>";
}
}
else {
echo "<center><font color='red'>Wrong Captcha: Your Registration was not successful</font></center>";
echo "<br>";
echo "<center><a href='regpage.php'>Back</a></center>";
}
?>
<?php
//close connection
//mysql_close();
?>
</font>
</html>
<? ob_flush();//Flush buffer output ?>
Action Login:
<? ob_start();//Start buffer output ?>
<html>
<head>
<title>MySite: Login Action</title>
</head>
<font face="arial">
<?php
session_start();
if(isset($_POST["captcha"])&&$_POST["captcha"]!=""&&$_SESSION["code"]==$_POST["captcha"])
{
//echo "<font color='green'>Correct Code Entered</font>";
//Do req stuff
$host="host"; //Host name
$username="username"; //Mysql username
$password="password"; //Mysql password
$db_name="db"; //Database name
$tbl_name="tblx"; //Table name
$tbl_name2="tbl"; //Table name 2
//Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
//Get values from form
$myusername=mysql_real_escape_string($_POST['myusername']);
$mypassword=mysql_real_escape_string($_POST['mypassword']);
//Validate the login
$sql2="SELECT * FROM $tbl_name2 WHERE username='$myusername'";
$result2=mysql_query($sql2);
$row=mysql_fetch_assoc($result2);
//$count=mysql_num_rows($result2);
//If result matched $myusername and $mypassword, table row must be 1 row
//if($count==1)
//$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22);
$encpass = crypt($mypassword, $salt);
if ($encpass == $row['password'])
{
session_start();
$_SESSION['myusername'] = $myusername;
header ("Location: memberspage.php");
}
else {
echo "<center><font color='red'>Invalid Login Details. Not Logged In.</font></center>";
echo "<br>";
echo "<center><font color='red'>Please go back and try again.</font></center>";
echo "<br>";
echo "<center><a href='loginpage.php'>Back</a></center>";
}
}
else {
echo "<center><font color='red'>Wrong Captcha. Not Logged In.</font></center>";
echo "<br>";
echo "<center><font color='red'>Please go back and try again.</font></center>";
echo "<br>";
echo "<center><a href='loginpage.php'>Back</a></center>";
}
?>
<?php
//close connection
//mysql_close();
?>
</font>
</html>
<? ob_flush();//Flush buffer output ?>
Toute aide est appréciée. Merci.
double possible de bcrypt et généré de façon aléatoire des sels
Première:
hors sujet, mais votre code ressemble horriblement out-of-date, ... il est à noter que la
Et:
Merci à vous tous pour les observations... 1. Je vais intégrer le css pour remplacer les codes obsolètes dès que je peux, 2. Je suis actuellement en apprentissage de l'AOP, et reprendrait-il trop dès que je peux, 3. Je vais intégrer de PHP dans password_hash() fonction dès que mon hôte prend en charge (essayé mais j'ai reçu un "undefined function" d'erreur). Merci.
Première:
<font face="arial">
est obsolète et très mauvais depuis 1999 (!!).hors sujet, mais votre code ressemble horriblement out-of-date, ... il est à noter que la
<center>
et <font>
balises sont obsolète en HTML (CSS), comme le sont les mysql_xxx()
des fonctions PHP (utiliser PDO à la place).Et:
mysql_query
est également extrêmement dépassée.Merci à vous tous pour les observations... 1. Je vais intégrer le css pour remplacer les codes obsolètes dès que je peux, 2. Je suis actuellement en apprentissage de l'AOP, et reprendrait-il trop dès que je peux, 3. Je vais intégrer de PHP dans password_hash() fonction dès que mon hôte prend en charge (essayé mais j'ai reçu un "undefined function" d'erreur). Merci.
OriginalL'auteur adeoba | 2013-07-22
Vous devez vous connecter pour publier un commentaire.
Je suggère l'utilisation de PHP (
password_xxx()
fonctions. Ce sont explicitement conçu pour le rendre facile de travailler avec des mots de passe hachés avec bcrypt. Vous n'avez pas besoin de penser à autre chose que d'appelerpassword_verify()
pour vérifier une tentative de connexion etpassword_hash()
lors de la création d'un compte. Facile.C'est de loin le moyen le plus facile de travailler avec des mots de passe en PHP.
Noter que ces fonctions ne sont disponibles que dans la dernière version de PHP (v5.5). Il y a cependant un la compatibilité descendante de la bibliothèque, vous pouvez télécharger qui leur permet de travailler exactement le même dans toutes les versions prises en charge de PHP (c'est à dire v5.3 et 5.4).
Espère que ça aide.
password_compat
bibliothèque est pour php >= 5.3.7Oui, merci. Il aide.
Pour Java, vous pouvez utiliser: <code> BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); if (bCryptPasswordEncoder.correspond à(rawPassword, encodedPassword) { ... } <code>
OriginalL'auteur Spudley
Avec tous le respect que Votre code est plein d'erreurs, la vétusté des trucs et en conséquence très très fragile. Je voudrais bien vouloir vous recommandons de recourir à un professionnel, testé et propre script de connexion et pas de poursuivre avec votre code.
$salt = '$2a$18$' . substr(md5(uniqid(rand(), true)), 0, 22);
est totalement désuet et n'est pas sûr de toute façon plus.$2a
-algorithmns sont "faibles" algorithmns, même lorsque salé.mysql_
est obsolète et ne devrait jamais être utilisé.<font face="arial">
est périmée depuis 1999, le reste de votre code peut également être à partir de ce moment.Sooo, en conséquence: jetez un oeil sur le site officiel de PHP mot de passe compat bibliothèque ici: https://github.com/ircmaxell/password_compat et de construire votre système de connexion avec le sexy, des fonctions simples. Ou utiliser un établi le système de connexion, comme celle-ci: https://github.com/panique/php-login
OriginalL'auteur Sliq
bcrypt utilise un par rangée de sel ce qui signifie que vous devez vérifier ce qui est là, plutôt que de générer un nouveau sel et la comparaison.
pour plus d'info Comment utilisez-vous bcrypt pour le hachage des mots de passe en PHP?
OriginalL'auteur exussum