Tilsetning av salt i registrering
Så, du vet allerede at hashing via
md5 er en irreversibel prosess og en hacker
som får tilgang til hashen, ikke vil kunne få
frem passordet fra denne hashen.
Egentlig er ikke denne påstanden helt riktig - for tiden har onde hackere satt sammen biblioteker med hasher av populære og mindre populære passord og hvem som helst kan knekke passordet, bare ved å søke etter hashen på Google.
Det gjelder tilstrekkelig enkle, populære passord.
Søk for eksempel etter hashen 827ccb0eea8a706c4c34a16891f84e7b
og umiddelbart i søkeresultatene vil du se at det er
passordet '12345'.
Hasher av tilstrekkelig komplekse passord kan ikke knekkes på denne måten (prøv selv).
Du kan spørre, hva er da problemet - la oss alle registrere oss med komplekse passord. Det er imidlertid et problem - de fleste brukere tenker ikke på sikkerheten til sine data og kan oppgi ganske enkle passord.
Ved registrering kan vi tvinge dem til å finne på
lengre passord, ved for eksempel å begrense
minimum antall tegn til 6
eller 8, men likevel vil det dukke opp
passord som '123456' eller '12345678'.
Man kan selvfølgelig finne på en smartere algoritme for å sjekke passordets kompleksitet, men det finnes en annen løsning.
Kjernen i denne løsningen er dette: passord må salte. Salt er en spesiell tilfeldig streng, som vil bli lagt til passordet ved registrering og hashen vil da bli beregnet ikke fra det vanlige passordet, men fra strengen salt+passord, altså fra det salte passordet.
Det vil si at ved registrering vil du gjøre noe som dette:
<?php
$salt = '1sJg3hfdf'; // salt - en kompleks tilfeldig streng
$password = md5($salt . $_POST['password']); // konverterer passordet til en saltet hash
?>
Samtidig vil saltet være forskjellig for hver bruker, det må genereres tilfeldig ved registreringstidspunktet.
Her er en ferdig funksjon som gjør dette:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lengden på saltet
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // tegn fra ASCII-tabellen
}
return $salt;
}
?>
Med denne funksjonen kan vi omskrive koden vår slik:
<?php
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // saltet passord
?>
Jeg gjentar igjen, at dette var endringer ved registrering - i databasen lagrer vi ikke bare hashen av passordet, men hashen av det salte passordet.
Dette er ikke alt: i tabellen med brukere, i tillegg til
feltene login og password, må
vi lage et felt til salt, der
vi vil lagre saltet til hver bruker.
Implementer registreringen med saltet passord som beskrevet ovenfor.