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.
Kriptográfiai hash függvény
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:
- BLAKE3: 64 karakter
- SHA1: 40 karakter
- SHA2, 256 bites változat (SHA-256): 64 karakter
- SHA2, 512 bites változat (SHA-512): 128 karakter
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:
- Wikipédia (angol): Cryptographic hash function
- Wikipédia (magyar): Kriptográfiai hash függvény