Hashovací funkce
Z MiS
(Rozdíly mezi verzemi)
m (→Hashovací funkce: Oprava odkazu.) |
(Dodána utilita certutil.) |
||
(Není zobrazeno 7 mezilehlých verzí od 1 uživatele.) | |||
Řádka 1: | Řádka 1: | ||
[[Category:VSE]][[Category:Informatika]][[Category:Sítě]][[Category:Zabezpečení]] | [[Category:VSE]][[Category:Informatika]][[Category:Sítě]][[Category:Zabezpečení]] | ||
+ | |||
+ | <div class="Poznamka"> | ||
+ | Při použití hashovacích funkcí neříkejte, že zprávu ''zašifrujeme''!!! | ||
+ | |||
+ | Viz také: [[K%C3%B3dov%C3%A1n%C3%AD-%C5%A1ifrov%C3%A1n%C3%AD-hashov%C3%A1n%C3%AD]] | ||
+ | </div> | ||
+ | |||
== Hashovací funkce == | == Hashovací funkce == | ||
Je to matematické funkce s následujícími vlastnostmi: | Je to matematické funkce s následujícími vlastnostmi: | ||
− | *vstup: | + | * vstup: libovolná posloupnost byte (zpráva, soubor,...) |
− | *výstup: číslo pevné délky (daný počet bitů) | + | * výstup: číslo pevné délky (daný počet bitů) |
* splňuje [[Hashovací_funkce#Požadavky | požadavky]] viz dále. | * splňuje [[Hashovací_funkce#Požadavky | požadavky]] viz dále. | ||
− | |||
− | |||
− | = | + | <div class="Poznamka">Různé vstupní texty tedy mohou generovat stejný výstup. Nelze se tomu úplně vyhnout, ale snažíme se, aby to bylo co nejméně pravděpodobné. Označuje se to jako ''kolize''.</div> |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | Výstup hashovací funkce nazýváme „otisk“ (fingerprint). | ||
+ | * Výstup obvykle zapisujeme v šestnáctkové soustavě. | ||
− | == | + | <div class="Priklad">Jako příklad použijme funkci SHA256: |
− | ; | + | * pro vstupní text: <code>pokus</code> |
− | * | + | *je otiskem 256tibitové číslo: <code>483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.</code> |
− | * | + | </div> |
+ | |||
+ | |||
+ | |||
+ | == Použití == | ||
+ | |||
+ | === Ukládání hesel === | ||
+ | * Na servery se dnes běžně přihlašujeme. To ale znamená, že naše heslo musí být někde na serveru uloženo. | ||
+ | * Přitom ale nechceme, aby správce serveru mohl heslo vidět. Vadí nám také, že kdyby se útočník dostal k databázi hesel, mohl by hesla přečíst a zveřejnit, nebo zneužít. | ||
+ | * Proto do databáze ukládáme pouze ''otisk'' hesla, vygenerovaný hashovací funkcí. | ||
+ | |||
+ | ; Postup při přihlašování | ||
+ | * Zadáte do vstupního okénka heslo. | ||
+ | * Počítač vygeneruje otisk hesla a porovná ho s otiskem, který je v databázi již uložen. | ||
+ | * Pokud se otisky shodují, přihlásí vás. | ||
+ | |||
+ | <div class="Poznamka"> | ||
+ | Všimněte si, že teoreticky se může stát, že někdo zadá '''jiný''' text než vaše heslo, a přesto ho systém přihlásí, protože se náhodou budou shodovat otisky vašeho hesla a zadaného textu. | ||
+ | |||
+ | U dobrých hashovacích funkcí splňujících [[#Požadavky|požadavky]] by taková situace měla být nepravděpodobná. | ||
+ | </div> | ||
+ | |||
+ | === Elektronický (digitální) podpis === | ||
+ | * Viz [[Elektronický podpis]] | ||
+ | |||
+ | === Ověření správnosti staženého souboru === | ||
+ | * Výrobce software na webu publikuje kromě souboru ke stažení i jeho otisk. | ||
+ | * Dnes je celkem běžné, že pro úsporu přenosové kapacity může prohlížeč soubor stáhnout z jiného, bližšího serveru (tzv. ''zrcadla/mirror''), kde je kopie dokumentu také uložená. Přitom by se ale teoreticky mohlo stát, že kopie bude záměrně poškozená, například do ní někdo přidá malware. | ||
+ | * Po stažení souboru ze serveru třetí strany proto vygenerujeme otisk staženého souboru a porovnáme ho s originálním otiskem od výrobce software. | ||
+ | * Pokud by s dokumentem někdo manipuloval, otisky by se lišily. Zároveň jsme zbytečně nezatěžovali server výrobce SW, protože otisk je malý (obvykle do 512 B), takže jeho stažení je rychlé. | ||
+ | * Na velikosti původního souboru přitom nezáleží, ten může mít klidně několik GB. Velikost otisku je pořád stejná. | ||
+ | |||
+ | |||
+ | |||
+ | == Požadavky na hashovací funkce == | ||
+ | Aby hashovací funkce plnila svou funkcí, potřebujeme, aby splňovala následující požadavky: | ||
+ | |||
+ | ; 1) Musí být výpočetně náročné získat z otisku vstupní text. | ||
+ | : Například aby z otisku v databázi nešlo zjistit původní heslo. | ||
+ | |||
+ | ; 2) Musí být výpočetně náročné vyrobit (libovolný) text se zadaným otiskem | ||
+ | : Potom by ten, kdo zná otisk hesla, sice nemohl zjistit heslo, ale vyrobil by si nějaký vstup, který bude mít stejný otisk jako heslo. | ||
+ | |||
+ | ; 3) Musí být výpočetně náročné vyrobit dva texty se stejným otiskem | ||
+ | : Pak by jeden text šel podsunout za druhý, aniž by se to poznalo pomocí otisku. | ||
+ | |||
+ | ; 4) Výpočet hashovací funkce (získání otisku ze vstupu) nesmí být příliš výpočetně náročný. | ||
+ | : Například: Pokud se k velkým serverům přihlašují desítky uživatelů, ověřování otisků nesmí přetížit server. | ||
+ | : Na druhou stranu postup nesmí být ani příliš rychlý, protože pak by bylo snazší útočit „hrubou silou“ — zkoušet postupně různé vstupy tak dlouho, až objevím vstup se správným otiskem.<br />(Například pokud získám otisk hesla, pak hledat heslo postupným zkoušením všech možných vstupů.) | ||
+ | |||
+ | ; 5) Stejný vstup musí generovat vždy stejný otisk | ||
+ | : (To platí u každé matematické funkce.) | ||
+ | : Pokud zadáme správné heslo, otisk se samozřejmě musí shodovat. | ||
+ | |||
+ | ; 6) Podobné vstupy musí generovat velmi odlišné otisky (podobnost vstupů se neprojeví v podobnosti otisků) | ||
+ | : Aby nešlo „tipovat“ a postupnými úpravami se snáze dopracovat k původnímu vstupu, který generuje daný otisk. | ||
+ | |||
+ | |||
+ | |||
+ | == Příklady hashovacích funkcí == | ||
; MD5 | ; MD5 | ||
− | * | + | * Dnes už není považována za bezpečnou pro šifrování a elektronický podpis. |
+ | * Pro svou relativně malou výpočetní náročnost se ale používá pro kontrolu správnosti stažených souborů. | ||
* 128bitový otisk | * 128bitový otisk | ||
+ | |||
; Tiger | ; Tiger | ||
* Stejní autoři jako šifrovací metoda Serpent | * Stejní autoři jako šifrovací metoda Serpent | ||
+ | ; SHA | ||
+ | * Pro šifrování a elektronický podpis (a ukládání hesel) se dnes (2020) doporučuje standard SHA verze 2 s délkou otisku 256 či 512 bitů. | ||
+ | * (Existuje i varianta SHA verze 2 s délkou otisku 224 bitů.) | ||
+ | * Existuje i SHA verze 3 — používá jiný algoritmus. | ||
+ | * V nových aplikacích se nedoporučuje používat SHA-1 (délka otisku 160 bitů) — má obdobné problémy jako MD5. | ||
− | = | + | <div class="Priklad">Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text: |
− | + | [http://www.xorbin.com/tools/sha256-hash-calculator XorBin.com → SHA256 Hash Calculator] | |
− | + | </div> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | == Nástroje == | + | |
+ | == Nástroje pro výpočet funkcí == | ||
; HashCalc | ; HashCalc | ||
* Generování otisku souboru nebo zadaného textu. | * Generování otisku souboru nebo zadaného textu. | ||
* Podporuje mnoho hashovacích funkcí. | * Podporuje mnoho hashovacích funkcí. | ||
+ | * Odkaz ke stažení: [https://www.slavasoft.com/hashcalc/ https://www.slavasoft.com/hashcalc/] | ||
+ | |||
+ | ; On-line generátory otisků | ||
+ | * [http://www.xorbin.com/tools/sha256-hash-calculator XorBin.com → SHA256 Hash Calculator] | ||
+ | * [https://www.md5online.org/ MD5 on-line] | ||
+ | * ... a další. | ||
+ | |||
+ | ; Generátory v příkazovém řádku | ||
+ | * V GNU/Linuxu bývají zahrnuty příkazy pro generování otisků | ||
+ | sha256 ''text'' | ||
+ | * Ve Windows: | ||
+ | certutil -hashfile ''nazev-souboru'' ''HashFunkce'' | ||
+ | <div class="Priklad">certutil -hashfile setup.exe SHA512</div> | ||
+ | * Ve [[Powershell: Základy|Windows Powershellu]] je commandlet: <code>[[Powershell: Cmdlets|Get-FileHash]] ''soubor'' [-Algorithm MD5]</code> | ||
+ | Get-FileHash ''setup.exe'' | ||
+ | |||
+ | ; Knihovny programovacích jazyků | ||
+ | * Většina programovacích jazyků má připraveny knihovny pro výpočet hashovacích funkcí. | ||
+ | * Například v PHP jsou funkce: | ||
+ | ** <code>[https://www.php.net/manual/en/function.md5.php md5($vstup)]</code> | ||
+ | ** <code>[https://www.php.net/manual/en/function.hash.php hash($algoritmus, $vstup)]</code> | ||
+ | |||
+ | |||
+ | |||
+ | == Zdroje == | ||
+ | * [https://security.blogoverflow.com/2013/09/about-secure-password-hashing/ Security.BlogOverflow.com → About secure password hashing] | ||
+ | * [https://www.freecodecamp.org/news/md5-vs-sha-1-vs-sha-2-which-is-the-most-secure-encryption-hash-and-how-to-check-them/ Freecodecamp.org → MD5 vs. SHA-1 vs. SHA-2] |
Aktuální verze z 19. 8. 2020, 12:56
Při použití hashovacích funkcí neříkejte, že zprávu zašifrujeme!!!
Viz také: Kódování-šifrování-hashování
Obsah |
Hashovací funkce
Je to matematické funkce s následujícími vlastnostmi:
- vstup: libovolná posloupnost byte (zpráva, soubor,...)
- výstup: číslo pevné délky (daný počet bitů)
- splňuje požadavky viz dále.
Různé vstupní texty tedy mohou generovat stejný výstup. Nelze se tomu úplně vyhnout, ale snažíme se, aby to bylo co nejméně pravděpodobné. Označuje se to jako kolize.
Výstup hashovací funkce nazýváme „otisk“ (fingerprint).
- Výstup obvykle zapisujeme v šestnáctkové soustavě.
Jako příklad použijme funkci SHA256:
- pro vstupní text:
pokus
- je otiskem 256tibitové číslo:
483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.
Použití
Ukládání hesel
- Na servery se dnes běžně přihlašujeme. To ale znamená, že naše heslo musí být někde na serveru uloženo.
- Přitom ale nechceme, aby správce serveru mohl heslo vidět. Vadí nám také, že kdyby se útočník dostal k databázi hesel, mohl by hesla přečíst a zveřejnit, nebo zneužít.
- Proto do databáze ukládáme pouze otisk hesla, vygenerovaný hashovací funkcí.
- Postup při přihlašování
- Zadáte do vstupního okénka heslo.
- Počítač vygeneruje otisk hesla a porovná ho s otiskem, který je v databázi již uložen.
- Pokud se otisky shodují, přihlásí vás.
Všimněte si, že teoreticky se může stát, že někdo zadá jiný text než vaše heslo, a přesto ho systém přihlásí, protože se náhodou budou shodovat otisky vašeho hesla a zadaného textu.
U dobrých hashovacích funkcí splňujících požadavky by taková situace měla být nepravděpodobná.
Elektronický (digitální) podpis
Ověření správnosti staženého souboru
- Výrobce software na webu publikuje kromě souboru ke stažení i jeho otisk.
- Dnes je celkem běžné, že pro úsporu přenosové kapacity může prohlížeč soubor stáhnout z jiného, bližšího serveru (tzv. zrcadla/mirror), kde je kopie dokumentu také uložená. Přitom by se ale teoreticky mohlo stát, že kopie bude záměrně poškozená, například do ní někdo přidá malware.
- Po stažení souboru ze serveru třetí strany proto vygenerujeme otisk staženého souboru a porovnáme ho s originálním otiskem od výrobce software.
- Pokud by s dokumentem někdo manipuloval, otisky by se lišily. Zároveň jsme zbytečně nezatěžovali server výrobce SW, protože otisk je malý (obvykle do 512 B), takže jeho stažení je rychlé.
- Na velikosti původního souboru přitom nezáleží, ten může mít klidně několik GB. Velikost otisku je pořád stejná.
Požadavky na hashovací funkce
Aby hashovací funkce plnila svou funkcí, potřebujeme, aby splňovala následující požadavky:
- 1) Musí být výpočetně náročné získat z otisku vstupní text.
- Například aby z otisku v databázi nešlo zjistit původní heslo.
- 2) Musí být výpočetně náročné vyrobit (libovolný) text se zadaným otiskem
- Potom by ten, kdo zná otisk hesla, sice nemohl zjistit heslo, ale vyrobil by si nějaký vstup, který bude mít stejný otisk jako heslo.
- 3) Musí být výpočetně náročné vyrobit dva texty se stejným otiskem
- Pak by jeden text šel podsunout za druhý, aniž by se to poznalo pomocí otisku.
- 4) Výpočet hashovací funkce (získání otisku ze vstupu) nesmí být příliš výpočetně náročný.
- Například: Pokud se k velkým serverům přihlašují desítky uživatelů, ověřování otisků nesmí přetížit server.
- Na druhou stranu postup nesmí být ani příliš rychlý, protože pak by bylo snazší útočit „hrubou silou“ — zkoušet postupně různé vstupy tak dlouho, až objevím vstup se správným otiskem.
(Například pokud získám otisk hesla, pak hledat heslo postupným zkoušením všech možných vstupů.)
- 5) Stejný vstup musí generovat vždy stejný otisk
- (To platí u každé matematické funkce.)
- Pokud zadáme správné heslo, otisk se samozřejmě musí shodovat.
- 6) Podobné vstupy musí generovat velmi odlišné otisky (podobnost vstupů se neprojeví v podobnosti otisků)
- Aby nešlo „tipovat“ a postupnými úpravami se snáze dopracovat k původnímu vstupu, který generuje daný otisk.
Příklady hashovacích funkcí
- MD5
- Dnes už není považována za bezpečnou pro šifrování a elektronický podpis.
- Pro svou relativně malou výpočetní náročnost se ale používá pro kontrolu správnosti stažených souborů.
- 128bitový otisk
- Tiger
- Stejní autoři jako šifrovací metoda Serpent
- SHA
- Pro šifrování a elektronický podpis (a ukládání hesel) se dnes (2020) doporučuje standard SHA verze 2 s délkou otisku 256 či 512 bitů.
- (Existuje i varianta SHA verze 2 s délkou otisku 224 bitů.)
- Existuje i SHA verze 3 — používá jiný algoritmus.
- V nových aplikacích se nedoporučuje používat SHA-1 (délka otisku 160 bitů) — má obdobné problémy jako MD5.
Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text:
Nástroje pro výpočet funkcí
- HashCalc
- Generování otisku souboru nebo zadaného textu.
- Podporuje mnoho hashovacích funkcí.
- Odkaz ke stažení: https://www.slavasoft.com/hashcalc/
- On-line generátory otisků
- XorBin.com → SHA256 Hash Calculator
- MD5 on-line
- ... a další.
- Generátory v příkazovém řádku
- V GNU/Linuxu bývají zahrnuty příkazy pro generování otisků
sha256 text
- Ve Windows:
certutil -hashfile nazev-souboru HashFunkce
certutil -hashfile setup.exe SHA512
- Ve Windows Powershellu je commandlet:
Get-FileHash soubor [-Algorithm MD5]
Get-FileHash setup.exe
- Knihovny programovacích jazyků
- Většina programovacích jazyků má připraveny knihovny pro výpočet hashovacích funkcí.
- Například v PHP jsou funkce:
Zdroje
- Security.BlogOverflow.com → About secure password hashing
- Freecodecamp.org → MD5 vs. SHA-1 vs. SHA-2