Hashovací funkce

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Odkaz na Get-FileHash a Powershell: Základy)
(Přidán požadavek - výpočet hashovací funkce nesmí být příliš náročný. Zpřehlednění stránky, upřesnění použití, přidány funkce programovacích jazyků.)
Řá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>
 +
  
  
Řádka 8: Řádka 15:
 
* 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.</div>
+
<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 hashovací funkce nazýváme „otisk“ (fingerprint).
Řádka 17: Řádka 24:
 
*je otiskem 256tibitové číslo: <code>483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.</code>
 
*je otiskem 256tibitové číslo: <code>483266AE0E0F9CF73864117EE7A2B14A3FCAF0158487F7E281C7A0BC0D9712CD.</code>
 
</div>
 
</div>
 +
  
  
Řádka 46: Řádka 54:
 
* 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é.
 
* 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á.
 
* 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 ==
 
== Požadavky na hashovací funkce ==
Aby hashovací funkce plnila svou funkcí, musí být výpočetně složité:
+
Aby hashovací funkce plnila svou funkcí, potřebujeme, aby splňovala následující požadavky:
* získat z&nbsp;otisku vstupní text
+
* vyrobit (libovolný) text se zadaný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ů)
+
  
<div class="Poznamka">
+
; 1) Musí být výpočetně složité získat z&nbsp;otisku vstupní text.
Při použití hashovacích funkcí neříkejte, že zprávu ''zašifrujeme''!!!
+
: Například aby z&nbsp;otisku v&nbsp;databázi nešlo zjistit původní heslo.
 +
 
 +
; 2) Musí být výpočetně složité 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ě složité 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 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.
 +
 
 +
; 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.
  
Viz také: [[K%C3%B3dov%C3%A1n%C3%AD-%C5%A1ifrov%C3%A1n%C3%AD-hashov%C3%A1n%C3%AD]]
 
</div>
 
  
  
 
== Příklady hashovacích funkcí ==
 
== Příklady hashovacích funkcí ==
; SHA
 
* Verze SHA-1, SHA-2 (délky klíčů 224, 256 a 512 bitů).
 
* 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.)
 
 
; 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.
  
 
<div class="Priklad">Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text:
 
<div class="Priklad">Zkuste si spočítat hashovací funkci SHA 256 pro své jméno a příjmení, nebo pro jiný text:
Řádka 79: Řádka 101:
  
  
== 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.
Řádka 95: Řádka 118:
 
* Ve [[Powershell: Základy|Windows Powershellu]] je commandlet: <code>[[Powershell: Cmdlets|Get-FileHash]] ''soubor'' [-Algorithm MD5]</code>
 
* Ve [[Powershell: Základy|Windows Powershellu]] je commandlet: <code>[[Powershell: Cmdlets|Get-FileHash]] ''soubor'' [-Algorithm MD5]</code>
 
  Get-FileHash ''setup.exe''
 
  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 ==
 
== Zdroje ==
 
* [https://security.blogoverflow.com/2013/09/about-secure-password-hashing/ Security.BlogOverflow.com &rarr; About secure password hashing]
 
* [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]

Verze z 6. 4. 2020, 07:57


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ě složité 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ě složité 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ě složité 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 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.
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
Get-FileHash setup.exe
Knihovny programovacích jazyků


Zdroje

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