Hašování — co to je, kryptografické algoritmy a použití

Autor: IT Sectr Publikováno: 2026-04-02 Doba čtení: 8 min

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šovací funkce převádí vstupní data na řetězec pevné délky — digest.
  • Kryptografické haše mají vlastnost nevratnosti: podle haše nelze obnovit původní data.
  • SHA-256 — standard kryptografického hašování doporučený NIST pro moderní systémy.
  • Sůl — náhodná data přidávaná k heslu před hašováním pro ochranu proti duhovým tabulkám.
  • Hašování je široce používáno v mobilních aplikacích pro ukládání hesel a kontrolu integrity dat.

Co je hašování?

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é.

Základní vlastnosti hašovacích funkcí

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).

Rozdíl mezi hašováním a šifrováním

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.

Kryptografické a nekryptografické hašovací funkce

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.

Kryptografické hašovací funkce

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í.

Nekryptografické hašovací funkce

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.

TypPříkladyOblast použití
KryptografickéSHA-256, SHA-3, bcryptHesla, podpisy, TLS
NekryptografickéMurmurHash, xxHashHašovací tabulky, cache
KDF pro heslabcrypt, scrypt, Argon2Uklá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

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 — nástupce SHA-2

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.

kotlin
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) }
}

bcrypt pro hesla

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.

kotlin
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 — moderní standard

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ů.

Použití hašování v mobilních aplikacích

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í.

Ukládání hesel

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.

Kontrola integrity souborů

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í.

Cache a deduplikace

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.

kotlin
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
}

Typické chyby při používání hašů

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.

Použití MD5 nebo SHA-1

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í bez soli

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.

Nedostatečný počet iterací

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

Jaký je rozdíl mezi hašováním a šifrováním?

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.

Který hašovací algoritmus je nejlepší pro hesla?

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.

Co je kolize hašovací funkce a proč je nebezpečná?

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.

Je třeba přidávat sůl do bcrypt ručně?

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.

Lze použít hašování k ochraně proti škodlivému softwaru?

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í

  • Hašování — jednosměrný převod dat na řetězec pevné délky se zárukou nevratnosti.
  • Kryptografické hašovací funkce poskytují odolnost proti kolizím a lavinový efekt.
  • SHA-256 — standard NIST pro kryptografické hašování v moderních systémech.
  • KDF pro hesla (bcrypt, Argon2, scrypt) jsou povinné pro bezpečné ukládání hesel.
  • Sůl chraní před duhovými tabulkami a musí být pro každého uživatele jedinečná.
  • MD5 a SHA-1 jsou považovány za prolomené a neměly by být používány v nových projektech.
  • Hašování se používá pro ukládání hesel, kontrolu integrity dat, cache a antivirovou ochranu.

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í.

Prodiskutovat projekt

Přečtěte si také