Sout byvoeging tydens registrasie
Dus, jy weet reeds dat hashing deur
md5 'n onomkeerbare proses is en 'n hacker
wat toegang tot die hash kry, sal nie daardeur
die wagwoord kan verkry nie.
Eintlik is hierdie stelling nie heeltemal waar nie - tans het slegte hackers biblioteke van hashes van gewilde en minder gewilde wagwoorde saamgestel, en enige dwaas kan 'n wagwoord uitvind deur bloot die hash daarvan te gaan soek op Google.
Dit gaan oor redelik eenvoudige, gewilde wagwoorde.
Soek byvoorbeeld die hash 827ccb0eea8a706c4c34a16891f84e7b
op Google, en jy sal dadelik in die soekresultate sien dat dit
die wagwoord '12345' is.
Hashes van redelik ingewikkelde wagwoorde kan nie so uitgevind word nie (probeer gerus).
Jy mag vra wat die probleem dan is - laat ons almal met ingewikkelde wagwoorde registreer. Daar is eger 'n probleem - die meeste gebruikers dink nie na oor die veiligheid van hul data nie en mag redelik eenvoudige wagwoorde invoer.
Ons kan tydens registrasie hulle dwing om langer
wagwoorde te bedink, deur byvoorbeeld die minimum
aantal karakters tot 6
of 8 te beperk, maar steeds sal daar
wagwoorde soos '123456' of '12345678' voorkom.
Ons kan natuurlik 'n slim algoritme bedink om die wagwoord se kompleksiteit te toets, maar daar is 'n ander oplossing.
Die kern van hierdie oplossing is: wagwoorde moet gesout word. Sout is 'n spesiale ewekansige string wat by die wagwoord gevoeg word tydens registrasie en die hash sal nie bereken word van die gewone wagwoord af nie, maar van die string sout+wagwoord, met ander woorde van die gesoute wagwoord af.
So tydens registrasie sal jy iets soos die volgende doen:
<?php
$salt = '1sJg3hfdf'; // sout - 'n ingewikkelde ewekansige string
$password = md5($salt . $_POST['password']); // omskep die wagwoord na 'n gesoute hash
?>
Terselfdertyd sal die sout verskillend wees vir elke gebruiker, dit moet ewekansig gegenereer word op die oomblik van registrasie.
Hier is 'n klaargemaakte funksie wat dit sal doen:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lengte van die sout
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter uit die ASCII-tabel
}
return $salt;
}
?>
Met behulp van hierdie funksie kan ons ons kode soos volg herskryf:
<?php
$salt = generateSalt(); // sout
$password = md5($salt . $_POST['password']); // gesoute wagwoord
?>
Laat ek dit herhaal: dit was die veranderinge tydens registrasie - in die databasis stoor ons nie net die hash van die wagwoord nie, maar die hash van die gesoute wagwoord.
Dit is nog nie alles nie: in die tabel met gebruikers, benewens
die velde login en password, moet ons
ook 'n veld salt byvoeg, waarin
ons die sout van elke gebruiker sal stoor.
Implementeer die bogenoemde registrasie met 'n gesoute wagwoord.