Hashovací funkce

Hašovací funkce ( angl.  hašovací funkce z hash  - „proměnit se v mleté ​​maso“, „hash“ [1] ) nebo konvoluční  funkce je funkce, která převádí pole vstupních dat libovolné délky na výstupní bitový řetězec nastavená délka, prováděná určitým algoritmem . Transformace provedená hašovací funkcí se nazývá hašování . Vstupní data se nazývají vstupní pole, „ klíč “ nebo „ zpráva “. Výsledek konverze se nazývá " hash ", " hash code ", " hash sum ", "shrnutí zprávy .

Hashovací funkce se používají v následujících případech:

V obecném případě (podle Dirichletova principu ) neexistuje žádná osobní korespondence mezi hash kódem a původními daty. Hodnoty vrácené hashovací funkcí jsou méně rozmanité než hodnoty vstupního pole. Případ, kdy hashovací funkce transformuje více než jedno vstupní pole do stejných souhrnů, se nazývá " kolize ". Pravděpodobnost kolize se používá k hodnocení kvality hašovacích funkcí.

Existuje mnoho hashovacích algoritmů s různými vlastnostmi. Příklady nemovitostí:

Volba té či oné hashovací funkce je dána specifiky řešeného problému. Nejjednodušším příkladem hašovací funkce je orámování dat pomocí kódu cyklické redundance ( CRC , cyclic redundancy code ) . 

Historie

Šifrování zpráv bez možnosti jednoznačného dešifrování, ale pouze za účelem potvrzení přednosti autora, se používá již delší dobu.

Galileo Galilei pozoroval prstence Saturnu , které si spletl s „uši“. Protože si nebyl jistý, ale chtěl prosadit svou prioritu, zveřejnil zprávu s přeskupenými písmeny: smaismrmilmepoetaleumibunenugttauiras . V roce 1610 odhalil původní frázi: Altissimum planetam tergeminum obseruaui , což v latině znamená „pozoroval nejvyšší planetu v trojici“. V době zveřejnění první zprávy tedy původní fráze nebyla zveřejněna, ale byla vytvořena příležitost ji později potvrdit.

V polovině 50. let 16. století viděl prsteny Christian Huygens a zveřejnil zprávu s písmeny uspořádanými abecedně: aaaaaaacccccdeeeeeghiiiiiiiillllmmnnnnnnnnooooppqrrsttttuuuuuu . Po nějaké době byla zveřejněna i původní fráze: Annulo cingitur, tenui plano, nusquam cohaerente, ad eclipticam inclinato  - "Obklopen tenkým plochým prstencem, nikde zavěšený, nakloněný k ekliptice ". Tento případ se liší od použití hashovací funkce, včetně cíle pozdějšího potvrzení nějaké nevyřešené zprávy, pouze tím, že výstupní zpráva nemá pevnou délku, ale je určena délkou vstupu. Ve skutečnosti je řazení písmen původní zprávy podle abecedy nějakou hashovací funkcí, ale pouze s výsledkem bez pevné délky.

V lednu 1953 navrhl Hans Peter Luhn ( německy  Hans Peter Luhn ) (zaměstnanec IBM ) „kódování hash“. Donald Knuth připisuje Hanse jako prvního, kdo předložil systematickou myšlenku „hašování“.

V roce 1956 byl Arnold Dumey ve svém  díle Počítače a automatizace prvním, kdo popsal myšlenku „hašování“, jak jej dnes většina programátorů zná. Dumi zvažoval „hašování“ jako řešení „problému se slovníkem“, navrhl použít zbytek dělení prvočíslem jako „hash adresu“ [ 2] .

V roce 1957 publikoval W. Wesley Peterson v IBM Journal of Research and Development článek o hledání textu ve velkých souborech . Tato práce je považována za první „seriózní“ práci o „hašování“. Wesley v článku definoval „otevřené adresování“, přičemž poukázal na pokles výkonu při mazání. O šest let později vyšla práce Wernera Buchholze ( německy Werner Buchholz ), ve které byla provedena rozsáhlá studie „hashovacích funkcí“. Během několika následujících let bylo „hašování“ široce používáno, ale žádná významná práce nebyla publikována.   

V roce 1967 je „hašování“ v moderním smyslu zmíněno v knize Principles of Digital Computing Systems od Herberta Hellermanna [3] . V roce 1968 publikoval Robert Morris velký  průzkum o „hašování“ v časopise Communications of the ACM . Tato práce je považována za „ klíčovou “ publikaci, která zavádí pojem „hašování“ do vědeckého oběhu a zafixuje termín „hash“, který dříve používali pouze odborníci ( žargon ).

Až do počátku 90. let se v ruskojazyčné literatuře, díky dílům Andreje Petroviče Ershova , slovo „uspořádání“ používalo jako ekvivalent termínu „hašování“ a termín „konflikt“ se používal pro „ kolize “ . ( A.P. Ershov používal „uspořádání“ od roku 1956 ). V ruskojazyčném vydání Algorithms and Data Structures od Niklause Wirtha z roku 1989 se také používá termín „uspořádání“. Bylo také navrženo pojmenovat metodu jiným ruským slovem: " okroshka ". Žádná z těchto možností se však neujala a v ruské literatuře se převážně používá termín „hašování“ [4] .

Typy "hashovacích funkcí"

"Dobrá" hashovací funkce musí splňovat dvě vlastnosti :

Představme si notaci:

to je:

.

Jako příklad "špatné" hašovací funkce můžeme uvést funkci s , která odpovídá desetimístnému přirozenému číslu se třemi číslicemi vybranými ze středu dvacetimístného čtverce čísla . Zdálo by se, že hodnoty „hash kódů“ by měly být rovnoměrně rozloženy mezi „ 000 “ a „ 999 “, ale pro „ skutečná “ data to platí pouze v případě, že „ klíče “ nemají „velký“ počet nuly vlevo nebo vpravo [4] .

Podívejme se na některé jednoduché a spolehlivé implementace „hashovacích funkcí“.

"Hashovací funkce" založené na dělení

1. "Hash kód" jako zbytek dělení počtem všech možných "hash"

Hašovací funkce může vypočítat „hash“ jako zbytek dělení vstupu :

,

kde  je počet všech možných hashů (výstupních dat).

Přitom je zřejmé, že pro sudá bude hodnota funkce sudá pro sudá a lichá - pro liché . Také nepoužívejte číselný systém počítače jako stupeň základu , protože "hash kód" bude záviset pouze na několika číslicích čísla umístěného vpravo, což povede k velkému počtu kolizí . V praxi se obvykle volí jednoduchý ; ve většině případů je tato volba docela uspokojivá.

2. "Hash kód" jako množina koeficientů výsledného polynomu

Hašovací funkce může provádět modulo dvě dělení vstupních dat polynomem . V této metodě to musí být mocnina dvou a binární klíče ( ) jsou reprezentovány jako polynomy , jako „hash kód“ hodnoty koeficientů polynomu získané jako zbytek dělení vstupních dat předběžnou hodnotou. -vybrané polynomy stupně jsou "vzaty" :

Při správné volbě je zaručena absence kolizí mezi téměř identickými klíči [4] .

"Hashovací funkce" založené na násobení

Symbolem označujeme počet čísel, která lze znázornit strojovým slovem . Například pro 32bitové počítače kompatibilní s IBM PC , .

Zvolme nějakou konstantu , aby byla coprime s . Pak by hashovací funkce pomocí násobení mohla vypadat takto:

V tomto případě je na počítači s binárním číselným systémem mocninou dvě a bude sestávat z vysokých bitů pravé poloviny součinu .

Jednou z výhod hashovacích funkcí založených na dělení a násobení je výhodné využití nenáhodnosti skutečných klíčů. Pokud jsou například klíče aritmetický postup (například posloupnost jmen "Jméno 1", "Jméno 2", "Jméno 3"), hashovací funkce, která používá násobení, mapuje aritmetický postup na přibližně aritmetický postup. různých hašovacích hodnot, což sníží počet kolizí oproti náhodné situaci [4] .

Jednou z hašovacích funkcí, které používají násobení, je hašovací funkce, která využívá Fibonacciho hašování . Fibonacciho hašování je založeno na vlastnostech zlatého řezu . Jako konstanta je zde zvoleno celé číslo, nejbližší a coprime k , kde  je zlatý řez [4] .

Hašování řetězce proměnné délky

Výše uvedené metody jsou také použitelné, když je nutné uvažovat klíče skládající se z několika slov nebo klíčů různé délky.

Slova můžete například spojit do jednoho pomocí sčítání modulo nebo operace XOR . Jedním z algoritmů, které na tomto principu pracují, je Pearsonova hashovací funkce.

Pearson hash  je algoritmus navržený Peterem  Pearsonem pro procesory s 8bitovými registry, jehož úkolem je rychle převést řetězec libovolné délky na hash kód. Jako vstup funkce přijme slovo sestávající ze znaků, každý o velikosti 1 bajtu, a vrátí hodnotu v rozsahu od 0 do 255. V tomto případě hodnota hash kódu závisí na každém znaku vstupního slova.

Algoritmus lze popsat následujícím pseudokódem, který bere jako vstup řetězec a používá permutační tabulku :

h := 0 pro každé c v indexu smyčky W := h xor c h := T[index] návrat koncové smyčky h

Mezi výhody algoritmu patří:

  • snadnost výpočtu;
  • absence takových vstupních dat, u kterých je pravděpodobnost kolize největší;
  • možnost modifikace na ideální hašovací funkci [5] .

Jako alternativní metodu pro hashovací klíče sestávající ze znaků ( ) můžeme nabídnout výpočet

[čtyři]

Perfektní hašování

Ideální hašovací funkce je  funkce , která mapuje každý klíč z množiny na množinu celých čísel bez kolizí . V matematice se takové transformaci říká injektivní mapování.

Popis
  1. Funkce se nazývá ideální hashovací funkce, pokud je injektivní na .
  2. Funkce se nazývá minimální ideální hašovací funkce, pokud se jedná o perfektní hašovací funkci a .
  3. Pro celé číslo se funkce nazývá -perfect hash function (k-PHF) for if for each we have .

Ideální hašování se používá, když je potřeba přiřadit klíči jedinečný identifikátor, aniž by se o něm ukládaly jakékoli informace. Příklad použití ideálního (nebo spíše ideálního) hashování: umístění hashů spojených s daty uloženými ve velké a pomalé paměti do malé a rychlé paměti. Velikost bloku lze zvolit tak, aby byla potřebná data načtena z pomalé paměti v jednom požadavku. Podobný přístup se používá například u hardwarových routerů . Ideální hashování se také používá k urychlení práce algoritmů na grafech, pokud se grafová reprezentace nevejde do hlavní paměti [6] .

Univerzální hašování

Univerzální hašování se nazývá hašování, při kterém se nepoužívá jedna konkrétní hašovací funkce, ale hašovací funkce je vybrána z dané rodiny podle náhodného algoritmu . Univerzální hašování se obvykle vyznačuje nízkým počtem kolizí, používá se např. při implementaci hašovacích tabulek a v kryptografii.

Popis

Předpokládejme, že chceme mapovat klíče z prostoru na čísla . Na vstupu algoritmus přijímá data z nějaké sady dimenzí . Sestava není předem známa. Algoritmus by měl zpravidla poskytovat nejmenší počet kolizí , čehož je obtížné dosáhnout pomocí jakékoli konkrétní hašovací funkce. Počet kolizí lze snížit náhodným výběrem hašovací funkce pokaždé, když musíte hašovat. Hašovací funkce je vybrána ze specifické sady hašovacích funkcí nazývané univerzální rodina [7] .

Metody řešení kolizí

Kolize (někdy konflikt [2] nebo kolize) je případ, kdy jedna hashovací funkce pro různé vstupní bloky vrací stejné hashovací kódy.

Techniky pro řešení kolizí v hašovacích tabulkách

Většina prvních článků popisujících hašování se zabývala metodami řešení kolizí v hašovacích tabulkách. Pak byly hashovací funkce použity při vyhledávání textu ve velkých souborech. Existují dva hlavní způsoby řešení kolizí v hašovacích tabulkách:

  1. řetězová metoda (metoda přímého článku);
  2. metoda otevřené adresy.

Při použití metody řetězení jsou v hashovací tabulce uloženy dvojice „ spojený seznam klíčů“ – „hash kód“. Pro každý klíč je pomocí hashovací funkce vypočítán hash kód; pokud byl hash kód získán dříve (pro jiný klíč), klíč je přidán do existujícího seznamu klíčů spárovaných s hash kódem; jinak se vytvoří nový pár "seznam klíčů" - "hash kód" a klíč se přidá do vytvořeného seznamu. Obecně platí, že pokud existují klíče a seznamy, průměrná velikost hashovací tabulky bude . V tomto případě se při prohledávání v tabulce ve srovnání s případem, kdy se vyhledávání provádí postupně, průměrné množství práce sníží přibližně o faktor.

Při použití metody otevřeného adresování ukládá hashovací tabulka páry klíč-hash kód. Pro každý klíč je pomocí hashovací funkce vypočítán hash kód; v tabulce je uložena dvojice "klíč" - "hash kód". V tomto případě se při prohledávání tabulky ve srovnání s případem, kdy se používají propojené seznamy, nepoužívají odkazy, provádí se sekvenční výčet párů „klíč“ - „hash kód“, výčet se zastaví po požadovaném klíči. je nalezeno. Sekvence, ve které se skenují buňky tabulky, se nazývá sekvence sondy [4] .

Kryptografická sůl

K ochraně hesel a digitálních podpisů před paděláním bylo vytvořeno několik metod, které fungují, i když kryptoanalytik ví, jak vytvořit kolize pro použitou hashovací funkci. Jednou z těchto metod je přidat ke vstupním datům tzv. kryptografickou „sůl“  – řetězec náhodných dat; někdy se do hash kódu přidává také „sůl“. Přidáním náhodných dat je mnohem obtížnější analyzovat výsledné hashovací tabulky. Tato metoda se například používá při ukládání hesel v operačních systémech podobných UNIX .

Aplikace hašovacích funkcí

Hashovací funkce jsou široce používány v kryptografii.

Hash se používá jako klíč v mnoha datových strukturách – hašovacích tabulkách , Bloomových filtrech a kartézských stromech .

Kryptografické hašovací funkce

Mezi mnoha existujícími hashovacími funkcemi je obvyklé vyčlenit ty kryptograficky bezpečné používané v kryptografii , protože jsou na ně kladeny další požadavky. Aby byla hašovací funkce považována za kryptograficky bezpečnou, musí splňovat tři základní požadavky, na kterých je založena většina aplikací hašovacích funkcí v kryptografii:

  • nevratnost : pro danou hash hodnotu m by mělo být výpočetně nemožné najít blok dat , pro který ;
  • odolnost proti srážkám prvního druhu : pro danou zprávu M by mělo být výpočetně neproveditelné najít jinou zprávu N , pro kterou ;
  • odolnost proti kolizím typu 2 : mělo by být výpočetně nemožné zachytit pár zpráv , které mají stejný hash.

Tyto požadavky nejsou nezávislé:

  • vratná funkce je nestabilní vůči srážkám prvního a druhého druhu;
  • funkce, která je nestabilní vůči srážkám prvního druhu, je nestabilní vůči srážkám druhého druhu; obráceně to není pravda.

Existence nevratných hašovacích funkcí, pro které je teoreticky nemožný výpočet jakéhokoli předobrazu dané hašovací hodnoty, nebyla prokázána. Obvykle je nalezení reciproční pouze výpočetně obtížný úkol.

Narozeninový útok vám umožňuje najít kolize pro hashovací funkci s průměrnými hodnotami délky n bitů v přibližně výpočtech hashovací funkce. Proto je n - bitová hašovací funkce považována za bezpečnou, pokud se výpočetní složitost hledání kolizí pro ni blíží .

Kryptografické hašovací funkce by měly mít lavinový efekt – při sebemenší změně argumentu se hodnota funkce velmi změní. Zejména hodnota hash nesmí unikat informace ani o jednotlivých bitech argumentu. Tento požadavek je klíčem ke kryptografické síle hashovacích algoritmů, které hashují heslo uživatele pro získání klíče [8] .

Hašování se často používá v algoritmech digitálního podpisu, kde není zašifrována samotná zpráva, ale její hash kód, což zkracuje dobu výpočtu a také zvyšuje šifrovací sílu. Ve většině případů se také místo hesel ukládají hodnoty jejich hash kódů.

Kontrolní součty

Algoritmy výpočtu kontrolního součtu jsou jednoduché, rychlé a snadno implementovatelné hardwarové algoritmy používané k ochraně dat před neúmyslným zkreslením, včetně hardwarových chyb. Z hlediska matematiky jsou takové algoritmy hashovacími funkcemi, které vypočítávají řídicí kód. Řídící kód slouží k detekci chyb, které mohou nastat při přenosu a ukládání informací.

Algoritmy pro výpočet kontrolních součtů jsou desítky a stovkykrát rychlejší než kryptografické hašovací funkce a mnohem jednodušší při provádění hardwaru.

Cenou za tak vysokou rychlost je nedostatečná kryptografická síla – schopnost snadno „přizpůsobit“ zprávu předem známému kontrolnímu součtu. Také bitová šířka kontrolních součtů (typické číslo: 32 bitů) je obvykle nižší než bitová šířka kryptografických hashů (typická čísla: 128, 160 a 256 bitů), což znamená, že může dojít k neúmyslným kolizím.

Nejjednodušší algoritmus pro výpočet kontrolního součtu je rozdělit zprávu (vstupní data) na 32- nebo 16-bitová slova a pak slova sečíst. Takový algoritmus se používá například v protokolech TCP/IP .

Algoritmy kontrolního součtu by měly zpravidla detekovat typické hardwarové chyby, například by měly detekovat několik po sobě jdoucích bitových chyb až do dané délky. Takzvaná rodina algoritmů " cyklického redundantního kódu " tyto požadavky splňuje. Patří mezi ně například algoritmus CRC32 používaný v ethernetových zařízeních a ve formátu komprese dat ZIP .

Kontrolní součet může být například přenášen komunikačním kanálem spolu s hlavním textem (daty). Na přijímací straně lze kontrolní součet přepočítat a porovnat s přenášenou hodnotou. Pokud je nalezena nesrovnalost, přenos je zkomolený a lze požádat o opakování přenosu.

Příkladem využití hašování v každodenním životě je počítání kufrů nesených v zavazadlech. Pro kontrolu bezpečnosti kufrů není nutné kontrolovat bezpečnost každého kufru, stačí si spočítat počet kufrů při nakládání a vykládání. Shoda čísel bude znamenat, že se neztratí ani jeden kufr. To znamená, že počet kufrů je hash kód.

Tato metoda může být doplněna o ochranu přenášených informací před falšováním ( metoda MAC ). V tomto případě je hašování prováděno zabezpečenou funkcí zprávy v kombinaci s tajným klíčem, který zná pouze odesílatel a příjemce zprávy. Kryptanalytik, který zachytil zprávu a hodnotu hashovací funkce, nebude schopen obnovit kód, to znamená, že nebude schopen zfalšovat zprávu (viz ochrana proti imitaci ).

Geometrické hašování

Geometrické hašování je  metoda široce používaná v počítačové grafice a výpočetní geometrii pro řešení problémů v rovině nebo v trojrozměrném prostoru, například k nalezení nejbližších dvojic bodů mezi sadou bodů nebo k hledání identických obrázků. Hašovací funkce v této metodě obvykle vezme jako vstup nějaký metrický prostor a rozdělí jej, čímž vytvoří mřížku buněk. Hashovací tabulka je v tomto případě pole se dvěma nebo více indexy a nazývá se „soubor mřížky“ ( anglicky  grid file ). Geometrické hašování se používá v telekomunikacích při práci s vícerozměrnými signály [9] .

Zrychlení načítání dat

Hashovací tabulka je datová struktura , která umožňuje ukládat dvojice tvaru „klíč“ – „hash kód“ a podporuje operace vyhledávání, vkládání a mazání prvku. Hash tabulky se používají pro urychlení vyhledávání, například když jsou textová pole zapsána do databáze, lze vypočítat jejich hash kód a data umístit do sekce odpovídající tomuto hash kódu. Při vyhledávání dat pak bude nutné nejprve vypočítat hash kód textu a hned se zjistí, ve které sekci se mají hledat. Tzn., že bude nutné hledat ne v celé databázi, ale pouze v jedné z jejích sekcí, a to vyhledávání urychluje.

V tomto případě může být každodenní analogií hašování umístění slov ve slovníku v abecedním pořadí. První písmeno slova je jeho hash kód a při vyhledávání se nevyhledává celý slovník, ale pouze slova, která začínají požadovaným písmenem.

Poznámky

  1. Virt2, 2010 , str. 257.
  2. 1 2 Wirth, 1989 .
  3. Herbert Hellerman. Principy digitálního počítačového systému. NY: McGraw-Hill, 1967, 424 stran.
  4. 1 2 3 4 5 6 7 Knuth, 2007 .
  5. Pearson, Peter K. (červen 1990), Rychlé hašování textových řetězců s proměnnou délkou , Communications of the ACM vol . 33 (6): 677, doi : 10.1145/78973.78978 , < http ://epaperpress/com/vbhash download/p677-pearson.pdf > 
  6. Djamal Belazzougui, Fabiano C. Botelho, Martin Dietzfelbinger. Hash, displace, and komprimovat  (neopr.) . — Springer Berlin / Heidelberg, 2009.
  7. Miltersen, Peter Bro Universal Hashing ( PDF). Archivováno z originálu 24. června 2009.  
  8. Schneier, 2002 .
  9. Wolfson, HJ & Rigoutsos, I (1997). Geometrické hašování: Přehled. IEEE Computational Science and Engineering, 4(4), 10-21.

Literatura

  • Bruce Schneier . Aplikovaná kryptografie. Protokoly, algoritmy, zdrojové texty v jazyce C. - M .: Triumph, 2002. - ISBN 5-89392-055-4 .
  • Donald Knuth . Umění programování. Svazek 3. Třídění a vyhledávání = The Art of Computer Programming, sv.3. Třídění a vyhledávání. — 2. vydání. - M .: " Williams ", 2007. - S. 824. - ISBN 0-201-89685-0 .
  • Niklaus Wirth . Algoritmy a datové struktury. - M .: " Mir ", 1989. - ISBN 5-03-001045-9 .
  • Niklaus Wirth . Algoritmy a datové struktury. Nová verze pro Oberon. - M .: "DMK Press", 2010. - ISBN 978-5-94074-584-6 .

Odkazy