Druskos pridėjimas registracijoje
Taigi, jau žinote, kad maišymas naudojant
md5 - yra negrįžtamas procesas ir įsilaužėlis,
gavęs prieigą prie maišos, negalės gauti
iš šios maišos slaptažodžio.
Tiesą sakant, šis teiginys nėra visiškai teisingas - šiuo metu piktieji įsilaužėliai sudarė populiarių ir ne labai slaptažodžių maišų bibliotekas ir bet kuris kvailys gali atkurti slaptažodį, tiesiog paieškojęs jo maišos internete.
Kalba eina apie pakankamai paprastus, populiarius slaptažodžius.
Paieškokite, pavyzdžiui, maišos 827ccb0eea8a706c4c34a16891f84e7b
ir iškarto "Google" paieškoje pamatysite, kad tai
slaptažodis '12345'.
Pakankamai sudėtingų slaptažodžių maišos tokiu būdu neatkurti (pabandykite).
Galite paklausti, kokia tada problema - tegul visi mes registruojamės su sudėtingais slaptažodžiais. Tačiau yra problema - dauguma vartotojų negalvoja apie savo duomenų saugumą ir gali įvesti pakankamai paprastus slaptažodžius.
Mes registracijos metu galime priversti sugalvoti
ilgesnius slaptažodžius, apribodami, pavyzdžiui,
minimalų simbolių skaičių 6-iais
arba 8-iais, tačiau vis tiek atsiras
slaptažodžiai, pvz., '123456' ar '12345678'.
Žinoma, galima sugalvoti intelektualesnį algoritmą slaptažodžio sudėtingumui patikrinti, bet yra kitas sprendimas.
Šio sprendimo esmė tokia: slaptažodžius reikia pradruskinti. Druska - tai speciali atsitiktinė eilutė, kuri bus pridedama prie slaptažodžio registracijos metu ir maiša bus skaičiuojama ne nuo paprasto slaptažodžio, o nuo eilutės druska+slaptažodis, tai yra nuo pradruskinto slaptažodžio.
Tai yra, registracijos metu darysite kažką panašaus į tai:
<?php
$salt = '1sJg3hfdf'; // druska - sudėtinga atsitiktinė eilutė
$password = md5($salt . $_POST['password']); // paverčiame slaptažodį į pradruskintą maišą
?>
Be to, druska kiekvienam vartotojui bus skirtinga, ją reikia generuoti atsitiktinai registracijos momentu.
Štai paruošta funkcija, kuri tai padarys:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // druskos ilgis
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // simbolis iš ASCII lentelės
}
return $salt;
}
?>
Naudodami šią funkciją galime perrašyti savo kodą štai taip:
<?php
$salt = generateSalt(); // druska
$password = md5($salt . $_POST['password']); // pradruskintas slaptažodis
?>
Dar kartą pakartosiu, kad tai buvo pakeitimai registracijos metu - į DB išsaugome ne tik slaptažodžio maišą, o pradruskinto slaptažodžio maišą.
Tai dar ne viskas: vartotojų lentelėje, be
laukelio login ir password, reikia
sukurti ir laukelį salt, kuriame
saugosime kiekvieno vartotojo druską.
Įgyvendinkite aukščiau aprašytą registraciją su pradruskintu slaptažodžiu.