Kako postaviti pametne telefone i računala. Informativni portal

Kriptografska hash funkcija. Što je Hash ili Hashing


Što je hash? Hash funkcija je matematička transformacija informacija u kratki niz specifične duljine.

Zašto je ovo potrebno? Analiza pomoću hash funkcija često se koristi za kontrolu integriteta važnih datoteka operacijskog sustava, važnih programa i važnih podataka. Kontrola se može provoditi prema potrebi i redovito.

Kako se to radi? Prvo, određuju integritet datoteka koje treba nadzirati. Za svaku datoteku, njezina se hash vrijednost izračunava posebnim algoritmom, a rezultat se sprema. Nakon potrebnog vremena, radi se sličan izračun i uspoređuju se rezultati. Ako se vrijednosti razlikuju, tada su informacije sadržane u datoteci promijenjene.

Koje karakteristike treba imati hash funkcija?

  • mora biti u stanju pretvoriti podatke proizvoljne duljine u fiksne;
  • mora imati otvoren algoritam kako biste mogli istražiti njegovu kriptografsku snagu;
  • treba biti jednostran, odnosno ne bi smjela postojati matematička mogućnost određivanja početnih podataka rezultatom;
  • treba se "opreti" sudarima, odnosno ne bi trebao proizvoditi iste vrijednosti za različite ulazne podatke;
  • ne bi trebali zahtijevati velike računalne resurse;
  • pri najmanjoj promjeni ulaznih podataka rezultat bi se trebao značajno promijeniti.

Koji su popularni algoritmi za raspršivanje? Trenutno se koriste sljedeće hash funkcije:

  • CRC - ciklički redundantni kod ili kontrolni zbroj. Algoritam je prilično jednostavan, ima veliki broj varijacija ovisno o potrebnoj izlaznoj duljini. Ne kriptografski!
  • MD 5 je vrlo popularan algoritam. Kao i prethodna verzija, MD 4 je kriptografska funkcija. Veličina hasha je 128 bita.
  • SHA -1 je također vrlo popularna kriptografska funkcija. Veličina hasha je 160 bita.
  • GOST R 34.11-94 - Ruski kriptografski standard za izračunavanje hash funkcija. Veličina hasha je 256 bita.

Kada administrator sustava može koristiti ove algoritme?Često, prilikom preuzimanja bilo kojeg sadržaja, na primjer, programa s web-mjesta proizvođača, glazbe, filmova ili drugih informacija, postoji vrijednost kontrolnog zbroja izračunata prema određenom algoritmu. Iz sigurnosnih razloga, nakon preuzimanja, morate samostalno izračunati hash funkciju i usporediti vrijednost s onim što je navedeno na web stranici ili u privitku datoteke. Jeste li ikada ovo radili?

Što čini prikladnijim izračunavanje hasha? Sada postoji veliki broj takvih uslužnih programa, plaćenih i besplatnih za korištenje. Meni se osobno svidio HashTab. Prvo, tijekom instalacije, uslužni program je ugrađen kao kartica u svojstvima datoteke, drugo, omogućuje vam odabir velikog broja algoritama za raspršivanje, i treće, besplatan je za privatnu nekomercijalnu upotrebu.

Što je ruski? Kao što je gore spomenuto, u Rusiji postoji standard za raspršivanje GOST R 34.11-94, koji naširoko koriste mnogi proizvođači proizvoda za informacijsku sigurnost. Jedan od tih alata je program za popravljanje i praćenje početnog stanja softverskog paketa FIX. Ovaj program je sredstvo za praćenje učinkovitosti korištenja sustava informacijske sigurnosti.

FIX (verzija 2.0.1) za Windows 9x / NT / 2000 / XP

  • Izračun kontrolnih zbroja određenih datoteka pomoću jednog od 5 implementiranih algoritama.
  • Fiksiranje i naknadna kontrola početnog stanja programskog paketa.
  • Usporedba verzija programskog paketa.
  • Fiksiranje i kontrola imenika.
  • Kontrola promjena u određenim datotekama (direktorijima).
  • Formiranje izvještaja u TXT, HTML, SV formatima.
  • Proizvod posjeduje FSTEC certifikat za NDV 3 br. 913 do 01. lipnja 2013. godine.

A što je s digitalnim potpisom? Rezultat izračuna hash funkcije, zajedno s tajnim ključem korisnika, ide na ulaz kriptografskog algoritma gdje se izračunava digitalni potpis. Strogo govoreći, hash funkcija nije dio EDS algoritma, ali se često radi namjerno kako bi se isključio napad korištenjem javnog ključa.

Danas vam mnoge aplikacije za e-trgovinu omogućuju pohranjivanje tajnog ključa korisnika u privatnom području tokena (ruToken, eToken) bez tehničke mogućnosti da ga odatle izvadite. Sam token ima vrlo ograničeno memorijsko područje, mjereno u kilobajtima. Za potpisivanje dokumenta ne postoji način prijenosa dokumenta na sam token, ali prijenos hash dokumenta u token i dobivanje EDS-a na izlazu je vrlo jednostavno.

Napomena: U ovom predavanju formuliran je pojam hash funkcije, kao i kratak pregled algoritama za generiranje hash funkcija. Osim toga, razmatra se mogućnost korištenja algoritama blokovne enkripcije za formiranje hash funkcije.

Svrha predavanja: upoznati se s pojmom "hash funkcije", kao i s principima takvih funkcija.

Koncept hash funkcije

Hash funkcija je matematička ili druga funkcija koja, za niz proizvoljne duljine, izračunava neku cjelobrojnu vrijednost ili neki drugi niz fiksne duljine. Matematički se može napisati ovako:

gdje je M izvorna poruka, koja se ponekad naziva prototip a h je rezultat koji se naziva hash vrijednost (i također hash kod ili sažeti poruke(iz engleskog. sažetak poruke)).

Smisao hash funkcije je odrediti karakterističnu značajku predslike – vrijednost hash funkcije. Ova vrijednost obično ima određenu fiksnu veličinu, kao što je 64 ili 128 bita. Hash kod se može dalje analizirati kako bi se riješio bilo koji problem. Tako se, na primjer, raspršivanje može koristiti za usporedbu podataka: ako dva niza podataka imaju različite hash kodove, zajamčeno je da su nizovi različiti; ako su isti, nizovi su najvjerojatnije isti. U općem slučaju, ne postoji korespondencija jedan-na-jedan između izvornih podataka i hash koda zbog činjenice da je broj vrijednosti hash funkcija uvijek manji od broja varijanti ulaznih podataka. Stoga postoji mnogo ulaznih poruka koje daju iste hash kodove (takve se situacije nazivaju sudara). Vjerojatnost kolizija igra važnu ulogu u procjeni kvalitete hash funkcija.

Hash funkcije se široko koriste u modernoj kriptografiji.

Najjednostavnija hash funkcija može se konstruirati korištenjem operacije "sum modulo 2" na sljedeći način: dobivamo ulazni niz, zbrajamo sve bajtove po modulu 2 i vraćamo bajt rezultata kao vrijednost hash funkcije. Duljina hash vrijednosti u ovom slučaju bit će 8 bita, bez obzira na veličinu ulazne poruke.

Na primjer, pretpostavimo da je originalna digitalizirana poruka bila sljedeća (u heksadecimalnom formatu):

Prevedimo poruku u binarni oblik, napišimo bajtove jedan ispod drugog i dodajmo bitove u svaki stupac po modulu 2:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

Rezultat (0110 0101 (2) ili 65 (16)) bit će vrijednost hash funkcije.

Međutim, takva hash funkcija ne može se koristiti u kriptografske svrhe, na primjer, za generiranje elektroničkog potpisa, jer je vrlo lako promijeniti sadržaj potpisane poruke bez promjene vrijednosti kontrolnog zbroja.

Stoga razmatrana hash funkcija nije prikladna za kriptografske aplikacije. U kriptografiji, hash funkcija se smatra dobrom ako je teško stvoriti dvije predslike s istom hash vrijednošću, a također ako izlaz funkcije ne ovisi eksplicitno o ulazu.

Formulirajmo osnovne zahtjeve za kriptografske hash funkcije:

  • hash funkcija mora biti primjenjiva na poruke bilo koje veličine;
  • izračun vrijednosti funkcije treba obaviti dovoljno brzo;
  • uz poznatu vrijednost hash funkcije, trebalo bi biti teško (gotovo nemoguće) pronaći prikladnu predsliku M;
  • s poznatom porukom M, trebalo bi biti teško pronaći drugu poruku M 's istom hash vrijednošću kao izvorna poruka;
  • trebalo bi biti teško pronaći bilo koji par nasumičnih različitih poruka s istom hash vrijednošću.

Stvaranje hash funkcije koja zadovoljava sve ove zahtjeve nije lak zadatak. Također treba imati na umu da se podaci proizvoljne veličine primaju na ulaz funkcije, a rezultat raspršivanja ne bi trebao biti isti za podatke različitih veličina.

Trenutno se u praksi koriste funkcije kao hash funkcije koje obrađuju blok po blok ulaznu poruku i izračunavaju hash vrijednost h i za svaki blok M i ulazne poruke prema ovisnostima oblika

h i = H (M i, h i-1),

gdje je h i-1 rezultat dobiven pri izračunu hash funkcije za prethodni blok ulaznih podataka.

Kao rezultat toga, izlaz hash funkcije h n je funkcija svih n blokova ulazne poruke.

Korištenje algoritama za šifriranje blokova za generiranje hash funkcije

Možete koristiti blok hash funkciju kao hash funkciju. Ako je korišteni blok algoritam kriptografski siguran, tada će i hash funkcija koja se temelji na njemu također biti pouzdana.

Najjednostavniji način korištenja blok algoritma za dobivanje hash koda je šifriranje poruke u CBC načinu. U ovom slučaju, poruka se prikazuje kao slijed blokova čija je duljina jednaka duljini bloka algoritma šifriranja. Ako je potrebno, zadnji blok s desne strane se dopunjava nulama kako bi se dobio blok željene duljine. Hash vrijednost bit će posljednji šifrirani blok teksta. Pod uvjetom da se koristi pouzdan algoritam za šifriranje bloka, rezultirajuća hash vrijednost imat će sljedeća svojstva:

  • praktički je nemoguće bez poznavanja ključa za šifriranje izračunati hash vrijednost za dani otvoreni niz informacija;
  • praktički je nemoguće odabrati otvorene podatke za danu vrijednost hash funkcije bez poznavanja ključa za šifriranje.

Ovako formirana hash vrijednost obično se naziva imitacijski umetak ili autentifikator a koristi se za provjeru integriteta poruke. Stoga je lažno predstavljanje umetanjem kontrolna kombinacija koja ovisi o otvorenim podacima i informacijama o tajnom ključu. Svrha korištenja simuliranog umetanja je otkriti sve slučajne ili namjerne promjene u nizu informacija. Vrijednost dobivena hash funkcijom prilikom obrade ulazne poruke dodaje se poruci u trenutku kada se zna da je poruka točna. Primatelj provjerava integritet poruke tako što izračunava lažno predstavljanje primljene poruke i uspoređuje je s primljenim hash kodom, koji se mora prenijeti na siguran način. Jedna od takvih sigurnih metoda može biti šifriranje lažnog predstavljanja privatnim ključem pošiljatelja, tj. stvaranje potpisa. Također je moguće šifrirati primljeni hash kod simetričnim algoritmom šifriranja ako pošiljatelj i primatelj imaju zajednički simetrični ključ za šifriranje.

Navedeni postupak za dobivanje i korištenje simuliranog umetka opisan je u domaćem standardu GOST 28147-89. Standard predlaže korištenje najmanje značajnih 32 bita bloka primljenog na izlazu operacije šifriranja cijele poruke u načinu spajanja blokova šifre za kontrolu integriteta poslane poruke. Na isti način, bilo koji blok može se koristiti za formiranje imitacije umetka. simetrični algoritam šifriranja.

Drugi mogući način korištenja blok šifre za generiranje hash koda je sljedeći. Izvorna poruka obrađuje se uzastopno u blokovima. Posljednji blok je dopunjen nulama, ako je potrebno, ponekad se duljina poruke dodaje posljednjem bloku kao binarni broj. U svakoj fazi šifriramo hash vrijednost dobivenu u prethodnoj fazi, uzimajući trenutni blok poruke kao ključ. Posljednja primljena šifrirana vrijednost bit će konačni hash rezultat.

Zapravo, postoji još nekoliko mogućih shema za korištenje blok šifre za formiranje hash funkcije. Neka je M i - blok izvorne poruke, hi - vrijednost hash funkcije u i-toj fazi, f - algoritam šifriranja bloka koji se koristi u načinu jednostavne zamjene, - operacija zbrajanja po modulu 2. Zatim, za na primjer, moguće su sljedeće sheme za generiranje hash funkcije:

U svim ovim shemama, duljina generirane hash vrijednosti jednaka je duljini šifriranog bloka. Sve ove, kao i neke druge sheme za korištenje algoritma blok šifriranja za izračunavanje hash vrijednosti, mogu se primijeniti u praksi.

Glavni nedostatak hash funkcija dizajniranih na temelju blok algoritama je relativno mala brzina rada. Potrebna kriptografska snaga može se postići manjim brojem operacija na ulaznim podacima. Postoje brži algoritmi za raspršivanje, dizajnirani samostalno, od nule, na temelju zahtjeva kriptografske snage (najčešći od njih su MD5, SHA-1, SHA-2 i GOST R 34.11-94).

itd.). Izbor određene hash funkcije određen je specifičnostima problema koji se rješava. Najjednostavniji primjeri hash funkcija su kontrolni zbroj ili CRC.

U općem slučaju, ne postoji korespondencija jedan-na-jedan između izvornih podataka i hash koda. Stoga postoji mnogo nizova podataka koji daju iste hash kodove – takozvane kolizije. Vjerojatnost kolizija igra važnu ulogu u procjeni "kvalitete" hash funkcija.

Kontrolni zbroji

Nekompliciran, iznimno brz i lako implementiran u hardverske algoritme koji se koriste za zaštitu od nenamjernog izobličenja, uključujući hardverske pogreške.

Što se tiče brzine računanja, desetke je i stotine puta brža od kriptografskih hash funkcija, a mnogo jednostavnija u hardverskoj implementaciji.

Plaćanje za tako veliku brzinu je nedostatak kriptografske snage - laka prilika za prilagodbu poruke na unaprijed određeni iznos. Također, obično je bitnost kontrolnih zbroja (tipičan broj: 32 bita) niža od kriptografskih hashova (tipični brojevi: 128, 160 i 256 bita), što znači mogućnost nenamjernih kolizija.

Najjednostavniji slučaj takvog algoritma je dijeljenje poruke na 32- ili 16-bitne riječi i njihovo zbrajanje, što se koristi, na primjer, u TCP / IP.

Obično je takav algoritam potreban za praćenje tipičnih hardverskih pogrešaka, kao što je nekoliko uzastopnih bitova pogreške do zadane duljine. Obitelj algoritama tzv. "Ciklični redundantni kodovi" zadovoljavaju ove zahtjeve. To uključuje, na primjer, CRC32 koji se koristi u ZIP hardveru.

Kriptografske hash funkcije

Među mnogim postojećim hash funkcijama, uobičajeno je razlikovati kriptografski jake one koje se koriste u kriptografiji. Prije svega mora imati kriptografski jaku hash funkciju otpornost na sudar dvije vrste:

Korištenje hashiranja

Hash funkcije se također koriste u nekim strukturama podataka kao što su hash tablice i kartezijanska stabla. Zahtjevi za hash funkciju u ovom slučaju su različiti:

  • dobro miješanje podataka
  • brzi algoritam izračuna

Usklađivanje podataka

Općenito, ova se aplikacija može opisati kao provjera identiteta nekih informacija s izvornikom, bez korištenja izvornika. Za provjeru se koristi hash vrijednost informacija koje se provjeravaju. Dva su glavna smjera ove aplikacije:

Provjera grešaka

Na primjer, kontrolni zbroj može se prenijeti komunikacijskim kanalom zajedno s glavnim tekstom. Na kraju prijema, kontrolni zbroj se može ponovno izračunati i usporediti s prenesenom vrijednošću. Ako se pronađe nepodudarnost, to znači da je došlo do izobličenja tijekom prijenosa i možete zatražiti ponovni pokušaj.

U ovom slučaju, kućni analog haširanja može biti tehnika kada se, prilikom kretanja, broj komada prtljage čuva u memoriji. Zatim, da biste provjerili, ne morate se sjećati svakog kofera, već ih je dovoljno prebrojati. Utakmica će značiti da nijedan kofer nije izgubljen. Odnosno, broj komada prtljage je njegov hash kod.

Provjera šifre

U većini slučajeva, zaporke se ne pohranjuju na ciljne objekte, pohranjuju se samo njihove hash vrijednosti. Nepraktično je pohranjivati ​​pristupne fraze, jer će u slučaju neovlaštenog pristupa datoteci s frazama napadač saznati sve zaporke i moći će ih odmah koristiti, a prilikom pohranjivanja hash vrijednosti znat će samo hash vrijednosti koji nisu reverzibilni u izvorne podatke, u ovom slučaju, u zapornoj frazi. Tijekom postupka provjere autentičnosti izračunava se hash vrijednost unesene šifre i uspoređuje sa pohranjenom.

Primjer u ovom slučaju je OS GNU / Linux i Microsoft Windows XP. Oni pohranjuju samo hash vrijednosti pristupnih fraza s korisničkih računa.

Ubrzavanje dohvaćanja podataka

Na primjer, prilikom pisanja tekstualnih polja u bazi podataka, njihov hash kod se može izračunati i podaci se mogu smjestiti u odjeljak koji odgovara ovom hash kodu. Zatim, kada tražite podatke, prvo ćete morati izračunati hash kod teksta i odmah će se saznati u kojem dijelu ih trebate tražiti, odnosno nećete morati tražiti po cijeloj bazi, već samo u jednom od njegovih dijelova (to uvelike ubrzava pretragu).

Svakodnevni analog raspršivanja u ovom slučaju može biti smještanje riječi u rječnik po abecednom redu. Prvo slovo riječi je njezin hash kod, a prilikom pretraživanja ne pregledavamo cijeli rječnik, već samo traženo slovo.

Popis algoritama

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tigar (Whirlpool
  • IP internetski kontrolni zbroj (RFC 1071)

Linkovi

Zaklada Wikimedia. 2010.

Pogledajte što je "Hash code" u drugim rječnicima:

    Hash kod- rezultat aritmetičke kombinacije sa svim bajtovima programskog koda ili skupa podataka. Rezultat algoritma raspršivanja uključuje samo neke bajtove, a algoritam je izgrađen na način da svaka modifikacija programskog koda ili podataka sa ... ... Službena terminologija

    Hash kod- rezultat aritmetičke kombinacije sa svim bajtovima programskog koda ili skupa podataka. Rezultat algoritma raspršivanja uključuje samo neke bajtove, a algoritam je izgrađen na način da svaka modifikacija programskog koda ili podataka sa ... ...

    kod za provjeru autentičnosti poruke pomoću hash funkcije- (ITU T H.235.3, ITU T H.235.1). Telekomunikacijske teme, osnovni koncepti EN raspršeni kod za provjeru autentičnosti poruke HMAC ... Vodič za tehničkog prevoditelja

    U programiranju, hash tablica je struktura podataka koja implementira sučelje asocijativnog niza, naime, omogućuje vam pohranjivanje parova (ključ, vrijednost) i izvođenje tri operacije: operaciju dodavanja novog para, operaciju pretraživanja i operacija brisanja ... Wikipedia

    MAC (kod za provjeru autentičnosti poruke) znači pružanje zaštite od imitacije u protokolima za provjeru autentičnosti poruka sa sudionicima koji vjeruju jedni drugima u poseban skup znakova koji se dodaje u ... ... Wikipedia

    Hashing (ponekad raspršivanje) pretvara niz ulaznih podataka proizvoljne duljine u izlazni niz bitova fiksne duljine. Takve transformacije nazivaju se i hash funkcijama ili funkcijama preklapanja, a njihovi rezultati ... ... Wikipedia

    Ovaj članak je o kodu. Za metodu brainstorminga pogledajte CRC karticu. Algoritam cikličke provjere redundancije (CRC) za izračunavanje kontrolnog zbroja, dizajniran za provjeru integriteta ... ... Wikipedia

    - (kratica za hash-based message authentication code, message authentication hash code). Imati način da provjerite integritet informacija koje se prenose ili pohranjuju u nepouzdanom okruženju sastavni je i neophodan dio svijeta ... ... Wikipedia

    MI 2891-2004: Preporuka. GSOEE. Opći zahtjevi za softver mjernih instrumenata- Terminologija MI 2891 2004: Preporuka. GSOEE. Opći zahtjevi za softver mjernih instrumenata: To su mjerne informacije prikazane u obliku prikladnom za prijenos, interpretaciju ili obradu. Definicije pojma iz ... ... Rječnik-priručnik pojmova normativne i tehničke dokumentacije

itd.). Izbor određene hash funkcije određen je specifičnostima problema koji se rješava. Najjednostavniji primjeri hash funkcija su kontrolni zbroj ili CRC.

U općem slučaju, ne postoji korespondencija jedan-na-jedan između izvornih podataka i hash koda. Stoga postoji mnogo nizova podataka koji daju iste hash kodove – takozvane kolizije. Vjerojatnost kolizija igra važnu ulogu u procjeni "kvalitete" hash funkcija.

Kontrolni zbroji

Nekompliciran, iznimno brz i lako implementiran u hardverske algoritme koji se koriste za zaštitu od nenamjernog izobličenja, uključujući hardverske pogreške.

Što se tiče brzine računanja, desetke je i stotine puta brža od kriptografskih hash funkcija, a mnogo jednostavnija u hardverskoj implementaciji.

Plaćanje za tako veliku brzinu je nedostatak kriptografske snage - laka prilika za prilagodbu poruke na unaprijed određeni iznos. Također, obično je bitnost kontrolnih zbroja (tipičan broj: 32 bita) niža od kriptografskih hashova (tipični brojevi: 128, 160 i 256 bita), što znači mogućnost nenamjernih kolizija.

Najjednostavniji slučaj takvog algoritma je dijeljenje poruke na 32- ili 16-bitne riječi i njihovo zbrajanje, što se koristi, na primjer, u TCP / IP.

Obično je takav algoritam potreban za praćenje tipičnih hardverskih pogrešaka, kao što je nekoliko uzastopnih bitova pogreške do zadane duljine. Obitelj algoritama tzv. "Ciklični redundantni kodovi" zadovoljavaju ove zahtjeve. To uključuje, na primjer, CRC32 koji se koristi u ZIP hardveru.

Kriptografske hash funkcije

Među mnogim postojećim hash funkcijama, uobičajeno je razlikovati kriptografski jake one koje se koriste u kriptografiji. Prije svega mora imati kriptografski jaku hash funkciju otpornost na sudar dvije vrste:

Korištenje hashiranja

Hash funkcije se također koriste u nekim strukturama podataka kao što su hash tablice i kartezijanska stabla. Zahtjevi za hash funkciju u ovom slučaju su različiti:

  • dobro miješanje podataka
  • brzi algoritam izračuna

Usklađivanje podataka

Općenito, ova se aplikacija može opisati kao provjera identiteta nekih informacija s izvornikom, bez korištenja izvornika. Za provjeru se koristi hash vrijednost informacija koje se provjeravaju. Dva su glavna smjera ove aplikacije:

Provjera grešaka

Na primjer, kontrolni zbroj može se prenijeti komunikacijskim kanalom zajedno s glavnim tekstom. Na kraju prijema, kontrolni zbroj se može ponovno izračunati i usporediti s prenesenom vrijednošću. Ako se pronađe nepodudarnost, to znači da je došlo do izobličenja tijekom prijenosa i možete zatražiti ponovni pokušaj.

U ovom slučaju, kućni analog haširanja može biti tehnika kada se, prilikom kretanja, broj komada prtljage čuva u memoriji. Zatim, da biste provjerili, ne morate se sjećati svakog kofera, već ih je dovoljno prebrojati. Utakmica će značiti da nijedan kofer nije izgubljen. Odnosno, broj komada prtljage je njegov hash kod.

Provjera šifre

U većini slučajeva, zaporke se ne pohranjuju na ciljne objekte, pohranjuju se samo njihove hash vrijednosti. Nepraktično je pohranjivati ​​pristupne fraze, jer će u slučaju neovlaštenog pristupa datoteci s frazama napadač saznati sve zaporke i moći će ih odmah koristiti, a prilikom pohranjivanja hash vrijednosti znat će samo hash vrijednosti koji nisu reverzibilni u izvorne podatke, u ovom slučaju, u zapornoj frazi. Tijekom postupka provjere autentičnosti izračunava se hash vrijednost unesene šifre i uspoređuje sa pohranjenom.

Primjer u ovom slučaju je OS GNU / Linux i Microsoft Windows XP. Oni pohranjuju samo hash vrijednosti pristupnih fraza s korisničkih računa.

Ubrzavanje dohvaćanja podataka

Na primjer, prilikom pisanja tekstualnih polja u bazi podataka, njihov hash kod se može izračunati i podaci se mogu smjestiti u odjeljak koji odgovara ovom hash kodu. Zatim, kada tražite podatke, prvo ćete morati izračunati hash kod teksta i odmah će se saznati u kojem dijelu ih trebate tražiti, odnosno nećete morati tražiti po cijeloj bazi, već samo u jednom od njegovih dijelova (to uvelike ubrzava pretragu).

Svakodnevni analog raspršivanja u ovom slučaju može biti smještanje riječi u rječnik po abecednom redu. Prvo slovo riječi je njezin hash kod, a prilikom pretraživanja ne pregledavamo cijeli rječnik, već samo traženo slovo.

Popis algoritama

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tigar (Whirlpool
  • IP internetski kontrolni zbroj (RFC 1071)

Linkovi

Zaklada Wikimedia. 2010.

  • Hashan Moheyan
  • Hash kod

Pogledajte što je "hash funkcija" u drugim rječnicima:

    Hash funkcija- funkcija koja hashira niz podataka preslikavanjem vrijednosti iz (vrlo) velikog skupa vrijednosti u (značajno) manji skup vrijednosti. Na engleskom: Hash funkcija Vidi također: Kriptografski algoritmi Financijski ... ... Financijski rječnik

    kriptografska hash funkcija- Funkcija koja pretvara tekst proizvoljne duljine u tekst fiksne (u većini slučajeva kraće) duljine. Glavna primjena hash funkcije nalazi se u shemi digitalnog potpisa. Budući da se hash funkcija izračunava brže od digitalnog potpisa, umjesto ... ...

    Jednosmjerna hash funkcija- hash funkcija, koja je računski nepovratna funkcija. Na engleskom: Jednosmjerna hash funkcija Vidi također: Kriptografski algoritmi Financijski rječnik Finam ... Financijski rječnik

    TIGER - hash funkcija- TIGER hash funkcija, koju su razvili Ros Anderson i Eli Biham 1996. godine. TIGER hash funkcija je nova brza hash funkcija koja je dizajnirana da bude vrlo brza na modernim računalima, posebno na 64-bitnim računalima. TIGAR ... ... Wikipedia

    jednosmjerna hash funkcija- Za jednosmjernu funkciju, računski je nemoguće pronaći dva različita argumenta za koje su njezine vrijednosti iste. [] Teme informacijska sigurnost EN jednosmjerna hash funkcija ... Vodič za tehničkog prevoditelja

    tigar (hash funkcija)- Tiger hash funkcija, koju su razvili Ros Anderson i Eli Biham 1995. godine. Tiger je dizajniran da radi posebno brzo na 64-bitnim računalima. Tiger nema patentnih ograničenja, može se slobodno koristiti kao s ... ... Wikipedijom

    funkcija raspršivanja- hash funkcija 1. Funkcija koja kontrolira proces unosa podataka u hash tablicu, definirajući (adrese slobodnih ćelija. 2. Funkcija koja predstavlja preslikavanje fragmenta otvorene poruke u šifrirani niz fiksne duljine. U . ... ... Vodič za tehničkog prevoditelja

    Hash tablica- U programiranju, hash tablica je struktura podataka koja implementira sučelje asocijativnog niza, naime, omogućuje vam pohranjivanje parova (ključ, vrijednost) i izvođenje tri operacije: operaciju dodavanja novog para, operaciju pretraživanja i operacija brisanja ... Wikipedia

    Hash kod- Hashing (ponekad raspršivanje) pretvaranje niza ulaznih podataka proizvoljne duljine u izlazni niz bitova fiksne duljine. Takve transformacije nazivaju se i hash funkcijama ili funkcijama preklapanja, a njihovi rezultati ... ... Wikipedia

    Sudar funkcije hash- Kolizija hash funkcije H su dva različita ulazna bloka podataka x i y tako da je H (x) = H (y). Kolizije postoje za većinu hash funkcija, ali za "dobre" hash funkcije učestalost njihovog pojavljivanja je blizu teoretskog minimuma. U ... ... Wikipediji

Algoritmi pretraživanja koje smo razmotrili obično se temelje na apstraktnoj operaciji usporedbe. Iz ovog niza bitno se izdvaja metoda alokativnog pretraživanja, opisana u "Tablicama simbola i binarnih stabala pretraživanja", u kojoj je element s ključem i pohranjen na i-tom mjestu tablice, što mu omogućuje izravan pristup . Distribucija pretraživanja koristi vrijednosti ključeva kao indekse niza, a ne operande operacije usporedbe; sama metoda se oslanja na činjenicu da su ključevi različiti cijeli brojevi iz istog raspona kao i indeksi tablice. U ovom ćemo poglavlju pogledati raspršivanje, napredno distributivno pretraživanje koje se koristi u tipičnijim aplikacijama za pretraživanje gdje ključevi nemaju tako zgodna svojstva. Krajnji rezultat korištenja ovog pristupa potpuno je drugačiji od metoda koje se temelje na usporedbi - umjesto da se krećemo kroz strukture podataka rječnika uspoređivanjem ključeva za pretraživanje s ključevima u elementima, pokušavamo pristupiti elementima u tablici izravno izvođenjem aritmetike pretvaranje ključeva u adrese tablica.

Algoritmi pretraživanja za raspršivanje imaju dva različita dijela. Prvi korak je izračunavanje hash funkcije koja pretvara ključ za pretraživanje u adresu u tablici. U idealnom slučaju, različiti ključevi bi se mapirali na različite adrese, ali često dva ili više različitih ključeva mogu dati istu adresu u tablici. Stoga je drugi dio pretraživanja raspršivanja proces rješavanja kolizije, koji obrađuje takve ključeve. Jedna od tehnika rješavanja sukoba koje ćemo pogledati u ovom poglavlju koristi povezane liste, tako da nalazi izravnu primjenu u dinamičkim situacijama u kojima je teško unaprijed predvidjeti broj ključeva za pretraživanje. Druge dvije metode razlučivanja sudara postižu visoku razinu izvođenje pretražujte jer su elementi pohranjeni u fiksnom nizu. Pogledat ćemo kako se ove metode mogu poboljšati tako da se mogu koristiti čak i u slučajevima kada se veličina tablice ne može unaprijed predvidjeti.

Haširanje je dobar primjer ravnoteže između vremena i pamćenja. Da nije bilo ograničenja u količini korištene memorije, svako pretraživanje bi se moglo izvesti samo jednim pristupom memoriji, jednostavno koristeći ključ kao memorijsku adresu, kao u pretraživanju dodjele. Međutim, ovo idealno kućište obično nije ostvarivo, jer duge tipke mogu zahtijevati ogromnu količinu memorije. S druge strane, da nije bilo ograničenja na vrijeme isporuke, moglo se proći s minimalnom količinom memorije koristeći metodu sekvencijalnog pretraživanja. Haširanje je način korištenja prihvatljive količine i memorije i vremena, te uspostavljanja ravnoteže između ova dva ekstrema. Konkretno, bilo koja ravnoteža se može održavati jednostavnom promjenom veličine tablice, umjesto prepisivanja koda ili odabirom drugih algoritama.

Hashing je jedan od klasičnih problema u informatici: njegovi različiti algoritmi su detaljno proučavani i široko se koriste. Vidjet ćemo da se uz labave pretpostavke možemo nadati da ćemo podržati operacije pronalaženja i umetanja u tablice simbola s konstantnim vremenom, bez obzira na veličinu tablice.

Ova očekivana vrijednost je teoretski optimalna izvedba za bilo koju implementaciju tablice simbola, ali raspršivanje još uvijek nije lijek iz dva glavna razloga. Prvo, vrijeme isporuke ovisi o duljini ključa, što može biti značajno u stvarnim aplikacijama koje koriste duge tipke. Drugo, raspršivanje ne pruža učinkovite implementacije drugih operacija tablice simbola, poput odabira ili sortiranja. U ovom poglavlju pobliže ćemo pogledati ova i druga pitanja.

Hash funkcije

Prije svega, potrebno je riješiti problem izračunavanja hash funkcije koja pretvara ključeve u adrese tablica. Obično implementacija ovog aritmetičkog izračuna nije teška, ali ipak morate paziti da ne naiđete na razne suptilne zamke. Ako imate tablicu koja može sadržavati M elemenata, potrebna vam je funkcija koja pretvara ključeve u cijele brojeve u rasponu. Idealna hash funkcija trebala bi se lako izračunati i izgledati kao slučajna funkcija: za sve argumente, rezultati bi u određenom smislu trebali biti jednako vjerojatni.

Hash funkcija ovisi o vrsti ključa. Strogo govoreći, za svaku moguću vrstu ključeva potrebna je posebna hash funkcija. Kako bi se poboljšala učinkovitost, obično je poželjno izbjegavati eksplicitne pretvorbe tipova, i umjesto toga okrenuti se ideji da se binarni prikaz ključeva u strojnoj riječi tretira kao cijeli broj koji se može koristiti u aritmetičkim izračunima. Haširanje je prethodilo jezicima visoke razine - bilo je uobičajeno na ranim računalima tretirati vrijednost kao ključ niza ili cijeli broj. U nekim jezicima visoke razine teško je stvoriti programe koji ovise o predstavljanju ključeva na određenom računalu, budući da su takvi programi inherentno ovisni o stroju i stoga ih je teško prenijeti na drugo računalo. Hash funkcije obično ovise o procesu pretvorbe ključa u cijeli broj, tako da može biti teško postići i strojnu neovisnost i učinkovitost u implementacijama raspršivanja. Tipično, jednostavni cjelobrojni ključevi ili ključevi s pomičnim zarezom mogu se pretvoriti samo jednom strojnom operacijom, ali tipke s nizom i druge vrste kompozitnih ključeva su skuplje i zahtijevaju više pažnje na učinkovitost.

Vjerojatno najjednostavnija situacija je kada su ključevi brojevi s pomičnim zarezom iz fiksnog raspona. Na primjer, ako su ključevi brojevi veći od 0 i manji od 1, možete ih jednostavno pomnožiti s M, zaokružiti rezultat na niži cijeli broj i dobiti adresu u rasponu između 0 i M - 1; takav primjer je prikazan na sl. 14.1. Ako su ključevi veći od s i manji od t, mogu se skalirati oduzimanjem s i dijeljenjem s ts, dovodeći ih u raspon vrijednosti između 0 i 1, a zatim množite s M kako biste dobili adresu u tablici .


Riža. 14.1.

Za pretvaranje brojeva s pomičnim zarezom u rasponu između 0 i 1 u indekse za tablicu čija je veličina 97, ti se brojevi množe s 97. U ovom primjeru došlo je do tri kolizije: za indekse 17, 53 i 76. Hash vrijednosti ​​određeni su najvišim bitovima ključa, bitovi s najmanjim značajem ne igraju nikakvu ulogu. Jedan od ciljeva dizajna hash funkcije je ispraviti ovu neravnotežu tako da se svaki bit uzima u obzir tijekom izračuna.

Ako su ključevi w-bitni cijeli brojevi, mogu se pretvoriti u brojeve s pomičnim zarezom i podijeliti s 2 w da biste dobili brojeve s pomičnim zarezom između 0 i 1, a zatim pomnožiti s M kao u prethodnom odlomku. Ako operacije s pomičnim zarezom traju dugo, a brojevi nisu dovoljno veliki da izazovu prelijevanje, isti se rezultat može dobiti korištenjem cjelobrojnih aritmetičkih operacija: trebate pomnožiti ključ s M, a zatim izvršiti pomak udesno za w znamenki da biste podijelite s 2 w (ili, ako se množenje prekorači, izvršite pomak, a zatim množenje). Takve metode su beskorisne za raspršivanje, osim ako su ključevi ravnomjerno raspoređeni u rasponu, budući da je hash vrijednost određena samo vodećim znamenkama ključa.

Jednostavnija i učinkovitija metoda za w-bitne cijele brojeve - jedna od možda najčešće korištenih metoda raspršivanja - odabirom tablice prostih brojeva kao veličine M i izračunavanjem ostatka k po M, t.j. h (k) = k mod M za bilo koji cjelobrojni ključ k. Ova funkcija se zove modularna hash funkcija. Vrlo je lako izračunati (k% M u C++), a učinkovit je za postizanje ravnomjerne raspodjele ključnih vrijednosti između vrijednosti manjih od M. Mali primjer je prikazan na Sl. 14.2.


Riža. 14.2.

Tri desna stupca prikazuju rezultat hashiranja 16-bitnih ključeva navedenih na lijevoj strani pomoću sljedećih funkcija:

v% 97 (lijevo)

v% 100 (u sredini) i

(int) (a * v)% 100 (desno),

gdje je a = .618033. Veličine tablice za ove funkcije su 97, 100, odnosno 100. Vrijednosti izgledaju nasumično (budući da su tipke nasumične). Druga funkcija (v% 100) koristi samo dvije krajnje desne znamenke tipki i stoga može pokazati lošu izvedbu za neslučajne tipke.

Modularno raspršivanje također se odnosi na ključeve s pomičnim zarezom. Ako su ključevi u malom rasponu, možete ih skalirati na brojeve između 0 i 1,2 w da biste dobili w-bitne cijele brojeve, a zatim upotrijebiti modularnu hash funkciju. Druga je mogućnost jednostavno koristiti binarni prikaz ključa kao operand modularne hash funkcije (ako je dostupan).

Modularno raspršivanje koristi se kad god se pristupa bitovima koji čine ključeve, bilo da se radi o cijelim brojevima strojne riječi, nizovima znakova prepunih riječi ili bilo čemu drugom mogućem. Niz nasumičnih znakova upakiranih u strojnu riječ nije potpuno isti kao nasumični cjelobrojni ključevi, budući da se svi bitovi ne koriste za kodiranje. Ali obje ove vrste (i bilo koji drugi tip ključa koji je kodiran da stane u strojnu riječ) može se učiniti da izgledaju kao nasumični indeksi na maloj tablici.

Glavni razlog za odabir glavne hash tablice kao veličine M za modularno raspršivanje prikazan je na Sl. 14.3. Ovaj primjer podataka od 7-bitnih znakova tretira ključ kao osnovni broj 128 - jednu znamenku za svaki znak u ključu. Sada odgovara broju 1816567, koji se također može napisati kao

jer u ASCII-u znakovi n, o i w odgovaraju brojevima 1568 = 110, 1578 = 111 i 1678 = 119. Odabir veličine tablice M = 64 za ovu vrstu ključa je neuspješan, jer dodavanjem vrijednosti koje su višestruke od 64 (ili 128) na x ne mijenja se vrijednost x mod 64 - za bilo koji ključ, hash vrijednost je vrijednost zadnjih 6 bitova ovog ključa. Naravno, dobra hash funkcija treba uzeti u obzir sve znamenke ključa, posebno za simboličke ključeve. Slične situacije mogu nastati kada M sadrži faktor koji je potencija 2. Najjednostavniji način da se to izbjegne je da odaberete prosti broj kao M.


Riža. 14.3.

Svaki red ove tablice sadrži: riječ od 3 slova, ASCII prikaz te riječi kao 21-bitni broj u oktalnom i decimalnom zapisu i standardne modularne funkcije raspršivanja za veličine tablice 64 i 31 (dva krajnja desna stupca) . Veličina tablice 64 dovodi do nepoželjnih rezultata jer se za dobivanje hash vrijednosti koriste samo krajnji desni bitovi ključa, a slova u riječima zajedničkog jezika su neravnomjerno raspoređena. Na primjer, sve riječi koje završavaju slovom y imaju hash vrijednost 57. Nasuprot tome, jednostavna vrijednost od 31 uzrokuje manje sudara u tablici koja je više od polovice veličine.

Modularno raspršivanje je vrlo jednostavno za implementaciju, osim što veličina tablice mora biti prost broj. Za neke aplikacije možete se zadovoljiti malim poznatim prostim brojem ili na popisu poznatih prostih brojeva potražiti onaj koji je blizu potrebnoj veličini tablice. Na primjer, brojevi jednaki 2 t - 1 su prosti kada t = 2, 3, 5, 7, 13, 17, 19 i 31(i za nikakve druge vrijednosti t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не единственная причина, по которой размер таблицы стоит сделать простым числом; еще одна причина рассматривается в разделе 14.4.


Riža. 14.4.

Ova tablica najvećih prostih brojeva manjih od 2 n for , može se koristiti za dinamičko dodjeljivanje hash tablice kada želite da veličina tablice bude prost broj. Za bilo koju danu pozitivnu vrijednost u pokrivenom rasponu, ova se tablica može koristiti za određivanje prostog broja koji je manje od 2 puta različit od njega.

Drugi način rukovanja cjelobrojnim ključevima je kombiniranje multiplikativne i modularne metode: ključ pomnožite konstantom između 0 i 1, a zatim podijelite po modulu M. Drugim riječima, trebate koristiti funkciju. Postoji odnos između vrijednosti M i efektivnog radiksa ključa koji bi teoretski mogao dovesti do anomalnog ponašanja, ali ako koristite proizvoljnu vrijednost a, teško da postoji problem u stvarnoj primjeni. Često se kao a bira vrijednost φ = 0,618033 ... (zlatni omjer).

Mnoge druge varijacije su istražene na ovu temu, posebno hash funkcije koje se mogu implementirati pomoću učinkovitih strojnih instrukcija kao što su pomak i maskirano isticanje (pogledajte odjeljak veza).

U mnogim aplikacijama koje koriste tablice simbola, tipke nisu brojevi i nisu nužno kratke; češće su to alfanumerički nizovi, koji mogu biti prilično dugi. Dakle, kako izračunati hash funkciju za riječ kao što je averylongkey?

U 7-bitnom ASCII kodu ova riječ odgovara 84-bitnom broju \ begin (align *) 97 \ cdot 128 ^ (11) & + 118 \ cdot 128 ^ (10) + 101 \ cdot 128 ^ (9) + 114 \ cdot 128 ^ (8) + 121 \ cdot 128 ^ (7) \\ & + 108 \ cdot 128 ^ (6) + 111 \ cdot 128 ^ (5) + 110 \ cdot 128 ^ (4) + 103 \ cdot 128 ^ (3) \\ & + 107 \ cdot 128 ^ (2) + 101 \ cdot 128 ^ (1) + 121 \ cdot 128 ^ (0), \ end (poravnaj *),

koji je prevelik za obavljanje normalnih aritmetičkih funkcija na većini računala. I često morate rukovati mnogo dužim tipkama.

Kako bi se izračunala modularna hash funkcija za duge ključeve, oni se transformiraju dio po dio. Možete iskoristiti prednosti aritmetičkih svojstava funkcije modula i koristiti Hornerov algoritam (vidi odjeljak 4.9 "Apstraktni tipovi podataka"). Ova metoda temelji se na drugom načinu pisanja brojeva koji odgovaraju tipkama. Za ovaj primjer napišite sljedeći izraz: \ begin (poravnaj *) (((((((97 \ cdot 128 ^ (11) & + 118) \ cdot 128 ^ (10) + 101) \ cdot 128 ^) ( 9) + 114) \ cdot 128 ^ (8) + 121) \ cdot 128 ^ (7) \\ & + 108) \ cdot 128 ^ (6) + 111) \ cdot 128 ^ (5) + 110) \ cdot 128 ^ (4) + 103) \ cdot 128 ^ (3) \\ & + 107) \ cdot 128 ^ (2) + 101) \ cdot 128 ^ (1) + 121. \ end (poravnaj *)

To jest, decimalni broj koji odgovara kodiranju znakova niza može se izračunati gledanjem s lijeva na desno, množenjem akumulirane vrijednosti sa 128, a zatim dodavanjem vrijednosti koda sljedećeg znaka. U slučaju dugog niza, ovaj način izračunavanja će na kraju dovesti do broja većeg od onoga što računalo može zamisliti. Međutim, ovaj broj nije potreban, jer je od dijeljenja s M potreban samo (mali) ostatak. Rezultat se može dobiti čak i bez pohranjivanja velike akumulirane vrijednosti, budući da u bilo kojem trenutku tijekom izračunavanja možete odbaciti višekratnik M - svaki put kada izvodite množenje i zbrajanje, trebate pohraniti samo ostatak dijeljenja po modulu M. Rezultat će biti isti kao da smo imali priliku izračunati dugi broj, a zatim izvedite dijeljenje (vidi. Vježbu 14.10). Ovo opažanje dovodi do jednostavnog aritmetičkog načina izračunavanja modularnih hash funkcija za duge nizove — vidi Program 14.1. Ovaj program koristi jedan posljednji trik: umjesto baze 128, koristi prosti broj 127. Razlog za ovu promjenu razmatra se u sljedećem odlomku.

Postoji mnogo načina za izračunavanje hash funkcija po otprilike istoj cijeni kao i modularno raspršivanje pomoću Hornerove metode (jedna ili dvije aritmetičke operacije za svaki znak u ključu). Za slučajne ključeve, ove metode su praktički iste, ali pravi ključevi su rijetko nasumični. Mogućnost randomiziranja stvarnih ključeva po niskoj cijeni dovodi do razmatranja randomiziranih algoritama za raspršivanje, budući da su nam potrebne hash funkcije koje generiraju nasumične indekse na tablici bez obzira na distribuciju ključeva. Randomizacija je jednostavna, budući da se ne morate doslovno pridržavati definicije modularnog raspršivanja – samo trebate upotrijebiti sve znamenke ključa da biste izračunali cijeli broj manji od M.

Program 14.1. Hash funkcija za string ključeve

M = 96 i a = 128 (gore),

M = 97 i a = 128 (sredina) i

M = 96 i a = 127 (dolje)

Neravnomjerna raspodjela u prvom slučaju rezultat je neravnomjerne upotrebe slova i postojanosti neravnomjernosti zbog činjenice da su i veličina tablice i faktor višestruki od 32. Druga dva primjera izgledaju nasumično jer su veličina tablice i faktor relativno prosti brojevi.

Program 14.1 pokazuje jedan način za to: korištenje jednostavne baze umjesto stepena 2 i cijelog broja koji odgovara ASCII prikazu niza. Na sl. 14.5 sl. Slika 14.5 pokazuje kako ova promjena poboljšava distribuciju tipičnih string ključeva. U teoriji, hash vrijednosti generirane Programom 14.1 mogu dati loše rezultate za veličine tablice koje su višekratne od 127 (iako će u praksi to vjerojatno biti gotovo nevidljivo); za stvaranje randomiziranog algoritma, moguće je nasumično odabrati vrijednost množitelja. Još učinkovitiji pristup je korištenje slučajnih vrijednosti koeficijenata u izračunu i različitih slučajnih vrijednosti za svaku ključnu znamenku. Ovaj pristup daje randomizirani algoritam nazvan univerzalno raspršivanje.

U teoriji, savršena univerzalna hash funkcija je ona za koju je vjerojatnost kolizije između dva različita ključa u tablici veličine M točno 1/M. Može se dokazati da korištenje kao koeficijenta a u Programu 14.1, ne fiksne proizvoljne vrijednosti, već niza nasumičnih različitih vrijednosti, transformira modularno raspršivanje u univerzalnu hash funkciju. Međutim, trošak generiranja novog slučajnog broja za svaki znak u ključu obično je neprihvatljiv. U praksi, kompromis prikazan u Programu 14.1 može se postići tako da se ne pohranjuje niz različitih slučajnih brojeva za svaki simbol ključa, već mijenjanjem koeficijenata generiranjem jednostavnog pseudoslučajnog niza.

Ukratko, da biste koristili raspršivanje za implementaciju tablice apstraktnih simbola, najprije morate proširiti sučelje apstraktnog tipa kako biste uključili hash operaciju, koja preslikava ključeve u nenegativne cijele brojeve manje od veličine tablice M.

Vrhunski povezani članci