Tilføjelse af salt til registrering
Så du ved allerede, at hashing via
md5 er en irreversibel proces, og en hacker
der får adgang til hashen, ikke vil være i stand til at få
adgangskoden ud fra denne hash.
Faktisk er denne påstand ikke helt sand - i dag har onde hackere samlet biblioteker af hashes fra populære og mindre populære adgangskoder og enhver tåbe kan knække adgangskoden ved simpelthen at søge efter dens hash.
Det drejer sig om tilstrækkeligt simple, populære adgangskoder.
Søg for eksempel efter hashen 827ccb0eea8a706c4c34a16891f84e7b
og du vil straks i søgeresultaterne se, at det er
adgangskoden '12345'.
Hashes af tilstrækkeligt komplekse adgangskoder kan på denne måde ikke knækkes (prøv selv).
Du kan spørge, hvad problemet så er - lad os alle registrere os med komplekse adgangskoder. Der er dog et problem - de fleste brugere tænker ikke over sikkerheden af deres data og kan indtaste tilstrækkeligt simple adgangskoder.
Vi kan ved registrering tvinge dem til at finde på
længere adgangskoder ved f.eks. at begrænse
det minimale antal tegn til 6
eller 8, men alligevel vil der dukke
adgangskoder op som '123456' eller '12345678'.
Man kan selvfølgelig finde på en smartere algoritme til at kontrollere adgangskodens kompleksitet, men der er en anden løsning.
Essensen af denne løsning er sådan: adgangskoder skal salte. Salt er en speciel tilfældig streng, der vil blive tilføjet til adgangskoden ved registrering, og hashen vil blive beregnet ikke fra den simple adgangskode, men fra strengen salt+adgangskode, dvs. fra den saltede adgangskode.
Det vil sige, at ved registrering vil du gøre noget i stil med dette:
<?php
$salt = '1sJg3hfdf'; // salt - en kompleks tilfældig streng
$password = md5($salt . $_POST['password']); // omdanner adgangskoden til en salted hash
?>
Saltet vil være forskelligt for hver bruger, det skal genereres tilfældigt øjeblikket for registrering.
Her er en færdig funktion, der gør dette:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // længden af saltet
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // et tegn fra ASCII-tabellen
}
return $salt;
}
?>
Med denne funktion kan vi omskrive vores kode sådan her:
<?php
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // salted adgangskode
?>
Jeg gentager: dette var ændringer ved registrering - i databasen gemmer vi ikke bare hashen af adgangskoden, men hashen af den saltede adgangskode.
Det er ikke alt: i bruger-tabellen foruden
felterne login og password skal der
også være et felt salt, hvor
vi vil gemme hver brugers salt.
Implementer den ovenfor beskrevne registrering med saltet adgangskode.