A jelszóhashing alapvető része a jelszavak biztonságának, hiszen a jelszavak tárolását egyszerű szövegből titkosított hash-ekbe alakítja. Ez a cikk bemutatja a jelszóhashing fejlődését a korai MD5 és SHA-1 algoritmusoktól a ma ajánlott, biztonságosabb módszerekig, végül pedig hangsúlyozza a véletlenszerűen generált jelszavak fontosságát minden weboldal esetén.
Mielőtt mélyebben belemerülnénk a jelszóhashing történetébe és fejlődésébe, fontos megérteni, hogy mi is az a hashing. A hash függvények, amelyek elvégzik ezt a folyamatot, arra szolgálnak, hogy bármilyen hosszúságú adatot, azaz "bemenetet", fix hosszúságú bájtsorozattá, azaz "hash"-sé alakítsanak. Ennek a folyamatnak több olyan kulcsfontosságú tulajdonsága van, amelyek különösen hasznossá teszik a biztonságtechnikai alkalmazásokban.
A hash függvények egyik legfontosabb jellemzője az inputra való érzékenység, amit lavina-hatásnak nevezünk. Ez azt jelenti, hogy akár egy apró változtatás a bemeneten – például egy karakter megváltoztatása egy jelszóban – teljesen eltérő hash eredményt hoz létre. Például a "password1" és a "password2" karakterláncok hashei teljesen különbözőek lesznek, még akkor is, ha csak az utolsó karakterük tér el egymástól. Ez a tulajdonság lényeges az adatintegritás megőrzéséhez, mivel szinte lehetetlenné teszi az eredeti bemenet kikövetkeztetését csak a hash alapján.
Ezenfelül a hash függvények egyirányúak. Ez azt jelenti, hogy a visszafejtésük számítási szempontból gyakorlatilag megoldhatatlan. A kimenet (a hash) nem tartalmaz olyan részletes információkat az eredeti bemenetről, melyek alapján akárki visszaállíthatná az eredeti adatot különleges számítási erőforrások nélkül. A hash visszafordításának egyetlen lehetséges módja a brute-force módszer, amikor minden lehetséges bemenetet újra hash-elnek, amíg meg nem egyezik a keresett hashekkel.
A digitális biztonság hajnalán az MD5 (Message-Digest Algorithm 5) és a SHA-1 (Secure Hash Algorithm 1) voltak a legelterjedtebbek a jelszóhashingben. Ezek az algoritmusok, amelyeket a kilencvenes évek elején fejlesztettek, a jelszavakat fix hosszúságú hash-értékké alakították. Annak ellenére, hogy kezdetben biztonságosnak számítottak, az ütközéses támadásokra való sérülékenységük hamar elavulttá tette őket a biztonságos alkalmazásokban.
Míg a hash függvényeket gyorsaságra és hatékonyságra tervezték, ez a tulajdonság a jelszóbiztonságnál kifejezetten hátrányos lehet, mert egyszerűbbé teszi a brute-force támadásokat. A PBKDF-ek (Password-Based Key Derivation Functions), például a PBKDF2, bcrypt és scrypt, ezt ellensúlyozzák azáltal, hogy sóval dolgoznak (ez véd a rainbow table támadások ellen) és úgynevezett kulcsnyújtást (key stretchinget) alkalmaznak. A kulcsnyújtás szándékosan lassítja a hash-elési folyamatot, ami jelentősen elrettentheti az illetéktelen hozzáférési kísérleteket.
A kiberbiztonság fejlődésével egyre világosabbá váltak a korai hash algoritmusok, például az MD5 vagy SHA-1 hiányosságai. Ez vezetett a kifejezetten jelszóbiztonságra tervezett algoritmusok kifejlesztéséhez, mint a bcrypt, scrypt és Argon2, vagyis a Jelszó-alapú kulcsszármaztató függvények (PBKDF).
Az OWASP szerint a jelszóhashinghez ajánlott algoritmusok a bcrypt, scrypt és az Argon2. Ezeket azért preferálják, mert erős védelmet nyújtanak a brute-force támadásokkal szemben, valamint beépített mechanizmusokat tartalmaznak a só- és kulcsnyújtás kezelésére.
A bcrypt egy jelszóhashing függvény, amely a Blowfish titkosító algoritmusból származik. Beépített sót használ a rainbow table támadások elleni védelemhez, és egy költség (cost) paramétert, amely növeli a számítási időt (és így a hash előállításának nehézségét). Ez az érték állítható, így az algoritmus együtt tud fejlődni a hardveres fejlődéssel.
Fő paraméterei:
Az OWASP legalább 10-es munkafaktort (work factor) és 72 bájtos jelszóhosszt javasol.
A scrypt-et úgy tervezték, hogy idő- és memóriaigényes legyen, megnehezítve a nagyteljesítményű egyedi hardveres támadásokat. Testreszabható, hogy adott mennyiségű memóriát igényeljen, továbbá sót és iterációs számot is tartalmaz, hasonlóan a PBKDF2-höz.
Fő paraméterei:
Az OWASP szerint minimum (2^17) CPU/memória igényt, legalább 8-as blokkméretet (1024 bájt) és 1-es párhuzamosítási értéket célszerű használni.
Az Argon2, amely 2015-ben megnyerte a Password Hashing Competition-t, két fő változatban létezik: Argon2d és Argon2i. Az Argon2d optimalizált, ha alacsony a side-channel támadások veszélye, míg az Argon2i ezek ellen védettebb. Az Argon2 mindkettőből magában hordoz előnyöket, illetve a bcrypt és scrypt kulcsfontosságú tulajdonságait is átveszi.
Fő paraméterei:
Az OWASP javaslata szerint az Argon2id-t legalább 19 MiB memória, 2 iteráció és 1 fokú párhuzamosítás mellett célszerű konfigurálni.
Tekintettel a biztonsági fenyegetések és ellenintézkedések állandó fejlődésére, elengedhetetlen, hogy a legmodernebb jelszóbiztonsági gyakorlatokat kövessük. Az aktuális és átfogó ajánlásokért kérjük, keresse fel az OWASP Password Storage Cheat Sheet oldalt az OWASP hivatalos webhelyén. Rendszeresen tekintse át ezeket az irányelveket, hogy megfeleljen a kiberbiztonság legjobb gyakorlatainak.
Bár a modern hash algoritmusok alkalmazása lényeges, a jelszavak létrehozásának és kezelésének módja is döntő szerepet játszik a biztonság szempontjából. Minden weboldalhoz egyedi, véletlen jelszavak használata több okból is nélkülözhetetlen:
Az MD5 és SHA-1 algoritmusoktól kezdve a modern bcrypt és Argon2 megoldásokig a jelszóhashing jelentős fejlődésen ment keresztül. Mivel a kibertámadások folyamatosan fejlődnek, elengedhetetlen, hogy korszerű hash algoritmusokat alkalmazzunk, valamint minden weboldalhoz egyedi, véletlenszerű jelszavakat használjunk. Ezek a stratégiák nemcsak az egyes fiókok kompromittálódását akadályozzák meg, hanem a teljes online biztonsági helyzetet is megerősítik a mind kifinomultabb támadásokkal szemben.