Hallo,

Ik heb een registratieformulier aangemaakt, en gebruikers kunnen hun gebruikersnaam en wachtwoord gewoon opgeven. En deze worden dan in de mysql database opgeslagen.

Ik gebruik niet meer dan volgende regel hiervoor.
mysql_query("INSERT INTO users (username, password) VALUES ('$username','$password')");

Maar de wachtwoorden worden gewoon als tekst opgeslagen in mijn mysql tabel(varchar). Hoe kan ik dit beter beveiligen zodat het wachtwoord gehashed word. En hoe unhash in het terug zodat ze nog wel steeds kunnen aanmelden?

Thanks!
http://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/

Lees dat a.u.b.

Je kunt het gebruiken vanaf PHP 5.3.7, tot PHP 5.5.0 moet je wel de password_compat files includen zoals je gelezen hebt.

Lees daarna a.u.b. ook nog http://www.sitepoint.com/series/avoid-the-mysql-extension/

Ik weet dat veel lezen minder leuk klinkt dan wat programmeren, debuggen en een resultaat krijgen waar je een goed gevoel over kan hebben. Maar het geeft een nog beter gevoel wanneer je weet dat je code hebt geschreven die net en veilig is!
Hmm kan het ook zonder een extra api te installeren? Ik kan namelijk niets op de server zelf veranderen.
Welke PHP versie draai je?
Waarschijnlijk hoef je geen extra API te installeren sinds mysqli sinds PHP 5 expliciet uitgezet moet worden tijdens compilatie. Probeer een connectie te maken, als PHP niet zeurt dat de MySQLi class niet beschikbaar is zit je goed.

password_* functies zijn niet beschikbaar, maar zijn toch alleen maar wrapper functies voor functionaliteit die beschikbaar is sinds PHP 5.3.7.
Dus inplaats van password_* functies geschreven in C zul je password_* functies geschreven in PHP moeten gebruiken door een bestand te includen op de pagina's waar je de functies nodig hebt. Zie de notitie over "password_compat" in dat artikel.

Heb even wat gepruld maar krijg het niet klaar met die password_compat? (tenzij je me op de juiste weg kan helpen)
Kan het ook met crypt? dat ben ik ook vaak tegengekomen?
je kan ook gewoon standaard MD5 gebruiken alleen dan moet je wel salt en paper gebruiken.


<?php

$salt = "a:@:ER:$:TFFG:$1234:$$$EaDS:bv:";
$pepper = "15244145464:fdsasfdfdsafdfd:ERDSDE$#$DDSFD:DFDFDAWA@:@$$!!@#:";
mysqli_query($connect,"INSERT INTO users (username, password) VALUES ('".mysqli_real_escape_string($username)."',
'".mysqli_real_escape_string(md5(md5($salt.$_POST['pass'].$pepper)))."'')");
?>

in principe is dit veilig zat.
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$test = crypt("$password", $hash);

mysql_query("INSERT INTO users (username, password) VALUES ('$username','$test')");

Dit heb ik in mijn registratiepagina staan, zo komt hij wel in onleesbare tekst te staan in de tabel. Maar nu weet ik niet goed hoe ik mijn loginpagina moet aanpassen zodat ik hem daar kan uncrypten.

<?php
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

mysql_connect("localhost", "root","usbw") or die(mysql_error());
mysql_select_db("first_db") or die("Cannot connect to database");
$query = mysql_query("SELECT * from users WHERE username='$username'");
$exists = mysql_num_rows($query);
$table_users = "";
$table_password = "";
if($exists > 0) //IF there are no returning rows or no existing username
{
while($row = mysql_fetch_assoc($query))
{
$table_users = $row['username'];
$table_password = $row['password'];
}
if(($username == $table_users) && ($password == $table_password))
{
if($password == $table_password)
{
$_SESSION['user'] = $username;
header("location: home.php");
}

}
else
{
Print '<script>alert("Incorrect Password!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}

}
else
{
Print '<script>alert("Incorrect Username!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}
?>

Het schijnt zo te zijn hoe vaker je een md5() hash weer hashed, dat de kans op een 'collission' groter is?
In ieder geval wordt het niet geadviseerd. Ikzelf ben ook een voorstander van password_hash(). Een salt is sowieso een goed idee om 'dictionairy-attacks' tegen te gaan.

Reageren