Door
Frans Piter Schaap
op 14-08-2012 14:35
gewijzigd op 14-08-2012 14:36
4.438 views
Volgens aardig wat website is de beste manier om wachtwoorden te beveiligen de 'crypt($wachtwoord)' methode. Deze encryptie schijnt veel sterker te zijn dan de hash beveiligingen (md5, sha1). Echter lukt het mij niet om de encrypted versie te controleren met de ingevulde waarde (in een login-scherm) aangezien de encryptie van laatstgenoemde steeds veranderd (logisch). Hoe kan je dit het beste toepassen?
Oftewel:
<?php
$password = $_POST['password'];
$db_pass; // Een uit de database gehaald encrypted wachtwoord (bijv. $1$tkiflmLd$N8px9zX4XL8mIkkcMlGss0);
if($password == $db_pass){
//login
}
?>
Haal nooit het wachtwoord uit de database, nergens voor nodig. Welke manier je ook gebruikt, je wilt het wachtwoord niet kunnen decrypten. Als je een wachtwoord wilt controleren gooi je er dezelfde encryptie/hashing overheen en de uitkomst daarvan vergelijk je met de waarde in je database. Zijn de waardes gelijk, dan klopt het en kan je de gebruiker inloggen.
Dat is wat ik bedoel, welke encryptie kan je er het beste overheen gooien. Want crypt($password) schijnt de beste te zijn, echter is deze niet gelijk. Hashing is vrij makkelijk te kraken. http://codahale.com/how-to-safely-store-a-password/
Na het lezen van crypt in de php manual blijkt dat inderdaad wel iets anders te werken dan ik zou verwachten. Volgens de manual kan je op de volgende manier het password controleren:
<?php
if (crypt($user_input, $hashed_password) == $hashed_password) {
echo "Password verified!";
}
?>
Waarbij $hashed_password dus de eerder aangemaakt hash is.
Dat bcrypt beter is komt niet zozeer door het hash algoritme, maar door de manier waarop ze het gebruiken. Zowel salting als het automatisch vertragen van brute force aanvallen is een sterk punt van deze functie.