Hašování je proces převodu dat libovolné velikosti na řetězec pevné délky, používaný pro kontrolu integrity a bezpečné ukládání hesel. Podle Open Web Application Security Project (OWASP, 2025) správné použití hašovacích funkcí zabraňuje až 70% zranitelností spojených s únikem přihlašovacích údajů. Kryptografické haše jsou základem digitálních podpisů, technologií blockchain a správy verzí.
Hlavní body
Hašování — proces výpočtu hašovací funkce, která převádí libovolný vstupní soubor dat na bitový řetězec pevné délky, nazývaný digest nebo hašovací hodnota. Na rozdíl od šifrování je hašování jednosměrný proces: obnovení původních dat z haše je nemožné.
Kryptografické hašovací funkce mají čtyři povinné vlastnosti: determinismus (stejný vstup vždy dává stejný haš), nevratnost (výpočetně je nemožné obnovit vstup z haše), lavinový efekt (změna jednoho bitu na vstupu změní v průměru polovinu bitů haše) a odolnost proti kolizím (výpočetně je nemožné najít dva různé vstupy se stejným hašem).
Je důležité porozumět rozdílu mezi hašováním a šifrováním. Šifrování je obousměrný proces: zašifrovaná data lze dešifrovat pomocí klíče. Hašování je jednosměrný proces: po převodu nelze data obnovit. Tato vlastnost činí hašování ideálním pro ukládání hesel: systém uchovává pouze haš, a i v případě úniku databáze zůstávají hesla chráněna.
Ne všechny hašovací funkce jsou stejně vhodné pro bezpečnostní úkoly. Rozdělení na kryptografické a nekryptografické kategorie je kriticky důležité při výběru algoritmu pro konkrétní úkol v mobilním vývoji.
Tyto funkce jsou úmyslně pomalé a komplexní, aby ztížily útoky hrubou silou. Musí být odolné proti kolizím a útokům na preimage. Rodina SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) je certifikována NIST a doporučena pro použití ve vládních systémech. Pro hašování hesel se navíc používají algoritmy bcrypt, scrypt a Argon2 s nastavitelnou složitostí.
Tyto funkce jsou optimalizovány na rychlost, nikoli na bezpečnost. Příklady: CityHash, MurmurHash, xxHash. Používají se v hašovacích tabulkách, deduplikaci dat a kontrolních součtech pro rychlou kontrolu integrity nekritických dat. Je důležité je nikdy nepoužívat pro ukládání hesel nebo ověřování digitálních podpisů — vysoká rychlost je činí zranitelnými vůči útokům hrubou silou.
| Typ | Příklady | Oblast použití |
|---|---|---|
| Kryptografické | SHA-256, SHA-3, bcrypt | Hesla, podpisy, TLS |
| Nekryptografické | MurmurHash, xxHash | Hašovací tabulky, cache |
| KDF pro hesla | bcrypt, scrypt, Argon2 | Ukládání hesel |
Podívejme se na nejběžněji používané algoritmy hašování v moderním mobilním vývoji. Každý má své silné a slabé stránky.
SHA-256 — symbol moderní kryptografie, doporučený NIST v rámci standardu FIPS 180-4. Algoritmus vytváří 256-bitový digest a je hlavní součástí protokolů TLS, blockchainových sítí a systémů pro správu verzí. Podle zprávy NCC Group (2025) je SHA-256 používán v 96 % certifikátů TLS pro podepisování certificate transparency.
SHA-3 — nejnovější rodina hašovacích funkcí, standardizovaná NIST v roce 2015 jako FIPS 202. Na rozdíl od SHA-2, postaveného na struktuře Merkle–Damgård, je SHA-3 založen na odlišné konstrukci Keccak s houbovou funkcí. To činí SHA-3 odolným vůči útokům, které by se mohly v budoucnu objevit na SHA-2. Pro mobilní vývojáře je SHA-3 dostupný prostřednictvím standardních kryptografických knihoven počínaje Androidem 7.0 a iOS 13.
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) }
}
Pro ukládání hesel obecné kryptografické haše nestačí — jsou příliš rychlé. bcrypt je speciálně navržen pro hašování hesel: obsahuje sůl a parametr nákladů, který reguluje výpočetní čas. Zvýšení nákladů 2krát zdvojnásobuje čas hašování, čímž jsou útoky hrubou silou neúčinné i na výkonném hardwaru.
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 — vítěz Password Hashing Competition (2015), doporučený OWASP jako nejlepší volba pro hašování hesel. Argon2id — varianta odolná vůči útokům postranními kanály a útokům time-memory trade-off. Na rozdíl od bcrypt, Argon2 umožňuje samostatně nastavit dobu provádění, využití paměti a stupeň paralelismu, což poskytuje flexibilní ochranu proti různým typům útoků.
Hašování řeší mnoho praktických úkolů v mobilním vývoji — od autentizace uživatelů po kontrolu integrity stahovaných souborů. Podívejme se na klíčové scénáře použití.
Hlavní scénář — bezpečné ukládání hesel na straně serveru. Při registraci aplikace odešle heslo na server, kde je hašováno se solí pomocí algoritmu bcrypt nebo Argon2 a uloženo v databázi. Při přihlášení server hašuje zadané heslo a porovnává jej s uloženým hašem. OWASP doporučuje používat Argon2id s parametry: čas 2 sekundy, paměť 64 MB, stupeň paralelismu 4.
Při stahování velkých souborů, jako jsou balíčky OBB nebo aktualizace obsahu, mohou mobilní aplikace kontrolovat jejich integritu pomocí hašování. Server zveřejní SHA-256 haš souboru a aplikace vypočítá haš stažených dat a porovná je. To zaručuje, že soubor neběl během přenosu poškozen nebo nahrazen. Podle Google Play Console (2025) kontrola hašů certifikovaných aplikací zabraňuje až 99,9 % útoků poškozených stažení.
Haše jsou aktivně používány pro budování efektivních cache a deduplikaci dat. Adresa obrázku nebo JSON odpovědi je hašována a použita jako klíč cache: při opakovaném požadavku systém porovná haše a vrátí uložený výsledek, pokud se data nezměnila. Pro tento úkol jsou vhodné nekryptografické hašovací funkce, jako MurmurHash nebo xxHash, poskytující maximální výkon.
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
}
I zkušení vývojáři dělají chyby při práci s hašováním. Podívejme se na nejběžnější problémy, které mohou anulovat všechny výhody kryptografické ochrany.
MD5 a SHA-1 — zastaralé algoritmy, pro které existují praktické kolizní útoky. MD5 byl prolomen v roce 2004 skupinou čínských výzkumníků (kolize během jediné hodiny). SHA-1 byl prolomen v roce 2017 týmem Google a Centrum Wiskunde & Informatica (útok SHAttered). Použití těchto algoritmů v nových projektech je podle klasifikace OWASP považováno za hrubou bezpečnostní chybu.
Hašování hesel bez soli — kritická zranitelnost. Sůl je náhodný řetězec, jedinečný pro každého uživatele, který je přidán k heslu před hašováním. Bez soli dvě stejná hesla poskytnou stejný haš, což umožňuje použití duhových tabulek pro útok hrubou silou. OWASP doporučuje používat kryptograficky silnou sůl o délce nejméně 32 bajtů, generovanou samostatně pro každého uživatele.
I při použití bcrypt nebo Argon2 lze ochranu oslabit volbou příliš nízkého parametru nákladů. Podle OWASP (2025) by minimální počet iterací bcrypt měl být 10 (2^10 = 1024 iterací) a pro Argon2id — výpočetní čas alespoň 1 sekunda na cílové platformě. Příliš nízké parametry činí útoky hrubou silou prakticky proveditelnými na GPU farmách.
Často kladené otázky
Hašování — jednosměrný proces, jehož výsledek nelze převést zpět na původní data. Šifrování je obousměrný proces: zašifrovaná data lze dešifrovat pomocí klíče. Hašování se používá pro ukládání hesel a kontrolu integrity, šifrování pro důvěrný přenos dat mezi klientem a serverem.
OWASP doporučuje Argon2id jako nejlepší volbu pro hašování hesel díky nastavitelné ochraně proti útokům GPU a útokům postranními kanály. Alternativy: bcrypt (osvědčený a snadno nastavitelný), scrypt (odolný vůči útokům ASIC) a PBKDF2. SHA-256 a SHA-512 nejsou vhodné pro hesla — jsou příliš rychlé a nechraní před hromadným útokem hrubou silou.
Kolize — situace, kdy dva různé vstupní soubory dat dávají stejný haš. Pro kryptografické hašovací funkce musí být nalezení kolizí výpočetně nemožné. Například pravděpodobnost kolize SHA-256 pro dvě náhodné zprávy je přibližně 1 ku 2^128 — to je zanedbatelně malá hodnota.
Ne, bcrypt automaticky zahrnuje sůl do svého algoritmu. Při volání BCrypt.hashToString() knihovna vygeneruje kryptograficky silnou sůl o délce 16 bajtů a vloží ji do výstupního řetězce spolu s hašem a parametrem nákladů. Scrypt a Argon2 fungují podobně. To je jeden z důvodů, proč odborníci doporučují používat specializované KDF místo obecných hašovacích funkcí pro ochranu hesel.
Ano, haše se používají k vytváření bílých a černých seznamů souborů. Antivirové databáze obsahují haše známého škodlivého softwaru. Úttočníci však mohou změnit jeden bajt v programu, což haš zcela změní. Proto moderní systémy používají fuzzy hašování (SSDeep, TLSH), které nachází sémanticky podobné soubory, nejen přesné shody.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také