password hash geeft false aan
Ik heb een 'password_hash' functie gebruikt om mijn wachtwoord op te slaan in de db, en dus wanneer ik wil inloggen gebruik ik dus de 'password_verify' functie.
Alleen hij geeft dus aan dat het niet klopt. ik heb allebij de gegevens dus het ingevoerde wachtwoord door de gebruiker en de gehasde password die in de db staat allebei ge echo'd en ze kloppen waarom werkt dit niet dan?
please help :s
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$hash = $user['password'];
echo $_POST['password'] . ' ' . $hash;
if (password_verify($_POST['password'], $hash)) {
$_SESSION['user'] = $user; ?>
<script>
alert('blha')$(document).ready(function(){
$('#msgfield').css("background-color", "#888800");
$('#msgfield').html("Welcome back, <?=$user['screenname']?>.");
$('#msgfield').fadeIn('slow');
})
</script> <?php
}
else { ?>
<script>
$(document).ready(function(){
$('#msgfield').text("Incorrect password.");
$('#msgfield').fadeIn('slow');
});
</script> <?php
}
?>
$hash = $user['password'];
echo $_POST['password'] . ' ' . $hash;
if (password_verify($_POST['password'], $hash)) {
$_SESSION['user'] = $user; ?>
<script>
alert('blha')$(document).ready(function(){
$('#msgfield').css("background-color", "#888800");
$('#msgfield').html("Welcome back, <?=$user['screenname']?>.");
$('#msgfield').fadeIn('slow');
})
</script> <?php
}
else { ?>
<script>
$(document).ready(function(){
$('#msgfield').text("Incorrect password.");
$('#msgfield').fadeIn('slow');
});
</script> <?php
}
?>
Gewijzigd op 04/11/2014 11:29:11 door Mathieu Posthumus
Ik neem aan dat in $hash het versleutelde paswoord staat zoals je het uit de database haalt en dat in $_POST['password'] het onversleutelde paswoord staat zoals je het inleest vanuit het input veld ?
Wat geeft $hash?
Ik neem aan dat ze niet hetzelfde zijn.
Plaats de code van password_verify() eens.
Eddy E op 04/11/2014 11:46:43:
Plaats de code van password_verify() eens.
http://lxr.php.net/xref/PHP_5_6/ext/standard/password.c#273
https://github.com/ircmaxell/password_compat/blob/master/lib/password.php#L219
Anyway, var_dump() is iets fijner tijdens het debuggen. Het print dingen op verschillende regels...
Je hebt ons wel de code van de inloggen gegeven, maar niet de data die je via de echo weergeeft op het scherm. Wat wel handig is.
Ook de registratie code zou ik wel graag willen zien.
Gewijzigd op 04/11/2014 16:45:28 door Dos Moonen
Toevoeging op 04/11/2014 21:15:02:
En wat ik in mijn registratie heb staan is...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function register_user($user_data, $profile_data) {
global $con;
array_walk($user_data, 'array_sanitize');
array_walk($profile_data, 'array_sanitize');
$user_data['password'] = password_hash($user_data['password'], PASSWORD_BCRYPT);
$fields_user = implode(', ', array_keys($user_data));
$data_user = '\'' . implode('\', \'', $user_data) . '\'';
$fields_profile = implode(', ', array_keys($profile_data));
$data_profile = '\'' . implode('\', \'', $profile_data) . '\'';
mysqli_query($con, "INSERT INTO users($fields_user) VALUES ($data_user)");
mysqli_query($con, "INSERT INTO profile($fields_profile) VALUES ($data_profile)");
}
?>
function register_user($user_data, $profile_data) {
global $con;
array_walk($user_data, 'array_sanitize');
array_walk($profile_data, 'array_sanitize');
$user_data['password'] = password_hash($user_data['password'], PASSWORD_BCRYPT);
$fields_user = implode(', ', array_keys($user_data));
$data_user = '\'' . implode('\', \'', $user_data) . '\'';
$fields_profile = implode(', ', array_keys($profile_data));
$data_profile = '\'' . implode('\', \'', $profile_data) . '\'';
mysqli_query($con, "INSERT INTO users($fields_user) VALUES ($data_user)");
mysqli_query($con, "INSERT INTO profile($fields_profile) VALUES ($data_profile)");
}
?>
Het lijkt er dat op regel 7 $user_data['password'] niet meer 'password123' is.
Als $user_data['password'] aan het begin van de functie nog wel 'password123' dan wijzigt je functie array_sanitize() de waarde.
Dat betekend dat je tussen regels 2 en 4, en ook tussen regels 5 en 6 een var_dump($user_data) moet plaatsen en kijken wat de waarde is die je hashed. Als dat de waarde is die je invoert moet je login code werken.
PS. regels 15 en 16 zien er lelijk uit. Weet je van het bestaan van prepared statements af?
PPS. het $fields_* gedeelte vind ik prima, $data_* zou ik vervangen door x aantal vraagtekens gescheiden door komma's in combinatie met prepared statements.