Kriptográfiai hash függvény

🚧

Ez az bejegyzés még kezdeti állapotban van. Alap infókat már meg lehet tudni belőle, de még sok minden hiányzik.

A kriptográfiai hash függvények a titkosítási algoritmusok egyik legfontosabb alkotóelemét képzik. A hash függvény egy bemeneti adatból képez egy kimeneti adatot (a függvény értékét). A legfontosabb jellemzője, hogy hiába tudjuk a kimeneti adatot, nem tudjuk megmondani, hogy mi volt a bemeneti adat. Egy adott bemeneti adathoz csak egy féle kimeneti adat tartozik. Arról, hogy ez mire jó, később lesz szó a cikkben, de előbb meg kell érteni még néhány fontos tulajdonságot.

A bemeneti adat akármi lehet, és akármekkora méretű, például egy fájl, vagy szöveg is. A kimeneti adat viszont a legtöbb hash függvénynél fix hosszúságú, például mindig 64 karakter. A kimeneti adatot általában karaktersorozatként szokták megjeleníteni, hasonlóan ehhez:
78e7a745e7c4da23a62ac668cf262065e8d0406ea28f27dd66d8a5f3bf690d7f
A kimenet akkor is 64 karakter, ha a bemenet egy óriási, több száz gibibájt méretű fájl, de akkor is 64 karakter az eredmény, ha a bemenet csupán 1 karakter hosszú (vagy akár nulla). Akármekkora a bemeneti adatmennyiség, ha akár egy bit megváltozik benne, valószínűleg nagyon más lesz a hash függvény kimenete.

A kimenet hosszúsága a hash függvénytől függ, de egy adott függvénynél mindig ugyan annyi, néhány példa különböző hash függvényekre:

Ezek a karaktersorozatok egyébként hexadecimális (base16), vagy Base64 kódolásai egy bináris kimeneti eredménynek.

Egyszerű példa

Egy egyszerű hash függvény példájaként vegyük mondjuk a maradékos osztást.
Ha egy számot (nevezzük x-nek) egy másik számmal (nevezzük y-nak) osztunk, akkor kapunk egy eredményt. Minden egyes alkalommal, amikor x-et maradékosan osztjuk y-nal, ugyan az lesz az eredmény. A legfontosabb, hogy hiába tudjuk az eredményt, meg az osztót (y), ebből a két adatból nem tudjuk megmondani, hogy mi volt a szám, amit osztottunk. Mondjuk a maradékos osztásnál nagyon könnyű ütközéseket találni: 2 különböző számot ugyan azzal az y-nal osztva ugyan az lesz az eredmény, például 15-öt 10-zel maradékosan osztva 5 lesz a maradék, de a 25-öt 10-zel maradékosan osztva is 5 a maradék.

Alkalmazás

Fájlok épségének ellenőrzése

(TODO: megírni)

Jelszavak tárolása

A hash alkalmas lehet jelszavak biztonságos tárolására: Például a webszerverek nem egyszerű szöveg formátumban mentik a fiók jelszavakat az adatbázisba, hanem előtte lehashelik. Amikor egy felhasználó belépéskor elküldi a jelszót, a szerver hash-eli, és az eredményt összehasonlítja az adatbázisban található hash-sel. Ha egyezik a hash, az azt jelenti, hogy a felhasználó jó jelszót adott meg. Ha nem egyezik a hash, akkor a felhasználó által megadott és az adatbázisban található jelszó eltér. (Itt nem tudjuk, hogy mi a helyes jelszó, mert annak csak a hash-jét ismerjük, viszont tudjuk, hogy nem az, amit a felhasználó megadott, mert a két hash eltér.)

Ha egy támadó hozzáfér az adatbázishoz, és ellopja a tartalmát (data breach), a hashelésnek köszönhetően nem tudja a valódi jelszavakat, így nem tudja kipróbálni a belépést a fiókokba más oldalakon credential stuffing.

Az operációs rendszerek is hashelve tárolják a felhasználói fiókok jelszavait. Például Linux rendszeren az /etc/shadow fájlban találhatók a jelszavak hash-elt értékei (ehhez a fájlhoz csak a root felhasználó férhet hozzá).

Kriptográfiai kulcs létrehozása

(TODO: megírni)


Ha jobban bele szeretnéd magad ásni a témába, itt találsz további információt: