A jelszavak tárolása és kezelése a biztonság egyik legfontosabb része minden rendszerben, legyen szó weboldalról, alkalmazásról vagy bármilyen egyéb platformról, amely felhasználói adatokat kezel. A jelszó hash-elése egy rendkívül fontos technika a személyes adatok védelmére, azonban a sózás (salt) alkalmazása segít még tovább erősíteni a biztonságot. De hogyan is működik pontosan a sózás, és miért van szükség rá? Milyen módszereket használhatunk a jelszavak biztonságos tárolására, és mik a legjobb gyakorlatok, amelyeket követnünk kell?
Miért nem elég csak a jelszó hash-elése?
A jelszó hash-elése önmagában nem biztosít elég védelmet. Ha egy egyszerű, nem sózott hash-t tárolunk az adatbázisban, akkor egy támadó könnyedén visszafejtheti a jelszót, ha rendelkezésére állnak szivárványtáblák (rainbow tables), amelyek a gyakran használt jelszavak hash-ét tartalmazzák. Ez azért lehetséges, mert az azonos jelszavak mindig ugyanazt a hash-t generálják, így ha egy adatbázisban több felhasználó is ugyanazt a jelszót használja, akkor azok hash értékei azonosak lesznek, ami segít a támadóknak a jelszó gyors kitalálásában.
Mi a sózás és hogyan növeli a jelszó biztonságát?
A sózás (salt) egy extra, véletlenszerű adat, amelyet a jelszóval együtt használunk a hash létrehozásakor. A só célja, hogy megnövelje a jelszó hash értékének komplexitását, és megakadályozza, hogy a támadók előre generálják a jelszavak hash értékeit egy szivárványtáblában. A só az egyedi, titkos adat, amit minden felhasználóhoz külön-külön hozzárendelünk. Így, ha két felhasználó ugyanazt a jelszót választja, a két jelszó hash-e eltérő lesz, mert mindkettőhöz egyedi sót rendelünk.
Hogyan működik a sózás a jelszó hash-elésében?
A sózás lényege, hogy a jelszót egy egyedi, véletlenszerűen generált bájtlánccal (salt) kombináljuk, mielőtt alkalmaznánk a hash algoritmust. Így ha a felhasználó „password” jelszót választ, akkor azt nemcsak hash-elni fogjuk, hanem egy véletlenszerű sót is hozzáadunk, például „password + random_salt_value”. Az eredményül kapott hash érték teljesen eltérő lesz, mint egy olyan „password” hash, amelyet sózás nélkül generálnánk. Így biztosítva van, hogy minden egyes felhasználó jelszava egyedi és nem azonos a másik felhasználóval, még akkor is, ha ugyanazt a jelszót választják.
Visszaellenőrzéshez szükséges-e újra generálni a sót?
Fontos tisztázni, hogy a sót nem kell újra generálni a jelszó visszaellenőrzésekor. Amikor a jelszót tároljuk, akkor a sót és a hash értéket együtt tároljuk az adatbázisban. A visszaellenőrzés során nem kell újra generálnunk a sót, mivel az a hash értékkel együtt tárolva van. Amikor a felhasználó beírja a jelszavát, a rendszer először hozzáfűzi a sót a jelszóhoz, majd újra hash-eli azt, és összehasonlítja az eredményt az adatbázisban tárolt hash értékkel. Ha a két hash érték megegyezik, akkor a bejelentkezés sikeres.
A jelszó tárolásának különböző megoldásai és azok előnyei, hátrányai
1. Jelszó tárolása szövegként
Az egyik legrosszabb módszer, ha a jelszavakat sima szövegként tároljuk az adatbázisban. Ennek az a fő problémája, hogy ha egy támadó hozzáfér az adatbázishoz, az összes felhasználó jelszavát könnyedén megismeri. Ez a módszer teljesen elfogadhatatlan, és soha nem szabad alkalmazni.
2. Jelszó hash-elése
A jelszavak hash-elése valamivel biztonságosabb megoldás, mivel a hash értéke nem tartalmazza a jelszót, és így a támadó számára nehezebb lesz visszafejteni azt. Azonban, ha az egyszerű hash algoritmusokat (pl. MD5 vagy SHA-1) használjuk, akkor a jelszó még mindig sérülékeny lehet a szivárványtáblák és egyéb támadási módszerek ellen. A hash algorimusok gyorsasága miatt egy támadó könnyen és gyorsan kipróbálhatja az összes gyakori jelszót, hogy megtalálja a megfelelőt.
3. Jelszó hash-elése sóval
Ez az egyik legjobb megoldás a jelszavak tárolására. A jelszó hash-elésénél alkalmazott só segít megelőzni a szivárványtáblás támadásokat, és biztosítja, hogy minden jelszó egyedi hash értéket generáljon, még akkor is, ha ugyanazt a jelszót választják. A sózás erősíti a biztonságot, és megnehezíti a jelszavak visszafejtését.
4. Használjunk erős és lassú hash algoritmusokat
Az olyan hash algoritmusok, mint az MD5 és a SHA-1, gyorsak, de nem biztonságosak a jelszókezeléshez. Ha jelszót tárolunk, akkor érdemes inkább olyan algoritmusokat használni, amelyeket kimondottan jelszó hash-elésére terveztek, mint az Argon2, bcrypt vagy scrypt. Ezek az algoritmusok szándékosan lassúbbak, így megnehezítik a támadók számára, hogy brute-force módszerekkel kitalálják a jelszavakat.
PHP beépített jelszókezelő függvényei
A PHP-ban a password_hash
, password_verify
, és password_needs_rehash
függvények segítségével könnyen és biztonságosan tárolhatjuk a jelszavakat. Ezek a függvények automatikusan alkalmazzák a legjobb gyakorlatokat, például a sózást és a megfelelő hash algoritmusokat, így nem szükséges saját megoldásokat kitalálni a jelszavak biztonságos tárolásához.