Wachtwoorden opslaan
Freelance opdrachten, en nu?
Inhoudsopgave
Inleiding
Het opslaan van wachtwoorden is vaak een punt waar veel programmeurs een verkeerde keuze maken. In deze korte tutorial, behorende bij een reeks blogs over veiligheid, wil ik daarop dieper ingaan. top
Hoe het niet moet
In de blog Waarom zijn MD5 wachtwoorden slecht? wordt uigelegd waarom het opslaan als MD5 slecht is. top
Hoe het wel moet
Het opslaan van wachtwoorden kan natuurlijk op verschillende manieren. Crypting is misschien wel het beste middel hier tegen. Er zijn verschillende crypting methodes. Aangeraden is om hier gebruik te maken van een zogenaamde salt. Een salt is een string welke gebruikt wordt bij het decrypten van een wachtwoord.
Wanneer een gebruiker bijvoorbeeld inlogt wordt er een combinatie van het wachtwoord en de salt gemaakt. Wanneer deze overeen komt is het wachtwoord correct. Kijk bijvoorbeeld eens naar onderstaand script:
<?php
$username = 'Admin';
$password = 'gf45_gdf#4hg';
// Create a 256 bit (64 characters) long random salt
// Let's add 'something random' and the username
// to the salt as well for added security
$salt = hash('sha256', uniqid(mt_rand(), true) . 'something random' . strtolower($username));
// Prefix the password with the salt
$hash = $salt . $password;
// Hash the salted password a bunch of times
for ( $i = 0; $i < 100000; $i ++ ) {
$hash = hash('sha256', $hash);
}
// Prefix the hash with the salt so we can find it back later
$hash = $salt . $hash;
// Value:
// e31f453ab964ec17e1e68faacbb64f05bccceb179858b4c482c1b182ff1e440e
// f1e10feb5b86c6d367e4eb8f90f2cde5648a7db3df8526878f20a77eed00c703
?>
Code from http://alias.io/
Dit script maakt gebruik van crypting in combinatie met een salt. Omdat je weet dat de eerste 64 karakters de salt zijn kan je vervolgens achterhalen wat het wachtwoord zou moeten zijn:
<?php
$username = 'Admin';
$password = 'gf45_gdf#4hg';
$sql = '
SELECT
`hash`
FROM `users`
WHERE
`username` = "' . mysql_real_escape_string($username) . '"
LIMIT 1
;';
$r = mysql_fetch_assoc(mysql_query($sql));
// The first 64 characters of the hash is the salt
$salt = substr($r['hash'], 0, 64);
$hash = $salt . $password;
// Hash the password as we did before
for ( $i = 0; $i < 100000; $i ++ ) {
$hash = hash('sha256', $hash);
}
$hash = $salt . $hash;
if ( $hash == $r['hash'] ) {
// Ok!
}
?>
Code from http://alias.io/
top
Slot
Natuurlijk zijn er nog andere tips om zoveel veilig mogelijk te werken. Zorg er bijvoorbeeld voor dat er een logging aanwezig is. Kijk hoevaak iemand probeert in te loggen. En belangrijkste: beperk dit!.Zorg er ook voor dat sterke wachtwoorden verplicht zijn. Verwacht een bepaald aantal karakters zoals vreemde tekens en een cijfer.
Mocht je nog vragen hebben na deze korte tutorial kan je ze altijd hier stellen!
|