Att lägga till salt i registreringen
Så, du vet redan att hashning via
md5 är en irreversibel process och en hackare
som får tillgång till hashen inte kommer att kunna få
lösenordet från denna hash.
Egentligen är detta påstående inte helt sant - för närvarande har elaka hackare sammanställt bibliotek med hashar av populära och mindre populära lösenord och vilken dumbom som helst kan knäcka ett lösenord genom att helt enkelt googla dess hash.
Det handlar om tillräckligt enkla, populära lösenord.
Googla till exempel hashen 827ccb0eea8a706c4c34a16891f84e7b
och omedelbart i sökresultaten kommer du att se att det är
lösenordet '12345'.
Hashar av tillräckligt komplexa lösenord kan inte knäckas på detta sätt (försök).
Du kanske frågar, vad är problemet då - låt oss alla registrera oss med komplexa lösenord. Det finns dock ett problem - de flesta användare tänker inte på säkerheten för sina data och kan ange ganska enkla lösenord.
Vi kan vid registrering tvinga dem att komma på
längre lösenord genom att begränsa, till exempel,
minsta antalet tecken till 6
eller 8, men ändå kommer lösenord
som '123456' eller '12345678' att dyka upp.
Man kan förstås komma på en smartare algoritm för att kontrollera lösenordets komplexitet, men det finns en annan lösning.
Kärnan i denna lösning är: lösenord måste saltas. Salt är en speciell slumpmässig sträng som kommer att läggas till lösenordet vid registrering och hashen kommer att beräknas inte från det vanliga lösenordet, utan från strängen salt+lösenord, det vill säga från det saltade lösenordet.
Det vill säga vid registrering kommer du att göra något i stil med detta:
<?php
$salt = '1sJg3hfdf'; // salt - en komplex slumpmässig sträng
$password = md5($salt . $_POST['password']); // omvandlar lösenordet till en saltad hash
?>
Samtidigt kommer saltet att vara olika för varje användare, det måste genereras slumpmässigt vid registreringstillfället.
Här är en färdig funktion som gör detta:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // saltets längd
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ett tecken från ASCII-tabellen
}
return $salt;
}
?>
Med denna funktion kan vi skriva om vår kod så här:
<?php
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // saltat lösenord
?>
Jag upprepar, att detta var ändringar vid registrering - i databasen sparar vi inte bara hashen av lösenordet, utan hashen av det saltade lösenordet.
Det är inte allt: i tabellen med användare förutom
fälten login och password behöver
vi skapa ytterligare ett fält salt, där
vi kommer att lagra varje användares salt.
Implementera registrering med saltat lösenord som beskrivits ovan.