Só hozzáadása a regisztrációhoz
Tehát, már tudod, hogy a
md5 hash-elés visszafordíthatatlan folyamat, és egy hacker,
aki hozzáfér a hash-hez, nem tudja visszanyerni
belőle a jelszót.
Valójában ez az állítás nem teljesen igaz - jelenleg a rosszindulatú hackerek összeállítottak népszerű és kevésbé népszerű jelszavak hash könyvtárait és bárki képes kitalálni a jelszót, egyszerűen rákeresve a hash-ére.
Ez elég egyszerű, népszerű jelszavakra vonatkozik.
Keress rá például a 827ccb0eea8a706c4c34a16891f84e7b hash-re
és azonnal a Google keresőben látni fogod, hogy ez
a '12345' jelszó.
Az elég bonyolult jelszavak hash-eit ilyen módon nem lehet kitalálni (próbáld ki).
Kérdezheted, hogy akkor mi a probléma - mindannyian regisztráljunk bonyolult jelszavakkal. Van azonban egy probléma - a legtöbb felhasználó nem gondol adatai biztonságára és elég egyszerű jelszavakat használhat.
A regisztrációnál kényszeríthetjük őket, hogy hosszabb
jelszavakat találjanak ki, például korlátozva
a minimális karakter számot 6
vagy 8, de így is előfordulnak
'123456' vagy '12345678' típusú jelszavak.
Lehetne persze, okosabb algoritmust kitalálni a jelszó bonyolultságának ellenőrzésére, de van más megoldás is.
Ennek a megoldásnak a lényege: a jelszavakat meg kell sózni. A só egy speciális véletlenszerű string, ami a regisztrációnál hozzáadódik a jelszóhoz, és a hash nem a sima jelszóról, hanem a só+jelszó stringről, azaz a sózott jelszóról számítódik ki.
Tehát a regisztrációnál valami ilyesmit kell csinálni:
<?php
$salt = '1sJg3hfdf'; // só - bonyolult véletlenszerű string
$password = md5($salt . $_POST['password']); // átalakítjuk a jelszót sózott hash-é
?>
Ebben az esetben a só minden felhasználó esetében más lesz, véletlenszerűen kell generálni a regisztráció pillanatában.
Itt egy kész függvény, amely ezt megteszi:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // a só hossza
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter az ASCII-táblából
}
return $salt;
}
?>
Ezzel a függvénnyel így írhatjuk át a kódunkat:
<?php
$salt = generateSalt(); // só
$password = md5($salt . $_POST['password']); // sózott jelszó
?>
Ismétlem, ezek a regisztrációnál történtek - az adatbázisban nem egyszerűen a jelszó hash-ét tároljuk, hanem a sózott jelszó hash-ét.
És ez még nem minden: a felhasználók táblájában a
login és password mezők mellett
kell egy salt mező is, amelyben
minden felhasználó sóját tároljuk.
Valósítsa meg a fent leírt sózott jelszavas regisztrációt.