A hashelés a tetszőleges méretű adatok fix hosszúságú karakterlánccá alakításának folyamata, amelyet az integritás ellenőrzésére és a jelszavak biztonságos tárolására használnak. Az Open Web Application Security Project (OWASP, 2025) adatai szerint a hashfüggvények helyes használata a hitelesítő adatok szivárgásával kapcsolatos sebezhetőségek akár 70%-át is megelőzi. A kriptográfiai hashek képezik a digitális aláírások, a blokklánc technológiák és a verziókövetés alapját.
Főbb pontok
A hashelés — a hashfüggvény kiszámításának folyamata, amely egy tetszőleges bemeneti adathalmazt fix hosszúságú bitsorozattá alakít, amelyet digesztenek vagy hash értéknek neveznek. A titkosítással ellentétben a hashelés egyirányú folyamat: az eredeti adatok visszaállítása a hashból lehetetlen.
A kriptográfiai hashfüggvények négy kötelező tulajdonsággal rendelkeznek: determinitás (ugyanaz a bemenet mindig ugyanazt a hasht adja), visszafordíthatatlanság (számítási szempontból lehetetlen a bemenet visszaállítása a hashból), lavinaeffektus (egyetlen bit megváltoztatása a bemenetben átlagosan a hash bitek felét megváltoztatja) és ütközésállóság (számítási szempontból lehetetlen két különböző bemenetet találni, amelyek ugyanazt a hasht adják).
Fontos megérteni a különbséget a hashelés és a titkosítás között. A titkosítás kétirányú folyamat: a titkosított adatok egy kulcs segítségével visszafejthetők. A hashelés egyirányú folyamat: az átalakítás után az adatok nem állíthatók helyre. Ez a tulajdonság teszi a hashelést ideálissá jelszavak tárolására: a rendszer csak a hasht tárolja, és még adatbázis-szivárgás esetén is a jelszavak védve maradnak.
Nem minden hashfüggvény egyformán alkalmas biztonsági feladatokra. A kriptográfiai és nem kriptográfiai kategóriákra való felosztás kritikus fontosságú az algoritmus kiválasztásakor egy adott mobilfejlesztési feladathoz.
Ezek a függvények szándékosan lassúak és összetettek a brute-force támadások megnehezítése érdekében. Ellenállónak kell lenniük az ütközésekkel és a preimage támadásokkal szemben. A SHA-2 család (SHA-224, SHA-256, SHA-384, SHA-512) NIST által tanúsított és kormányzati rendszerekben való használatra ajánlott. Jelszavak hasheléséhez emellett a bcrypt, scrypt és Argon2 algoritmusokat használják beállítható összetettséggel.
Ezek a függvények sebességre vannak optimalizálva, nem biztonságra. Példák: CityHash, MurmurHash, xxHash. Hash táblákban, adatdeduplikációban és ellenőrző összegekben használják őket nem kritikus adatok gyors integritásellenőrzésére. Fontos, hogy soha ne használja őket jelszavak tárolására vagy digitális aláírások ellenőrzésére — a nagy sebesség sebezhetővé teszi őket a brute-force támadásokkal szemben.
| Típus | Példák | Alkalmazási terület |
|---|---|---|
| Kriptográfiai | SHA-256, SHA-3, bcrypt | Jelszavak, aláírások, TLS |
| Nem kriptográfiai | MurmurHash, xxHash | Hash táblák, gyorsítótár |
| Jelszó KDF | bcrypt, scrypt, Argon2 | Jelszavak tárolása |
Tekintsük át a modern mobilfejlesztésben leggyakrabban használt hashelési algoritmusokat. Mindegyiknek megvannak a maga erősségei és gyengeségei.
SHA-256 — a modern kriptográfia szimbóluma, amelyet a NIST ajánl a FIPS 180-4 szabvány keretében. Az algoritmus 256 bites digesztet állít elő, és a TLS protokollok, blokklánc hálózatok és verziókövető rendszerek fő összetevője. Az NCC Group (2025) jelentése szerint a SHA-256-ot a TLS tanúsítványok 96%-ában használják a certificate transparency aláírására.
SHA-3 — a hashfüggvények legújabb családja, amelyet a NIST 2015-ben FIPS 202-ként szabványosított. A Merkle–Damgård struktúrára épülő SHA-2-vel ellentétben a SHA-3 a Keccak eltérő konstrukcióján alapul, szivacsfüggvénnyel. Ez teszi a SHA-3-at ellenállóvá azokkal a támadásokkal szemben, amelyek a jövőben megjelenhetnek a SHA-2 ellen. A mobilfejlesztők számára a SHA-3 a szabványos kriptográfiai könyvtárakon keresztül érhető el Android 7.0 és iOS 13-tól kezdődően.
import java.security.MessageDigest
fun hashWithSHA256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { String.format("%02x", it) }
}
Jelszavak tárolásához az általános kriptográfiai hashek nem elegendőek — túl gyorsak. A bcrypt kifejezetten jelszavak hashelésére lett tervezve: sót és egy költségparamétert tartalmaz, amely szabályozza a számítási időt. A költség kétszeresére növelése megduplázza a hashelési időt, így a brute-force támadások hatéktalanná válnak, még erős hardveren is.
import at.favre.lib.crypto.bcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.create()
.hashToString(BCrypt.MIN_COST, password.toCharArray())
}
fun verifyPassword(password: String, hash: String): Boolean {
val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
return result.verified
}
Argon2 — a Password Hashing Competition (2015) győztese, amelyet az OWASP a legjobb választásként ajánl jelszavak hasheléséhez. Az Argon2id — a mellékcsatornás támadásokkal és time-memory trade-off támadásokkal szemben ellenálló változat. A bcrypt-tel ellentétben az Argon2 lehetővé teszi a végrehajtási idő, a memóriahasználat és a párhuzamossági fok különálló beállítását, ami rugalmas védelmet nyújt a különböző támadástípusok ellen.
A hashelés számos gyakorlati feladatot megold a mobilfejlesztésben — a felhasználói hitelesítéstől a letöltött fájlok integritásának ellenőrzéséig. Tekintsük át a fő használati forgatókönyveket.
A fő forgatókönyv — jelszavak biztonságos tárolása a szerver oldalán. Regisztrációkor az alkalmazás elküldi a jelszót a szerverre, ahol sóval bcrypt vagy Argon2 algoritmussal hashelik és az adatbázisban tárolják. Bejelentkezéskor a szerver hasheli a megadott jelszót és összehasonlítja a tárolt hash-szel. Az OWASP a következő paraméterekkel ajánja az Argon2id használatát: idő 2 másodperc, memória 64 MB, párhuzamossági fok 4.
Nagyméretű fájlok, például OBB csomagok vagy tartalmi frissítések letöltésekor a mobilalkalmazások hasheléssel ellenőrizhetik azok integritását. A szerver közzéteszi a fájl SHA-256 hash-ét, az alkalmazás pedig kiszámítja a letöltött adatok hash-ét és összehasonlítja azokat. Ez garantálja, hogy a fájl nem sérült meg és nem cserélődött ki az átvitel során. A Google Play Console (2025) adatai szerint a tanúsított alkalmazások hash-ellenőrzése a sérült letöltési támadások akár 99,9%-át is megakadályozza.
A hasheket aktívan használják hatékony gyorsítótárak és adatdeduplikáció építésére. A kép címe vagy JSON válasz hashelésre kerül és gyorsítótár kulcsként használják: ismételt kérésnél a rendszer összehasonlítja a hasheket és visszaadja a tárolt eredményt, ha az adatok nem változtak. Erre a feladatra a nem kriptográfiai hashfüggvények, mint a MurmurHash vagy xxHash alkalmasak, amelyek maximális teljesítményt nyújtanak.
import java.security.MessageDigest
fun calculateFileHash(fileBytes: ByteArray): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(fileBytes)
return hash.joinToString("") { String.format("%02x", it) }
}
fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
val actualHash = calculateFileHash(data)
return actualHash == expectedHash
}
Még tapasztalt fejlesztők is követnek el hibákat a hasheléssel való munka során. Tekintsük át a leggyakoribb problémákat, amelyek semmissé tehetik a kriptográfiai védelem összes előnyét.
MD5 és SHA-1 — elavult algoritmusok, amelyekhez gyakorlati ütközési támadások léteznek. Az MD5-öt 2004-ben kínai kutatók egy csoportja törte fel (ütközés egy órán belül). Az SHA-1-et 2017-ben a Google és a Centrum Wiskunde & Informatica csapata törte fel (SHAttered támadás). Ezeknek az algoritmusoknak az új projektekben való használata az OWASP osztályozása szerint súlyos biztonsági hiba.
Jelszavak hashelése só nélkül — kritikus sebezhetőség. A só egy véletlenszerű karakterlánc, amely minden felhasználó számára egyedi, és a hashelés előtt adják a jelszóhoz. Só nélkül két azonos jelszó ugyanazt a hasht adja, lehetővé téve a szivárványtáblák használatát brute-force-hoz. Az OWASP kriptográfiailag erős, legalább 32 bájt hosszúságú só használatát ajánlja, amelyet minden felhasználó számára külön állítanak elő.
Még bcrypt vagy Argon2 használata esetén is gyengíthető a védelem túl alacsony költségparaméter választásával. Az OWASP (2025) szerint a bcrypt minimális iterációszáma 10 (2^10 = 1024 iteráció), az Argon2id esetében pedig a számítási idő legalább 1 másodperc a célplatformon. A túl alacsony paraméterek a brute-force támadásokat gyakorlatilag megvalósíthatóvá teszik GPU farmokon.
Gyakran Ismételt Kérdések
A hashelés — egyirányú folyamat, amelynek eredménye nem alakítható vissza eredeti adatokká. A titkosítás kétirányú folyamat: a titkosított adatok egy kulcs segítségével visszafejthetők. A hashelést jelszavak tárolására és integritásellenőrzésre használják, a titkosítást pedig az üyfél és a szerver közötti adatok bizalmas átvitelére.
Az OWASP az Argon2id-t ajánlja a legjobb választásként jelszavak hasheléséhez a GPU támadások és mellékcsatornás támadások elleni beállítható védelem miatt. Alternatívák: bcrypt (bevált és könnyen beállítható), scrypt (ASIC támadásokkal szemben ellenálló) és PBKDF2. A SHA-256 és SHA-512 nem alkalmasak jelszavakhoz — túl gyorsak és nem védenek a tömeges brute-force ellen.
Ütközés — az a helyzet, amikor két különböző bemeneti adathalmaz ugyanazt a hasht adja. Kriptográfiai hashfüggvények esetében az ütközések megtalálásának számítási szempontból lehetetlennek kell lennie. Például a SHA-256 ütközés valószínűsége két véletlenszerű üzenet esetén körülbelül 1 a 2^128-hoz — ez elenyészően kicsi érték.
Nem, a bcrypt automatikusan tartalmaz sót az algoritmusában. A BCrypt.hashToString() meghívásakor a könyvtár kriptográfiailag erős, 16 bájt hosszúságú sót generál, és beágyazza a kimeneti karakterláncba a hash-szel és a költségparaméterrel együtt. A scrypt és Argon2 is hasonlóan működik. Ez az egyik oka annak, hogy a szakértők speciális KDF használatát ajánlják az általános hashfüggvények helyett a jelszavak védelmére.
Igen, a hasheket használják fájlok fehér és fekete listáinak létrehozására. Az antivírus adatbázisok ismert káros programok hasheit tartalmazzák. Azonban a támadók megváltoztathatnak egy bájtot a programban, ami teljesen megváltoztatja a hasht. Ezért a modern rendszerek fuzzy-hashelést (SSDeep, TLSH) használnak, amely szemantikailag hasonló fájlokat talál, nem csak pontos egyezéseket.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is