Jelszó sózás (password salting): a biztonsági technika magyarázata és működése

A jelszó sózás egy fontos biztonsági technika, amely megvédi a jelszavakat a feltöréstől. Ehhez egy egyedi, véletlenszerű adatot, az ún. sót adnak a jelszóhoz, így még ha ellopják is az adatokat, a jelszavak sokkal nehezebben fejthetők vissza.
ITSZÓTÁR.hu
29 Min Read
Gyors betekintő

A digitális korban a felhasználói adatok biztonsága soha nem látott mértékben vált kritikus fontosságúvá. Az online szolgáltatások, alkalmazások és rendszerek szinte kivétel nélkül jelszavakkal védik a hozzáférést, és ezzel együtt a felhasználók személyes, pénzügyi vagy egyéb érzékeny adatait. Egyetlen sikeres adatszivárgás is katasztrofális következményekkel járhat mind a felhasználókra, mind a szolgáltatókra nézve. Az egyik leggyakrabban feltörött biztonsági elem éppen a jelszó, vagy pontosabban, a jelszavak tárolása és kezelése. Bár a felhasználók felelőssége erős, egyedi jelszavak választása, a szolgáltatók feladata, hogy ezeket a jelszavakat a lehető legbiztonságosabb módon tárolják és kezeljék. Ennek a komplex kihívásnak az egyik alappillére a jelszó sózás, vagy angolul password salting. Ez a technika nem csupán egy kiegészítő biztonsági réteg, hanem a modern, robusztus jelszóbiztonság elengedhetetlen része.

Miért nem tárolhatók a jelszavak egyszerű szöveges formában?

A legelső és legfontosabb szabály az adatbiztonság terén, hogy a jelszavakat soha, semmilyen körülmények között nem szabad egyszerű, titkosítatlan szöveges formában tárolni egy adatbázisban vagy fájlrendszerben. Ennek oka rendkívül egyszerű és egyértelmű: ha egy támadó valamilyen módon hozzáfér az adatbázishoz – legyen az SQL injekció, rosszindulatú belső hozzáférés, vagy egy rendszerhiba kihasználása –, akkor azonnal az összes felhasználó jelszavához hozzáférne. Ez azonnali fiókfeltöréseket, személyazonosság-lopást, pénzügyi csalásokat és egyéb súlyos károkat eredményezne. Egy ilyen incidens nem csupán az adott szolgáltatás hírnevét rombolná le, hanem jogi és szabályozási következményekkel is járna, például a GDPR vagy más adatvédelmi törvények megsértése miatt.

A jelszavak titkosítatlan tárolása alapvető biztonsági hiba, amely a leggyakoribb és legveszélyesebb sebezhetőségek közé tartozik. Ezt a gyakorlatot a biztonsági szakértők egyöntetűen elítélik, és a modern rendszerekben már elvétve fordul elő, de a múltban elkövetett hibák tanulságul szolgálnak.

A hashing, mint az első védelmi vonal

A jelszavak biztonságos tárolásának alapvető megoldása a hashing, vagy más néven lenyomatkészítés. A hash-függvény egy egyirányú matematikai algoritmus, amely egy tetszőleges hosszúságú bemeneti adatból (ebben az esetben a jelszóból) egy rögzített hosszúságú, látszólag véletlenszerű karaktersorozatot, úgynevezett hash-t vagy lenyomatot generál. Fontos megérteni, hogy a hash-függvények nem titkosítási algoritmusok. Míg a titkosítás visszafordítható (azaz a titkosított adatok visszafejthetők az eredeti formájukba egy kulcs segítségével), addig a hash-függvények egyirányúak: az eredeti jelszót a hash-ből matematikai úton nem lehet visszaállítani. Ez az egyirányú tulajdonság teszi őket ideálissá a jelszavak tárolására.

A hash-függvények tulajdonságai:

  • Egyirányúság (One-way): Az eredeti bemenet nem állítható vissza a hash-ből.
  • Determinisztikus (Deterministic): Ugyanaz a bemenet mindig ugyanazt a hash kimenetet eredményezi.
  • Gyorsaság (Efficiency): A hash-érték kiszámítása viszonylag gyorsan történik.
  • Ütközésállóság (Collision Resistance): Nehéz (ideális esetben lehetetlen) két különböző bemenetet találni, amelyek ugyanazt a hash-értéket eredményezik.
  • Lavinaeffektus (Avalanche Effect): A bemenetben történt apró változtatás (akár egyetlen bit megváltoztatása) is teljesen eltérő hash kimenetet eredményez.

Gyakori hash-algoritmusok és fejlődésük:

  • MD5 (Message-Digest Algorithm 5): Egykor széles körben használták, de mára teljesen elavultnak és nem biztonságosnak minősül jelszavak tárolására. Ismert sebezhetőségei vannak, például a kollíziós támadások viszonylag könnyen kivitelezhetők ellene, ami azt jelenti, hogy különböző bemenetek is ugyanazt a hash-t eredményezhetik.
  • SHA-1 (Secure Hash Algorithm 1): Az MD5 utódjaként jött létre, de ez is bebizonyosodott, hogy sebezhető a kollíziós támadásokkal szemben. Bár erősebb, mint az MD5, jelszavak tárolására már ez sem ajánlott.
  • SHA-2 család (SHA-256, SHA-512): Ezek az algoritmusok sokkal robusztusabbak és biztonságosabbak, mint elődeik. Jelenleg is széles körben használják őket különböző kriptográfiai célokra. Azonban pusztán egy SHA-256 hash használata jelszavakhoz, sózás nélkül, még mindig nem optimális. A fő probléma velük az, hogy rendkívül gyorsak, ami megkönnyíti a brute-force és szótártámadásokat.
  • Dedikált jelszó hash-algoritmusok (bcrypt, scrypt, Argon2): Ezeket az algoritmusokat kifejezetten a jelszavak hashelésére tervezték, és beépített mechanizmusokkal rendelkeznek a támadások elleni védelemre. Fő jellemzőjük, hogy szándékosan lassúak, és beállíthatóak úgy, hogy minél több számítási erőforrást igényeljenek (memória, CPU idő). Ez drasztikusan megnöveli a támadók költségeit, ha brute-force vagy szótártámadással próbálnak jelszavakat feltörni. Részletesebben foglalkozunk velük később.

Amikor egy felhasználó regisztrál egy szolgáltatásra, a rendszer nem a jelszavát tárolja el, hanem annak hash-ét. Amikor a felhasználó bejelentkezik, beírja a jelszavát, a rendszer ebből is elkészíti a hash-t, majd összehasonlítja az adatbázisban tárolt hash-sel. Ha a két hash megegyezik, a jelszó helyes, és a felhasználó hozzáférést kap. Ez a módszer megakadályozza, hogy a rendszergazdák vagy egy esetleges betörő közvetlenül hozzáférjen a jelszavakhoz, hiszen csak a visszafejthetetlen hash-eket látják.

A hashing önmagában miért nem elegendő?

Bár a hashing jelentős előrelépést jelent a jelszóbiztonságban a plain text tároláshoz képest, önmagában még nem nyújt teljes védelmet minden típusú támadás ellen. Két fő probléma merül fel a pusztán hashing használatával:

1. Rainbow table (szivárványtábla) támadások

A hash-függvények determinisztikus jellege (ugyanaz a bemenet mindig ugyanazt a kimenetet adja) ad lehetőséget a rainbow table támadásoknak. Egy rainbow table egy hatalmas, előre kiszámított adatbázis, amelyben a gyakori jelszavakhoz tartozó hash-értékek vannak eltárolva. A támadó letölthet egy ilyen táblát, vagy generálhatja azt. Ha hozzáfér egy adatbázishoz, amely csupán hash-eket tartalmaz, egyszerűen összeveti a megszerzett hash-eket a rainbow table-ben lévőkkel. Ha talál egyezést, akkor azonnal tudni fogja, hogy melyik jelszó tartozik az adott hash-hez. Ez a módszer rendkívül gyors és hatékony, különösen rövid, vagy gyakran használt jelszavak esetében.

Például, ha több felhasználó is az „123456” jelszót használja, és a rendszer csak az SHA-256 hash-ét tárolja („8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92”), akkor egy támadó, aki megszerzi ezt a hash-t, azonnal azonosítani tudja a jelszót, ha az szerepel a rainbow table-ben. Ráadásul, ha több felhasználó is ugyanazt a jelszót használja, és a hash-ek megegyeznek, a támadó egyetlen találattal több fiókot is feltörhet.

2. Szótártámadások és brute-force támadások offline módban

Bár a jelszavakat nem lehet visszafejteni a hash-ből, egy támadó offline módon (azaz anélkül, hogy a szerverrel kommunikálna) is megpróbálhatja kitalálni a jelszavakat. Ha egy támadó megszerzi a hash-eket tartalmazó adatbázist, elkezdheti generálni a gyakori szavak, kifejezések (szótártámadás) vagy az összes lehetséges kombináció (brute-force támadás) hash-eit, majd összehasonlítja azokat a megszerzett hash-ekkel. Mivel a hash-függvények gyorsak, ez a folyamat hihetetlenül hatékony lehet, különösen a gyenge jelszavak esetében. Egy modern grafikus processzor (GPU) másodpercenként több milliárd hash-t képes kiszámolni, ami percek alatt feltörhet rengeteg gyenge jelszót.

A fenti problémák megoldására találták ki a jelszó sózást, amely egy kritikus lépéssel egészíti ki a hashing folyamatát.

Mi az a jelszó sózás (Password Salting)?

A jelszó sózás megakadályozza a szótár alapú támadásokat.
A jelszó sózás egyedi, véletlenszerű adat hozzáadása a jelszóhoz, hogy megnehezítse a támadók dolgát.

A jelszó sózás egy olyan biztonsági technika, amely a hash-függvények determinisztikus természetének kihasználásával járó kockázatokat hivatott minimalizálni. Lényege, hogy egy egyedi, véletlenszerű karaktersorozatot, az úgynevezett sót (salt) fűznek hozzá a felhasználó jelszavához, mielőtt azt hashelésre kerülnék. Ez a só minden egyes jelszóhoz egyedi, és ideális esetben kriptográfiailag erős véletlenszám-generátorral (CSPRNG) állítják elő.

A jelszó sózás lényege, hogy minden egyes jelszóhoz egyedi, véletlenszerű karakterláncot (sót) adunk hozzá a hashing előtt, ezzel biztosítva, hogy még az azonos jelszavak is eltérő hash-értéket eredményezzenek, ellehetetlenítve a rainbow table támadásokat és drasztikusan megnehezítve az offline szótártámadásokat.

A só hozzáadása a jelszóhoz, majd az így kapott kombináció hashelése biztosítja, hogy még ha két felhasználó ugyanazt a jelszót is választja, az adatbázisban tárolt hash-eik teljesen eltérőek lesznek, mivel különböző sókat használtak. Ez kulcsfontosságú a biztonság szempontjából.

Hogyan működik a jelszó sózás lépésről lépésre?

A jelszó sózás folyamata viszonylag egyszerű, de rendkívül hatékony:

  1. Regisztráció vagy jelszómódosítás:

    • A felhasználó megadja a jelszavát (pl. „titkosjelszó”).
    • A rendszer generál egy egyedi, véletlenszerű sót az adott felhasználó számára (pl. „xyz789abc”). Ennek a sónak elegendő hosszúnak és kriptográfiailag erősnek kell lennie.
    • A rendszer összefűzi a jelszót és a sót (pl. „titkosjelszóxyz789abc”). A só általában a jelszó elé vagy mögé kerül.
    • Az összefűzött karakterláncot (jelszó + só) hashelő algoritmuson futtatja (pl. bcrypt, scrypt, Argon2). Az eredmény egy hash-érték (pl. „h4shk0d”).
    • A rendszer az adatbázisban tárolja a hash-értéket ÉS a sót. Fontos, hogy a só nem titok, és a hash mellett nyíltan tárolható, hiszen az a célja, hogy egyedivé tegye a hash-t.
  2. Bejelentkezés vagy jelszóellenőrzés:

    • A felhasználó megadja a jelszavát (pl. „titkosjelszó”).
    • A rendszer az adatbázisból lekéri az adott felhasználóhoz tartozó sót (pl. „xyz789abc”).
    • A rendszer összefűzi a felhasználó által megadott jelszót a lekérdezett sóval (pl. „titkosjelszóxyz789abc”).
    • Az összefűzött karakterláncot ugyanazzal a hashelő algoritmussal futtatja, amellyel a regisztrációkor történt. Az eredmény egy új hash-érték (pl. „h4shk0d_uj”).
    • A rendszer összehasonlítja az újonnan generált hash-t (pl. „h4shk0d_uj”) az adatbázisban tárolt hash-sel (pl. „h4shk0d”).
    • Ha a két hash megegyezik, a jelszó helyes, és a felhasználó bejelentkezhet. Ha nem, akkor a jelszó helytelen.

Ahogy látható, a sózás folyamata transparent a felhasználó számára, de a háttérben drasztikusan növeli a jelszóbiztonságot.

A sózás előnyei és biztonsági hatásai

A jelszó sózás bevezetése jelentősen megerősíti a jelszóbiztonságot, és számos előnnyel jár a támadások elleni védelemben:

1. Védelem a Rainbow Table támadások ellen

Ez a sózás elsődleges célja és legnagyobb előnye. Mivel minden jelszóhoz egyedi só tartozik, még ha két felhasználó ugyanazt a jelszót is használja, a tárolt hash-eik teljesen eltérőek lesznek. Egy támadónak, aki rainbow table-t használ, minden egyes felhasználóhoz külön-külön kellene egyedi rainbow table-t generálnia, figyelembe véve az adott felhasználó sóját. Ez gyakorlatilag lehetetlen, mivel a sók véletlenszerűek és egyediek. Ezáltal a pre-computed hash táblák (rainbow table-ök) használhatatlanná válnak.

2. Offline szótártámadások nehezítése

Bár a sózás nem akadályozza meg teljesen az offline szótártámadásokat, drasztikusan megnöveli azok költségét és idejét. Ha egy támadó megszerzi az adatbázist, és az tartalmazza a hash-eket és a sókat, akkor minden egyes felhasználó jelszavának feltöréséhez külön-külön kell a jelszó-szó kombinációkat hashelnie, figyelembe véve az adott felhasználó egyedi sóját. Nem tud egyetlen szótárlista hash-eit előre kiszámolni, és azokat az összes felhasználó hash-ével összehasonlítani. Ehelyett minden egyes hash-t egyedileg kell „feltörnie”, ami rendkívül időigényes és számításigényes folyamat, különösen, ha erős, lassú hash-algoritmusokat is használnak.

3. Az azonos jelszavak leleplezésének megakadályozása

Sózás nélkül, ha több felhasználó is ugyanazt a jelszót használja (pl. „password123”), akkor a hash-eik is azonosak lennének. Egy támadó, aki észreveszi ezt a mintát, azonnal tudná, hogy ugyanaz a jelszó tartozik ezekhez a fiókokhoz. A sózás biztosítja, hogy még az azonos jelszavak is eltérő hash-értékkel rendelkezzenek az adatbázisban, elrejtve ezt az információt a támadók elől. Ez segít megakadályozni, hogy egyetlen feltört jelszó több fiókhoz is hozzáférést biztosítson.

4. A támadó számítási költségeinek növelése

A sózás arra kényszeríti a támadót, hogy minden egyes jelszóhoz külön-külön generáljon hash-t, ahelyett, hogy egyszer generálná egy jelszólista hash-eit, majd összehasonlítaná azokat. Ez a „munka” megsokszorozódik a felhasználók számával arányosan, drasztikusan növelve a támadás idejét és számítási költségeit. Ez különösen igaz, ha a sózást lassú hash-algoritmusokkal (bcrypt, scrypt, Argon2) kombinálják.

A sózás korlátai és tévhitek

Bár a sózás rendkívül fontos biztonsági technika, nem csodaszer, és nem old meg minden jelszóval kapcsolatos biztonsági problémát. Fontos tisztában lenni a korlátaival:

1. Nem véd a gyenge jelszavak ellen

A sózás nem teszi erőssé a gyenge jelszavakat. Ha egy felhasználó „123456” vagy „password” jelszót használ, a sózás ellenére is könnyen feltörhető lesz. A sózás csak a támadási módszereket nehezíti meg, de ha a jelszó maga gyenge, a támadó szótártámadással vagy brute-force módszerrel viszonylag gyorsan megtalálhatja, még akkor is, ha a só hozzáadódik.

2. Nem véd a brute-force támadások ellen online módban

A sózás nem akadályozza meg az online brute-force támadásokat, ahol a támadó közvetlenül a bejelentkezési felületen próbálja ki a jelszavakat. Ilyen esetekben a sózás szerepe marginális, mivel a rendszer minden kísérletnél lefutja a teljes hash-eljárást. Az online támadások ellen a fiókzárolás (pl. 3 sikertelen kísérlet után ideiglenes zárolás), a captcha, és a többfaktoros hitelesítés (MFA) nyújt védelmet.

3. Nem véd a phishing és keylogger támadások ellen

A sózás a jelszavak tárolásának biztonságát növeli, nem a megszerzésükét. Ha egy támadó phishing (adathalász) támadással megszerzi a felhasználó jelszavát, vagy keyloggert telepít a felhasználó gépére, akkor az eredeti jelszó már a támadó birtokában van, függetlenül attól, hogy a jelszó hogyan van tárolva a szerveren.

4. Nem helyettesíti a modern, lassú hash-algoritmusokat

Bár a sózás elengedhetetlen, önmagában nem elegendő. Ha a sózást egy gyors, elavult hash-algoritmussal (pl. MD5, SHA-1) kombinálják, a biztonsági előnyök jelentősen csökkennek. A sózásnak mindig kéz a kézben kell járnia a modern, szándékosan lassú jelszó hash-algoritmusokkal (bcrypt, scrypt, Argon2).

Legjobb gyakorlatok a jelszó sózás és hash-elés implementálásához

A sózás és a hash-elés hatékony implementálásához számos bevált gyakorlatot be kell tartani. A kulcs a robusztus, modern kriptográfiai eljárások alkalmazása és a felhasználói adatok maximális védelme.

1. Használjon egyedi, véletlenszerű sót minden jelszóhoz

  • Egyediség: Soha ne használja ugyanazt a sót két különböző jelszóhoz, még akkor sem, ha azok ugyanahhoz a felhasználóhoz tartoznak (pl. régi jelszavak hash-ei, ha eltárolják).
  • Véletlenszerűség: A sót kriptográfiailag biztonságos véletlenszám-generátorral (CSPRNG) kell generálni. Ne használjon pseudo-véletlenszám-generátort, vagy könnyen kitalálható, szekvenciális sókat.
  • Hossz: A só hossza legalább 16-32 bájt (128-256 bit) legyen. Ez biztosítja a kellő egyediséget és megnehezíti a támadók dolgát.

2. A sót a hash mellett tárolja

Mivel a só nem titok, és a jelszó ellenőrzéséhez szükség van rá, az adatbázisban a jelszó hash-e mellett kell tárolni. Egy tipikus adatbázis séma tartalmaz egy oszlopot a felhasználónévnek/e-mail címnek, egyet a jelszó hash-ének és egyet a sójának. Sok modern jelszó hash-algoritmus (pl. bcrypt, Argon2) a generált hash-be beépíti a sót és az iterációs paramétereket, így csak egyetlen sztringet kell tárolni.

3. Használjon erős, lassú jelszó hash-algoritmusokat (KDF-eket)

Ez a legfontosabb tanács a sózás mellett. A modern jelszó hash-algoritmusok, vagy pontosabban kulcsszármaztató függvények (Key Derivation Functions – KDFs), szándékosan lassan működnek, és beépített mechanizmusokkal rendelkeznek a brute-force támadások elleni védelemre. Ezek a következők:

  • bcrypt: Az egyik legelterjedtebb és jól bevált KDF. Beépített sózással és állítható „munkafaktorral” (work factor) rendelkezik, ami szabályozza a hash-eléshez szükséges számítási időt. Minél nagyobb a munkafaktor, annál lassabb a hash-elés, és annál nehezebb a brute-force támadás.
  • scrypt: A bcrypt-nél is erőforrás-igényesebb, mivel nemcsak CPU-időt, hanem jelentős memóriát is igényel. Ez megnehezíti a speciális hardverekkel (pl. GPU-kkal, ASIC-okkal) történő gyors hash-számítást, amelyek gyakran korlátozott memóriával rendelkeznek.
  • Argon2: Jelenleg a NIST (National Institute of Standards and Technology) által is ajánlott, és a Password Hashing Competition (PHC) győztese. Az Argon2 többféle paraméterrel is konfigurálható (CPU-idő, memória, párhuzamosság), így rendkívül rugalmas és ellenálló a különböző típusú támadásokkal szemben. Jelenleg az Argon2 a leginkább ajánlott jelszó hash-algoritmus.

Miért fontos a lassúság? A cél az, hogy a hash-elés a szerver számára éppen elfogadható sebességű legyen (pl. néhány tizedmásodperc), de a támadók számára, akik milliárdos nagyságrendű hash-t akarnak generálni, rendkívül drága és időigényes legyen. Egy jól beállított munkafaktor mellett a támadás költsége exponenciálisan nő.

4. Rendszeresen frissítse a munkafaktort (cost factor)

A számítási teljesítmény folyamatosan növekszik (Moore törvénye). Ami ma „lassúnak” számít egy hash-algoritmusnál, az öt év múlva már gyorsnak minősülhet. Ezért fontos, hogy a rendszergazdák időről időre felülvizsgálják és növeljék a hash-algoritmusok munkafaktorát (pl. a bcrypt „cost” paraméterét). Ez egy folyamatos feladat, amely biztosítja, hogy a jelszóbiztonság lépést tartson a technológiai fejlődéssel és a támadói képességekkel.

Amikor növelik a munkafaktort, nem kell az összes jelszót újrahashelni. Elegendő, ha a felhasználó legközelebbi bejelentkezésekor (vagy jelszómódosításakor) az új, magasabb munkafaktorral hashelik újra a jelszavát, és frissítik az adatbázisban tárolt hash-t.

5. Használjon HTTPS-t

Bár nem közvetlenül a sózáshoz kapcsolódik, alapvető fontosságú, hogy a jelszavak továbbítása a kliens (böngésző) és a szerver között mindig titkosított csatornán keresztül történjen (HTTPS/SSL/TLS). Ez megakadályozza, hogy egy hálózati támadó lehallgassa a jelszavakat, mielőtt azok eljutnának a szerverhez és hashelésre kerülnének.

6. Ne használjon „egyedi” vagy „házilag készített” kriptográfiát

A kriptográfia rendkívül komplex terület. Soha ne próbáljon meg saját hash-algoritmust vagy sózási mechanizmust fejleszteni. Mindig használjon jól bevált, nyílt forráskódú, széles körben auditált és elfogadott könyvtárakat és algoritmusokat, mint például a bcrypt, scrypt vagy Argon2. A „security by obscurity” (biztonság a titkolózás révén) elve rendkívül veszélyes és szinte mindig hibás.

7. Képzés és tudatosság

A legjobb technikai megoldások sem elegendőek, ha a felhasználók és a fejlesztők nincsenek tisztában a biztonsági kockázatokkal és a helyes gyakorlatokkal. A fejlesztői csapatoknak folyamatosan képezniük kell magukat a legújabb biztonsági trendekről és a legjobb gyakorlatokról a jelszóbiztonság terén.

A jelszó sózás evolúciója: a kulcsszármaztató függvények (KDF-ek)

A KDF-ek erősítik a jelszóvédelmet modern kriptográfiával.
A kulcsszármaztató függvények (KDF-ek) célja a jelszavak erősebb titkosítása és az ismétlődő támadások megakadályozása.

A jelszó sózás önmagában egy fontos lépés volt, de a modern kriptográfia továbbfejlesztette ezt a koncepciót a kulcsszármaztató függvények (Key Derivation Functions – KDFs) formájában. Ezek az algoritmusok nem csupán a sózást integrálják, hanem további mechanizmusokat is tartalmaznak, amelyek kifejezetten a jelszó-hash-elésre optimalizáltak.

PBKDF2 (Password-Based Key Derivation Function 2)

A PBKDF2 volt az egyik első széles körben elfogadott KDF, amelyet kifejezetten jelszavak hashelésére terveztek. Fő jellemzője az iteráció. A PBKDF2 a jelszót és a sót többször is hasheli (ezrek, százezrek, vagy akár milliók alkalommal), ami jelentősen megnöveli a hash-érték kiszámításához szükséges időt. Az iterációk száma konfigurálható, és ezt a paramétert is a hash mellett tárolják. Bár a PBKDF2 jelentősen jobb, mint a sima SHA-256 sózással, még mindig van egy hátránya: viszonylag kevés memóriát igényel, így GPU-kkal vagy ASIC-okkal továbbra is hatékonyan támadható.

bcrypt

A bcrypt a Blowfish titkosító algoritmus adaptációja jelszó hashelésre. A PBKDF2-höz hasonlóan iterációkat használ, de azon felül, hogy CPU-igényes, a bcrypt is memóriaigényes. A memóriahasználat növelése megnehezíti a párhuzamosítást és a speciális hardverekkel (GPU-k) történő támadásokat, mivel a GPU-k memóriája általában korlátozottabb, mint a CPU-ké. A bcrypt a „cost factor” paraméterrel szabályozható, amely az iterációk számát és a memóriahasználatot is befolyásolja. Az egyik legnépszerűbb és leginkább ajánlott algoritmus volt hosszú ideig.

scrypt

A scrypt egy még továbbfejlesztett KDF, amelyet kifejezetten azzal a céllal hoztak létre, hogy ellenálljon a hardveres (GPU, ASIC) támadásoknak. A bcrypt-hez hasonlóan memóriaigényes, de még inkább optimalizált a memória-költség növelésére. Három fő paramétere van: CPU/memória költség, blokkméret és párhuzamosság. Ezekkel a paraméterekkel finomhangolható, hogy a hash-eléshez szükséges erőforrások (CPU idő és memória) a lehető legmagasabbak legyenek a támadók számára.

Argon2

Az Argon2 a Password Hashing Competition (PHC) győztese 2015-ben, és jelenleg a leginkább ajánlott jelszó hash-algoritmus. Az Argon2-t úgy tervezték, hogy ellenálljon a legmodernebb támadásoknak is, beleértve a GPU-s és ASIC-alapú támadásokat, valamint a side-channel támadásokat. Az Argon2 három fő paraméterrel konfigurálható:

  • Memória költség (memory cost): A hash-eléshez szükséges memória mennyisége.
  • Idő költség (time cost): Az iterációk száma, ami a CPU-időt befolyásolja.
  • Párhuzamossági fok (parallelism degree): A hash-elés során használható szálak száma.

Az Argon2 több variánssal is rendelkezik (Argon2d, Argon2i, Argon2id), amelyek különböző kompromisszumokat kínálnak a biztonság és a teljesítmény között. Az Argon2id (hibrid verzió) általában a leginkább ajánlott jelszavak hashelésére, mivel ellenáll a side-channel támadásoknak, miközben továbbra is rendkívül ellenálló a brute-force és szótártámadásokkal szemben.

A kulcsszármaztató függvények (KDF-ek) használata a modern jelszóbiztonság alapja. Ezek nem csupán sózzák a jelszavakat, hanem szándékosan lassúak, iteratívak és memóriaigényesek, ezzel drasztikusan megemelve a támadások költségeit. A KDF-ek használata sokkal biztonságosabb, mint a hagyományos hash-algoritmusok (pl. SHA-256) önmagában való alkalmazása, még sózással együtt is.

Gyakori hibák és téves elképzelések a jelszó sózással kapcsolatban

Annak ellenére, hogy a jelszó sózás alapvető biztonsági technika, számos hiba és téves elképzelés fordul elő a gyakorlati implementáció során. Ezek elkerülése kulcsfontosságú a robusztus jelszóbiztonság eléréséhez.

1. Rövid vagy fix sók használata

Ha a só túl rövid, vagy nem véletlenszerű (pl. a felhasználónév egy része, vagy egy fix, előre meghatározott sztring), akkor a támadó könnyen kitalálhatja, vagy előre generálhatja a hozzá tartozó hash-eket. Ez aláássa a sózás alapvető célját, és lehetővé teszi a rainbow table támadásokat.

2. Só újrahasználata

Minden jelszóhoz egyedi sót kell generálni. Ha ugyanazt a sót használják több felhasználó jelszavához, vagy akár ugyanannak a felhasználónak a jelszavához, de különböző időpontokban, az lehetővé teszi a támadónak, hogy egyetlen támadással több jelszót is feltörjön, vagy a régi hash-ekből következtetéseket vonjon le.

3. Gyenge hash-algoritmus használata sóval

Ahogy korábban említettük, a sózás nem helyettesíti a modern, erős hash-algoritmusokat. Ha a sózást MD5-tel vagy SHA-1-gyel kombinálják, a rendszer továbbra is sebezhető marad a modern támadásokkal szemben, mivel ezek az algoritmusok túl gyorsak és kollíziós problémákkal küzdenek.

4. Nem kriptográfiailag biztonságos véletlenszám-generátor használata só generálásához

A só véletlenszerűségének kritikus fontossága van. Ha a só generálásához használt véletlenszám-generátor nem kriptográfiailag biztonságos (azaz kimenete előre jelezhető vagy mintázatos), akkor a támadó potenciálisan képes lehet előre jelezni a sókat, ami megkönnyíti a támadást.

5. A só és a hash külön tárolása, de könnyen összekapcsolható módon

Bár a sót a hash mellett kell tárolni, fontos, hogy egy esetleges adatbázis-feltörés esetén a támadó ne tudja könnyedén összekapcsolni a sót a megfelelő hash-sel, ha azokat külön oszlopokban tárolják. A modern KDF-ek, mint a bcrypt vagy Argon2, a sót és az iterációs paramétereket is belefoglalják a generált hash-sztringbe, ami leegyszerűsíti a tárolást és csökkenti a hibalehetőségeket.

6. A munkafaktor figyelmen kívül hagyása vagy túl alacsonyra állítása

A modern KDF-ek (bcrypt, scrypt, Argon2) egyik legfontosabb jellemzője a konfigurálható munkafaktor. Ha ezt a paramétert túl alacsonyra állítják, a hash-elés túl gyors lesz, ami jelentősen megkönnyíti a brute-force támadásokat. Fontos a munkafaktort úgy beállítani, hogy a hash-elés elfogadható időt vegyen igénybe a szerver oldalon (pl. 200-500 ms), és rendszeresen frissíteni azt a számítási teljesítmény növekedésével.

7. A jelszó sózás összetévesztése a titkosítással

A sózás és a hashing nem titkosítás. A titkosítás visszafordítható, a hashing nem. A jelszó sózás a jelszavak biztonságos tárolására szolgál, nem pedig azok titkosítására. Soha ne próbálja meg a jelszavakat titkosítani és úgy tárolni, mert az visszafejthető, és egy kulcs megszerzésével az összes jelszó azonnal lelepleződne.

Ezen hibák elkerülése elengedhetetlen a robusztus jelszóbiztonsági stratégia kialakításához. A legjobb gyakorlatok követése és a modern kriptográfiai ajánlások betartása minimalizálja az adatszivárgások kockázatát és védi a felhasználók adatait.

A jelszó sózás hatása a felhasználói élményre és a szabályozásra

A jelszó sózás bevezetése a háttérben zajlik, így a felhasználók számára teljesen láthatatlan. Ez azt jelenti, hogy a biztonsági intézkedés nem rontja a felhasználói élményt, sőt, közvetve javítja azt, mivel növeli a felhasználók adatainak biztonságát. A felhasználóknak továbbra is csak a jelszavukat kell beírniuk a bejelentkezéshez, a sózás és a hashelés minden lépése automatikusan történik a szerver oldalon.

A jelszó sózás és a modern hash-algoritmusok alkalmazása ma már nem csupán „jó gyakorlat”, hanem sok esetben a jogi és szabályozási megfelelőség alapkövetelménye is. Az olyan adatvédelmi rendeletek, mint a GDPR (Általános Adatvédelmi Rendelet) az Európai Unióban, vagy a CCPA (California Consumer Privacy Act) az Egyesült Államokban, megkövetelik az adatok megfelelő védelmét, beleértve a felhasználói jelszavakat is. Bár ezek a rendeletek ritkán írnak elő konkrét technikai megoldásokat (mint például a sózás), az „megfelelő technikai és szervezeti intézkedések” elvárása gyakorlatilag magában foglalja a modern jelszóbiztonsági protokollok, így a sózás és az erős KDF-ek alkalmazását is. Egy adatszivárgás esetén, ha a jelszavak nem voltak megfelelően védve (pl. nem sózva és hashelve), az súlyos bírságokat és jogi következményeket vonhat maga után.

Ezen túlmenően, a biztonsági auditok és iparági szabványok (pl. PCI DSS a kártyaadatok kezelésében) is gyakran megkövetelik a jelszavak biztonságos tárolását, ami magában foglalja a sózást és az erős hash-függvények használatát. Azok a szervezetek, amelyek nem tartják be ezeket az alapvető biztonsági elveket, nemcsak jogi kockázatoknak teszik ki magukat, hanem súlyos hírnévvesztést is elszenvedhetnek, ami végső soron üzleti veszteségekhez vezethet.

A jelszó sózás tehát nem egy opció, hanem egy kötelező elem a modern digitális szolgáltatások biztonsági architektúrájában. Azok a rendszerek, amelyek nem alkalmazzák ezt a technikát, alapvetően sebezhetőek, és felelőtlenül kezelik a felhasználók legérzékenyebb adatait. A technológia folyamatos fejlődésével a támadási módszerek is egyre kifinomultabbá válnak, ezért a biztonsági intézkedéseknek is folyamatosan fejlődniük és alkalmazkodniuk kell. A sózás, a modern KDF-ekkel kombinálva, a védelem alapköve, amely biztosítja, hogy a felhasználói jelszavak a lehető legnagyobb biztonságban legyenek, még egy adatbázis-feltörés esetén is.

Share This Article
Leave a comment

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük