Ik ben een site aan het maken met geregistreerde gebruikers. Wachtwoordhashing had ik met sha1 gedaan, maar ik heb begrepen dat dat niet veilig genoeg is. Nu heb ik crypt() gebruikt met een random gegenereerde salt. Werkt prima, alleen....heel traag. Registreren, inloggen en wachtwoord veranderen duurt ruim 10 seconden. Ik lees dat crypt_blowfish slow hashing is, maar hoort het echt zo traag te zijn?

Hier mijn inlogscriptje:
<? php
// controle inloggegevens
$sql = "SELECT klantID, wachtwoord, voornaam, salt " .
"FROM tblKlant " .
"WHERE email = '" . mysql_real_escape_string($_POST["txtEmail"]) . "'";
$resultaat = mysql_query($sql);
if(mysql_num_rows($resultaat) > 0)
{
// e-mailadres gevonden. Wachtwoord controleren.
$rs = mysql_fetch_array($resultaat);
if($rs["wachtwoord"] == crypt(mysql_real_escape_string($_POST["txtPassword"]), $rs["salt"])) // wachtwoord juist
{
// session setten en redirect

}
else
{
// wachtwoord onjuist
$strErrInlog = "<span class=\"warning\">De combinatie van gebruikersnaam<br />en wachtwoord is niet juist.</span><br /><br />";
}
?>
@Dos: helemaal goed! Ik haal de salt nu niet meer apart op (en heb de mysql_real_escape_string verwijderd) en de vergelijking aangepast. Onderstaand script werkt nu prima.
@Willem: ik ga nog aan de gang met mysqli, maar dat is voor een nieuwe dag.

<?php
$sql = "SELECT klantID, wachtwoord, voornaam " .
"FROM tblKlant " .
"WHERE email = '" . mysql_real_escape_string($_POST["txtEmail"]) . "'";
$resultaat = mysql_query($sql);
if(mysql_num_rows($resultaat) > 0)
{
// e-mailadres gevonden. Wachtwoord controleren.
$rs = mysql_fetch_array($resultaat);
if($rs["wachtwoord"] == crypt($_POST["txtPassword"], $rs['wachtwoord'])) // wachtwoord juist
{
set session en redirect
}
else
{
// wachtwoord onjuist
$strErrInlog = "<span class=\"warning\">De combinatie van gebruikersnaam<br />en wachtwoord is niet juist.</span><br /><br />";
}
Als $rs["wachtwoord"] de in de database opgeslagen hash van het wachtwoord is, dan kan crypt($_POST["txtPassword"], $rs['wachtwoord']) (op regel 9 hierboven) toch nooit werken voor nieuwe wachtwoorden? Je krijgt dan $b == crypt($a, $b) als een kip-en-ei-probleem: de hash $b wordt bepaald door de salt, maar de salt $b is de hash $b. Of zie ik dat verkeerd?
@Ward
Dit is alleen om het wachtwoord te controleren. Een nieuw wachtwoord wordt gevormd door een random gegenereerde salt ($salt) en het ingevoerde wachtwoord: crypt($_POST["txtWachtwoord"], $salt)

Toevoeging op 05/08/2014 13:33:22:

@Dos: in dit geval staat dit wel in een query. Moet ik hier dan wel de mysql_real_escape_string rond $_POST["txtWachtwoord"] zetten?
Als het wachtwoord in de query gewoon de invoer van de bezoeker is moet je het altijd beveiligen. Maar als het al gecrypt of gehashed is dan is dat niet nodig.
"@Dos: in dit geval staat dit wel in een query. Moet ik hier dan wel de mysql_real_escape_string rond $_POST["txtWachtwoord"] zetten?"
Tijdens het registreren/wijzigen van je wachtwoord? Nee, het resultaat van crypt_blowfish bevat nooit iets dat mysql_real_escape_string() zal vervangen.

Reageren