Hashovací funkce

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Vytvoření stránky)
 
(Dodána utilita certutil.)
 
(Není zobrazeno 8 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: libovolný text
+
* 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.
Výstup nazýváme „otisk“ (fingerprint).
+
<div class="Poznamka">Různé vstupní texty tedy mohou generovat stejný výstup.</div>
+
  
== Požadavky ==
+
<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>
Aby hashovací funkce plnila svou funkcí, musí být výpočetně složité:
+
* získat z otisku vstupní text
+
* vyrobit (libovolný) text se zadaným stejným otiskem
+
* vyrobit dva texty se stejným otiskem
+
Dále:
+
* stejný vstup generuje stejný otisk
+
* podobné vstupy generují velmi odlišné otisky (podobnost vstupů se neprojeví v podobnosti otisků)
+
  
 +
Výstup hashovací funkce nazýváme „otisk“ (fingerprint).
 +
* Výstup obvykle zapisujeme v šestnáctkové soustavě.
  
== Příklady ==
+
<div class="Priklad">Jako příklad použijme funkci SHA256:
; SHA
+
* pro vstupní text: <code>pokus</code>
* Verze SHA-1, SHA-2 (délky klíčů 224, 256 a 512 bitů).
+
*je otiskem 256tibitové číslo: <code>483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.</code>
* V nových aplikacích se nedoporučuje používat SHA-1 (2012: V tuto chvíli považována ještě za bezpečnou, ale délka klíče 160 bitů nejspíš do budoucna bezpečná nebude.)
+
</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&nbsp;databázi hesel, mohl by hesla přečíst a&nbsp;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&nbsp;porovná ho s&nbsp;otiskem, který je v&nbsp;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&nbsp;přesto ho systém přihlásí, protože se náhodou budou shodovat otisky vašeho hesla a&nbsp;zadaného textu.
 +
 
 +
U&nbsp;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&nbsp;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&nbsp;porovnáme ho s&nbsp;originálním otiskem od výrobce software.
 +
* Pokud by s&nbsp;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&nbsp;otisku vstupní text.
 +
: Například aby z&nbsp;otisku v&nbsp;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&nbsp;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“ &mdash; 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&nbsp;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&nbsp;postupnými úpravami se snáze dopracovat k&nbsp;původnímu vstupu, který generuje daný otisk.
 +
 
 +
 
 +
 
 +
== Příklady hashovacích funkcí ==
 
; MD5
 
; MD5
* dnes už není považována za bezpečnou
+
* Dnes už není považována za bezpečnou pro šifrování a&nbsp;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&nbsp;elektronický podpis (a&nbsp;ukládání hesel) se dnes (2020) doporučuje standard SHA verze 2 s&nbsp;délkou otisku 256 či 512&nbsp;bitů.
 +
* (Existuje i&nbsp;varianta SHA verze&nbsp;2 s&nbsp;délkou otisku 224 bitů.)
 +
* Existuje i SHA verze 3 &mdash; používá jiný algoritmus.
 +
* V nových aplikacích se nedoporučuje používat SHA-1 (délka otisku 160 bitů) &mdash; má obdobné problémy jako MD5.
  
== Použití ==
+
<div class="Priklad">Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text:
* ukládání hesel
+
[http://www.xorbin.com/tools/sha256-hash-calculator XorBin.com &rarr; SHA256 Hash Calculator]
* elektronický (digitální) podpis
+
</div>
* ověření správnosti staženého dokumentu
+
** na stránkách je dokument a jeho otisk
+
** stáhneme dokument
+
** vygenerujeme otisk
+
** porovnáme se správným otiskem.
+
  
  
== 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 &rarr; SHA256 Hash Calculator]
 +
* [https://www.md5online.org/ MD5 on-line]
 +
* ... a další.
 +
 +
; Generátory v&nbsp;příkazovém řádku
 +
* V&nbsp;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&nbsp;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 &rarr; 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 &rarr; 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:

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

Jako příklad použijme funkci SHA256:
  • pro vstupní text: pokus
  • je otiskem 256tibitové číslo: 483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.


Použití

Ukládání hesel

Postup při přihlašování

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


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
Tiger
SHA
Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text:

XorBin.com → SHA256 Hash Calculator


Nástroje pro výpočet funkcí

HashCalc
On-line generátory otisků
Generátory v příkazovém řádku
sha256 text
certutil -hashfile nazev-souboru HashFunkce
certutil -hashfile setup.exe SHA512
Get-FileHash setup.exe
Knihovny programovacích jazyků


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje