Kryptografické hašovací funkce
V této lekci se podíváme na kryptografické hašovací funkce, které nacházejí rozsáhlé uplatnění při rychlé validaci a ověřování.
Na konci lekce budeš mít přehled o:
- Co jsou kryptografické hašovací funkce
- Ukázkách kódu v Pythonu demonstrujících použití hašovacích funkcí
- Aplikacích kryptografického hašování
- Bezpečnosti kryptografického hašování
- Hrozbách pro tyto algoritmy ze strany klasických i kvantových počítačů
Úvod do kryptografického hašování
Hašovací funkce představují cenný konstrukt v kryptografii, protože umožňují validaci s důvěrností. Hašovací funkce tak tvoří důležitou součást mechanismů pro ověřování a integritu dat, jako jsou kódy pro ověřování zpráv na základě hašování (HMAC) a digitální podpisy. Tento článek pojednává o základních myšlenkách a bezpečnostních aspektech kryptografických hašovacích funkcí a nastiňuje potenciální zranitelnosti plynoucí z nástupu kvantových počítačů.
Základní principy a návrh hašovacích funkcí
Existuje mnoho situací, kdy je potřeba provést ověřování a kontrolu integrity levně a bez odhalení soukromých informací straně provádějící validaci.
Například při stahování softwaru ze vzdáleného serveru je potřeba efektivní mechanismus k ověření, že stažený software nebyl od svého vytvoření původním autorem pozměněn. Podobně při ověřování uživatelů webových aplikací by bylo vhodné použít mechanismus, který nevyžaduje fyzické ukládání ani přenos skutečných hesel, což by mohlo ohrozit jejich důvěrnost.
Kryptografické hašovací funkce (CHF) tyto potřeby řeší efektivně a bezpečně.
V zásadě kryptografická hašovací funkce přijme vstup (nebo zprávu) libovolné délky a vrátí řetězec fixní délky n bitů jako výstup. Výstup CHF se také označuje jako digest. Užitečná CHF by měla splňovat několik klíčových vlastností:
- Rovnoměrnost: Digesty produkované CHF by měly být rozloženy rovnoměrně a měly by vypadat náhodně. Cílem je zajistit, aby výstup neodhaloval žádné informace o vstupu.
- Determinismus: Pro daný vstup musí CHF vždy produkovat stejný digest, tedy musí být deterministická.
- Nevratnost: CHF je jednosměrná funkce v tom smyslu, že pro daný digest by mělo být neproveditelné hašování obrátit a získat vstup.
- Přibližná injektivita: Přestože CHF jsou funkce mnoho-na-jeden, měly by vypadat jako funkce jedna-na-jednu. Toho je dosaženo kombinací obrovské velikosti výstupního prostoru s lavinovým efektem, kdy drobné změny na vstupu vedou k drasticky odlišným digestům. Tato vlastnost se nazývá přibližná injektivita.
Díky tomu je možné ověřit část dat vůči původní instanci porovnáním digestu dat s digestem originálu.
- Pokud se oba digesty shodují, můžeme s vysokou pravděpodobností věřit, že data jsou totožná s originálem.
- Pokud se digesty liší, můžeme si být jisti, že data byla pozměněna nebo jsou jinak nepůvodní.
Protože samotné digesty CHF neodhalují skutečný obsah dat ani originál, umožňují validaci při zachování soukromí.
Mathematical description
A hash function can be defined as:
where is the set of all possible strings which we may consider to be binary strings of any length.
Skutečnost, že velikost vstupní domény funkce je neomezená, zatímco ko-doména je omezená, znamená, že je nutně zobrazením mnoho-na-jeden, mapujícím nekonečně mnoho vstupů na libovolný n-bitový řetězec.
Vlastnosti uniformity a determinismu jsou pěkně zachyceny v modelu náhodného orákula kryptografického hašování.
Příklad kryptografického hašování v Pythonu s SHA-256
Tento jednoduchý příklad ukazuje kryptografické hašování pomocí oblíbeného algoritmu SHA-256 poskytnutého knihovnou Python cryptography.
Nejprve ukážeme, jak drobný rozdíl v prostých textech vede k velmi velkému rozdílu v hašových digestech.
# Added by doQumentation — required packages for this notebook
!pip install -q cryptography
# Begin by importing some necessary modules
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
# Helper function that returns the number of characters different in two strings
def char_diff(str1, str2):
return sum(str1[i] != str2[i] for i in range(len(str1)))
# Messages to be hashed
message_1 = b"Buy 10000 shares of WXYZ stock now!"
message_2 = b"Buy 10000 shares of VXYZ stock now!"
print(f"The two messages differ by { char_diff(message_1, message_2)} characters")
The two messages differ by 1 characters
Obě zprávy se liší přesně v jednom znaku.
Dále vytvoříme objekty hash pro umožnění procesu hašování, který zahrnuje volání dvou metod: update a finalize.
Vidíme, že díky lavinovému efektu v CHF SHA-256 vede jednoznakový rozdíl ve vstupních zprávách ke dvěma velmi odlišným digestům.
# Create new SHA-256 hash objects, one for each message
chf_1 = hashes.Hash(hashes.SHA256(), backend=default_backend())
chf_2 = hashes.Hash(hashes.SHA256(), backend=default_backend())
# Update each hash object with the bytes of the corresponding message
chf_1.update(message_1)
chf_2.update(message_2)
# Finalize the hash process and obtain the digests
digest_1 = chf_1.finalize()
digest_2 = chf_2.finalize()
# Convert the resulting hash to hexadecimal strings for convenient printing
digest_1_str = digest_1.hex()
digest_2_str = digest_2.hex()
# Print out the digests as strings
print(f"digest-1: {digest_1_str}")
print(f"digest-2: {digest_2_str}")
print(f"The two digests differ by { char_diff(digest_1_str, digest_2_str)} characters")
digest-1: 6e0e6261b7131bd80ffdb2a4d42f9d042636350e45e184b92fcbcc9646eaf1e7
digest-2: 6b0abb368c3a1730f935b68105e3f3ae7fd43d7e786d3ed3503dbb45c74ada46
The two digests differ by 57 characters
Aplikace kryptografického hašování
Jedinečné vlastnosti CHF je činí vhodnými pro širokou škálu aplikací:
- Kontroly integrity dat: Hašovací funkce lze použít k vytvoření kontrolního součtu pro sadu dat. Jakékoli úpravy dat, úmyslné či náhodné, budou mít za následek jiný kontrolní součet, který upozorní systémy nebo uživatele na změnu. Kontrolní součet je také typicky mnohem kompaktnější než původní data, což kontrolní porovnání velmi urychluje.

Obrázek 1. Bezpečné hašování pro kontroly integrity dat
- Digitální podpisy: Kryptografické haše jsou nezbytné pro fungování digitálních podpisů, protože zahrnují porovnávání kryptograficky hašovaných zpráv za účelem prokázání pravosti a integrity při zachování soukromí.

Obrázek 2. Digitální podpisy
- Blockchain a kryptoměny: Kryptoměny jako Bitcoin silně spoléhají na CHF, zejména při zajišťování integrity transakcí a umožňování konsenzuálních mechanismů jako proof of work.