Hogyan ellenőrizzem azt, hogy a régi jelszó megfelel-e az adatbázisban lévővel, sha512-vel?
Hali, nem nagyon tudom, hogy mi a gond, hiába próbálkozom, nem tudok rájönni.
a db_password az megfelelő, kiírja, azonban azt szeretném, hogyha a regisztrációnál használt jelszót írom be, akkor a db_password egyenlő legyen az oldpw-vel. Teszteltem, hogy kiírom echoval a kapott dolgokat, és akkor arra jöttem rá, hogy a db_password az megfelel, azonban az oldpw nem azt írja, amit szeretnék.
Kód:
if($_POST['editbutton']) {
$oldpw = stripslashes($mysqli->real_escape_string($_POST['oldpw']));
$newpw = stripslashes($mysqli->real_escape_string($_POST['newpw']));
$newpw = hash('sha512', $password);
$newpwconfirm = stripslashes($mysqli->real_escape_string($_POST['newpwconfirm']));
if ($stmt = $mysqli->prepare("SELECT password, salt FROM members WHERE email = ? LIMIT 1")) {
$stmt->bind_param('s', $email); // Bind "$email" to parameter.
$stmt->execute(); // Execute the prepared query.
$stmt->store_result();
// get variables from result.
$stmt->bind_result($db_password, $salt);
$stmt->fetch();
$oldpw_check = hash('sha512', $oldpw . $salt);
echo "$oldpw_check <br /> <br /> $db_password";
if ($db_password == $oldpw_check) {
$mysqli->query("UPDATE $table SET password = '$newpw' WHERE username = '$username]'");
echo 'Sikeres';
}
else {
echo 'Sikertelen';
}
}
}
echo " <h1>Szerkesztés</h1>";
echo '
<dl>
<form method="post" name="edit_form" id="third">
<label for="email"><strong><span class="blue">*</span>Régi jelszó:</strong></label>
<input name="oldpw" id="oldpw" type="password" size="20" />
<label for="subject"><strong><span class="blue">*</span>Új Jelszó:</strong></label>
<input type="password" name="newpw" id="password" size="20" />
<label for="subject"><strong><span class="blue">*</span>Új Jelszó ismétlése:</strong></label>
<input type="password" name="newpwconfirm" id="password" size="20" />
<br /><br />
<input type="submit" class="buttonSubmit" value="Ment" name="editbutton" onclick="editformhash(this.form, this.form.epw);" /><br />
</form>
</dl>';
$newpw = hash('sha512', $password);
$oldpw_check = hash('sha512', $oldpw . $salt);
szerintem regeléskor nem sóztad be (meg itt sem, jelszóváltáskor), viszont ellenőrzéskor sózottan hasonlítod össze.
Regisztráció kódja itt van, és van benne salt, amikor is betölti az adatbázisba, tehát ezért nem nagyon értem:
// Create a random salt
$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));
// Create salted password
$password = hash('sha512', $password . $random_salt);
$IP = $_SERVER['REMOTE_ADDR'];
// Insert the new user into the database
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt, REGDATE, BANNED, PERM, Tarsitas, Acode, IP, Activated) VALUES (?, ?, ?, ?, '$time',0,0,0,0,'$IP',0)")) {
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
új regisztrációval próbálkozol? ha nem, és a régivel próbálod, akkor elsőre ugye lefut a jelszóváltás, mert a $db_pass egyezik az $olpw_check-el, viszont salt nélküli kerül be db-be, ezek után már sosem fog egyezni.
ha mégsem ez a gond, akkor egyelőre nincs ötletem.
igen, tudom mi lenne ez, de azt mondom, hogy elsőre pedig lefut, és onnantól kezdve soha nem lesz jó.
Gondold végig:
Regisztrál, adatbázisba került a saltot használó jelszó, és a salt.
Meg akarja változtatni, az adatbázisból kiolvassa a (saltos) jelszót, és a saltot.
A megadott régi jelszót salttal együtt elkódolja
$oldpw_check = hash('sha512', $oldpw . $salt);
és ezt ellenőrzi az adatbázisban lévővel. if ($db_password == $oldpw_check)
Egyezik.
Elmenti az új jelszót, aminél nem sózod be -> $newpw = hash('sha512', $password);
Innentől kezdve az adatbázisban a salt nélküli van eltárolva.
Megint megváltoztatnád a jelszót: a db-ben levő (már) salt nélkülit az $oldpw_check-el, ami pedig használja a saltot. Soha többé nem fog egyezni.
Hogyan javíthatod ki?
Ha még nem tetted, akkor az új pw-hez is használd a saltot:
$newpw = hash('sha512', $password . $salt);
De így még adatbázisban a korrupt jelszavak vannak. Ezeket mondjuk kitörlöd, és csak új regisztrációkkal foglalkozol.
nézd meg, hogy a regnél generált random salt egyezik-e azzal ami bekerült adatbázisba (nem-e vágja le)
(stripslashes($mysqli->real_escape_string(..))
szerintem ez így semmit nem csinál, escapeli a spec karaktereket, majd kiszedi az escapet.)
Leváltottam most a sha512t sha1-re, és átírtam a random saltot, de ez sem egyezik, és ez jóval kisebb, tehát kifér: Reginél és jelszóváltásnál is ugyanazt a random saltot írtam most be.
$random_salt = uniqid(mt_rand(), true);
$newpw = sha1($random_salt.$password);
$newpwconfrim = sha1($random_salt.$newpwconfirm);
// hash the password with the unique salt.
$password = sha1($salt.$password);
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!