Hash-funksjonen brukes ofte til. Kryptografiske hash-funksjoner. Hash-krav

Etc.). Valget av en bestemt hash-funksjon bestemmes av spesifikasjonene til problemet som skal løses. De enkleste eksemplene på hash-funksjoner er sjekksum eller CRC.

I det generelle tilfellet er det ingen en-til-en-korrespondanse mellom de originale dataene og hash-koden. Derfor er det mange datamatriser som gir de samme hashkodene – de såkalte kollisjonene. Sannsynligheten for kollisjoner spiller en viktig rolle i vurderingen av "kvaliteten" på hasjfunksjoner.

Sjekksummer

Ukomplisert, ekstremt rask og lett implementerbar i maskinvarealgoritmer som brukes for å beskytte mot utilsiktet forvrengning, inkludert maskinvarefeil.

Når det gjelder beregningshastighet, er den titalls og hundrevis av ganger raskere enn kryptografiske hashfunksjoner, og mye enklere i maskinvareimplementering.

Betal for slikt høy hastighet er mangelen på kryptografisk styrke – en enkel mulighet til å justere meldingen til et forhåndsbestemt beløp. Også vanligvis bitdybden sjekksummer(typisk tall: 32 bits) er lavere enn kryptografiske hashes (typiske tall: 128, 160 og 256 bits), noe som betyr muligheten for utilsiktede kollisjoner.

Det enkleste tilfellet av en slik algoritme er å dele en melding i 32- eller 16-bits ord og summere dem, som brukes for eksempel i TCP / IP.

Vanligvis kreves en slik algoritme for å spore typiske maskinvarefeil, for eksempel flere påfølgende feilbiter opp til gitt lengde... Familien av algoritmer såkalte. "Sykliske redundanskoder" tilfredsstiller disse kravene. Disse inkluderer for eksempel CRC32 som brukes i ZIP-maskinvare.

Kryptografiske hash-funksjoner

Blant de mange eksisterende hash-funksjonene er det vanlig å skille kryptografisk sterke som brukes i kryptografi. En kryptografisk sterk hashfunksjon må først og fremst ha kollisjonsmotstand av to typer:

Bruker hashing

Hash-funksjoner brukes også i noen datastrukturer som hash-tabeller og kartesiske trær. Kravene til hash-funksjonen i dette tilfellet er forskjellige:

  • god datablanding
  • rask beregningsalgoritme

Dataavstemming

Generelt kan denne applikasjonen beskrives som å kontrollere noe informasjon for identitet til originalen, uten å bruke originalen. For verifisering brukes hashverdien til informasjonen som verifiseres. Det er to hovedretninger for denne applikasjonen:

Sjekker for feil

For eksempel kan sjekksummen overføres over kommunikasjonskanalen sammen med hovedteksten. På mottakssiden kan sjekksummen beregnes på nytt og sammenlignes med den overførte verdien. Hvis et avvik blir funnet, betyr det at det var forvrengning under overføringen, og du kan be om et nytt forsøk.

Den hverdagslige analogen av hashing i dette tilfellet kan tjene som en teknikk når antall stykker bagasje er i tankene ved flytting. Da, for å sjekke, trenger du ikke å huske om hver koffert, men det er nok å telle dem. En kamp vil bety at ingen koffert har gått tapt. Det vil si at antall stykker bagasje er hashkoden.

Sjekk passordfrase

I de fleste tilfeller lagres ikke passordfraser på målobjekter, bare hashverdiene deres lagres. Det er upraktisk å lagre passordfraser, siden i tilfelle uautorisert tilgang til en fil med fraser, vil angriperen finne ut alle passordfrasene og vil kunne bruke dem med en gang, og når han lagrer hashverdier, vil han bare kjenne hashverdier ​som ikke kan reverseres til de opprinnelige dataene, i dette tilfellet, i passordfrase. Under autentiseringsprosedyren beregnes hashverdien til den angitte passordfrasen og sammenlignes med den lagrede.

Et eksempel i dette tilfellet er GNU / Linux OS og Microsoft Windows XP. De lagrer bare hash-verdier av passordfraser fra brukerkontoer.

Gir raskere datainnhenting

For eksempel, når du skriver tekstfelt i databasen, kan hashkoden deres beregnes og dataene kan plasseres i seksjonen som tilsvarer denne hashkoden. Deretter, når du søker etter data, må du først beregne hash-koden til teksten, og det vil umiddelbart bli kjent i hvilken seksjon du trenger å søke etter dem, det vil si at du ikke trenger å søke i hele databasen, men bare i en av delene (dette øker raskt søket betraktelig).

Den daglige analogen til hashing i dette tilfellet kan være plassering av ord i ordboken alfabetisk. Den første bokstaven i et ord er hash-koden, og når vi søker ser vi ikke gjennom hele ordboken, men bare den nødvendige bokstaven.

Algoritmeliste

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tiger (Whirlpool
  • IP Internett-sjekksum (RFC 1071)

Lenker

Wikimedia Foundation. 2010.

Se hva en "hash-funksjon" er i andre ordbøker:

    hash-funksjon- En funksjon som når forskjellige størrelser inngangsverdien har en utdata med fast størrelse. hash-funksjon- Emner Informasjonsteknologi v … … Teknisk oversetterveiledning Wikipedia

    En hashtabell er en datastruktur som implementerer et grensesnitt assosiativ matrise, nemlig den lar deg lagre par (nøkkel, verdi) og utføre tre operasjoner: operasjonen med å legge til et nytt par, operasjonen for å finne og operasjonen for å fjerne et par ved ... ... Wikipedia

    En hashfunksjonskollisjon kalles to forskjellige inngangsdatablokker og slik at kollisjoner eksisterer for de fleste hashfunksjoner, men for "gode" hashfunksjoner er frekvensen av deres forekomst nær det teoretiske minimum. I noen spesielle tilfeller ... Wikipedia

    Hashing (noen ganger hashing) konverterer en inndatamatrise med vilkårlig lengde til en utgangsbitstreng med fast lengde. Slike transformasjoner kalles også hash-funksjoner eller fold-funksjoner, og deres resultater ... ... Wikipedia

    Tiger hash-funksjon, utviklet av Ros Anderson og Eli Biham i 1995. Tiger ble designet for å kjøre spesielt raskt på 64-bits datamaskiner. Tiger har ingen patentrestriksjoner, kan brukes fritt som med ... ... Wikipedia

For eksempel kan vi mate inngangen til en 128-bits hashfunksjon Leo Tolstoys roman i heksadesimal form eller tallet 1. Som et resultat får vi i begge tilfeller forskjellige sett pseudo-tilfeldig heksadesimale sifre se: "c4ca4238a0b923820dcc509a6f75849b".

Når det endres kildetekst selv med én desimal endres resultatet av hashfunksjonen fullstendig.

Denne egenskapen til hash-funksjoner gjør at de kan brukes i følgende tilfeller:

  • når du bygger assosiative arrays;
  • når du ser etter duplikater i en serie datasett;
  • når du bygger unike identifikatorer for datasett;
  • ved beregning av kontrollsummer fra data (signal) for påfølgende oppdagelse av feil i dem (som oppstår ved et uhell eller med vilje) som oppstår under lagring og/eller overføring av data;
  • mens du lagrer passord i beskyttelsessystemer i form av en hash-kode (for å gjenopprette et passord ved hjelp av en hash-kode, kreves det en funksjon som er det motsatte av den brukte hash-funksjonen);
  • ved generering av en elektronisk signatur (i praksis er det ofte ikke selve meldingen som signeres, men dens "hash-bilde");
  • og så videre.

Typer "hash-funksjoner"

En "god" hash-funksjon må tilfredsstille to egenskaper:

  • rask beregning;
  • minimum antall "kollisjoner".

La oss introdusere notasjonen:

∀ k ∈ (0; K): h (k)< M {\displaystyle \forall k\in (0;\,K):h(k).

Et eksempel på en "dårlig" hash-funksjon er en funksjon med M = 1000 (\ displaystil M = 1000), som er et tisifret naturlig tall K (\ displaystil K) sidestiller tre sifre valgt fra midten av det tjuesifrede kvadratet av et tall K (\ displaystil K)... Det ser ut til at verdiene til "hash-kodene" burde jevnt fordeles mellom " 000 "og" 999 ", men for" ekte"Data, dette er bare sant hvis" nøklene"Ikke ha et" stort "antall nuller til venstre eller høyre.

La oss se på noen få enkle og pålitelige implementeringer av "hash-funksjoner".

Divisjonsbaserte hashfunksjoner

1. "Hash-kode" som en rest av divisjon med antall mulige "hash-koder"

Hash-funksjonen kan beregne "hash" som resten av inndataene delt på M (\ displaystil M):

h (k) = k mod M (\ displaystil h (k) = k \ mod M),

hvor M (\ displaystil M)- antall mulige "hasher" (utdata).

Dessuten er det åpenbart at for selv M (\ displaystil M) verdien av funksjonen vil være selv om den er jevn k (\ displaystil k) og rart - rart k (\ displaystil k)... Skal heller ikke brukes som M (\ displaystil M) graden av basen til tallsystemet til datamaskinen, siden "hash-koden" bare vil avhenge av flere sifre tall k (\ displaystil k) plassert til høyre, noe som vil føre til mange kollisjoner. I praksis velger man som regel en enkel M (\ displaystil M); i de fleste tilfeller er dette valget ganske tilfredsstillende.

2. "Hash-kode" som et sett med koeffisienter for det resulterende polynomet

Hash-funksjonen kan dele inndataene med en polynom modulo to. I denne metoden M (\ displaystil M) må være en potens av to, og binære nøkler ( K = k n - 1 k n - 2. ... ... k 0 (\ displaystil K = k_ (n-1) k_ (n-2) ... k_ (0))) er representert som polynomer, er verdiene til koeffisientene tatt som "hash-koden" polynom, oppnådd som resten av delingen av inngangsdataene K (\ displaystil K) av et forhåndsvalgt polynom P (\ visningsstil P) grad m (\ displaystil m):

K (x) mod P (x) = hm - 1 xm - 1 + ⋯ + h 1 x + h 0 (\ visningsstil K (x) \ mod P (x) = h_ (m-1) x ^ (m- 1) + \ prikker + h_ (1) x + h_ (0)) h (x) = h m - 1. ... ... h 1 t 0 (\ displaystil h (x) = h_ (m-1) ... h_ (1) h_ (0))

Med det rette valget P (x) (\ visningsstil P (x)) fraværet av kollisjoner mellom nesten identiske nøkler er garantert.

Hash-funksjoner basert på multiplikasjon

La oss betegne med symbolet w (\ displaystyle w) antall tall representert av et maskinord. For eksempel, for 32-bits datamaskiner som er kompatible med IBM PC, w = 2 32 (\ displaystyle w = 2 ^ (32)).

La oss velge en konstant A (\ visningsstil A) så det A (\ visningsstil A) var gjensidig enkel med w (\ displaystyle w)... Da kan hash-funksjonen ved bruk av multiplikasjon se slik ut:

h (K) = [M ⌊ A w ∗ K ⌋] (\ displaystil h (K) = \ venstre)

I dette tilfellet på en datamaskin med et binært tallsystem M (\ displaystil M) er en potens av to, og h (K) (\ displaystil h (K)) vil bestå av de viktigste delene av høyre halvdel av produktet A ∗ K (\ displaystil A * K).

Blant fordelene med hashfunksjoner basert på divisjon og multiplikasjon, er det verdt å merke seg den fordelaktige bruken av ikke-tilfeldigheten til ekte nøkler. For eksempel, hvis nøklene er en aritmetisk progresjon (for eksempel rekkefølgen av navn "Navn 1", "Navn 2", "Navn 3"), vil en hashfunksjon som bruker multiplikasjon kartlegge den aritmetiske progresjonen til en omtrentlig aritmetisk progresjon på ulike hash-verdier, som vil redusere antall kollisjoner kontra en tilfeldig situasjon.

En av hash-funksjonene som bruker multiplikasjon er hash-funksjonen som bruker Fibonacci-hash. Fibonacci-hashing er basert på egenskapene til det gylne snitt. Som en konstant A (\ visningsstil A) her heltall nærmest φ - 1 ∗ w (\ displaystyle \ varphi ^ (- 1) * w) og coprime med w (\ displaystyle w), hvor φ (\ displaystyle \ varphi) er det gylne snitt.

Hashing strenger med variabel lengde

Metodene ovenfor er også anvendelige hvis du må vurdere nøkler som består av flere ord eller nøkler med variabel lengde.

For eksempel kan du kombinere ord til ett ved å bruke modulo-addisjon w (\ displaystyle w) eller en eksklusiv-eller operasjon. En av algoritmene som fungerer etter dette prinsippet er Pearson-hash-funksjonen.

Universal hashing

Metoder for kollisjonshåndtering

En kollisjon (noen ganger en konflikt eller kollisjon) er et tilfelle der én hashfunksjon for forskjellige inngangsblokker returnerer de samme hashkodene.

Metoder for å håndtere kollisjoner i hashtabeller

De fleste av de første papirene som beskrev hashing handlet om metoder for å håndtere kollisjoner i hashtabeller. Da ble hash-funksjoner brukt ved søk etter tekst i store filer. Det er to hovedmetoder for å håndtere kollisjoner i hashtabeller:

  1. kjedemetode (direkte koblingsmetode);
  2. åpen adresseringsmetode.

Når du bruker kjedemetoden, lagrer hash-tabellen par med "lenket liste over nøkler" - "hash-kode". En hash-kode beregnes for hver nøkkel av en hash-funksjon; hvis hashkoden ble mottatt tidligere (for en annen nøkkel), legges nøkkelen til den eksisterende listen over nøkler, sammenkoblet med hashkoden; ellers opprettes et nytt par "liste med nøkler" - "hash-kode", og nøkkelen legges til den opprettede listen. Generelt, hvis det er N (\ visningsstil N) nøkler og M (\ displaystil M) lister, vil den gjennomsnittlige størrelsen på hashtabellen være N M (\ visningsstil (\ frac (N) (M)))... I dette tilfellet, når du søker i en tabell, sammenlignet med tilfellet der søket utføres sekvensielt, vil den gjennomsnittlige mengden arbeid reduseres med ca. M (\ displaystil M) en gang.

Når du bruker den åpne adresseringsmetoden, lagres parene "nøkkel" - "hash-kode" i hash-tabellen. En hash-kode beregnes for hver nøkkel av en hash-funksjon; paret "nøkkel" - "hash-kode" er lagret i tabellen. I dette tilfellet, når du søker gjennom tabellen, sammenlignet med tilfellet der koblede lister brukes, brukes ingen lenker, en sekvensiell oppregning av "nøkkel" - "hash-kode"-parene utføres, opptellingen stopper etter det nødvendige nøkkelen er funnet. Rekkefølgen som cellene i tabellen skannes i kalles sonderingssekvensen.

Kryptografisk salt

Bruke hash-funksjoner

Hash-funksjoner er mye brukt i kryptografi.

Hash brukes som en nøkkel i mange datastrukturer - hashtabeller, Bloom-filtre og kartesiske trær.

Kryptografiske hash-funksjoner

Blant de mange eksisterende hash-funksjonene er det vanlig å skille mellom kryptografisk sterke som brukes i kryptografi, siden det stilles tilleggskrav til dem. For hash-funksjonen H (\ displaystil H) Ansett som kryptografisk sterk, må den tilfredsstille tre grunnleggende krav som de fleste bruken av hash-funksjoner i kryptografi er basert på:

Disse kravene er ikke uavhengige.

String-hash-algoritmer kan hjelpe deg med å løse mange problemer. Men de har en stor ulempe: oftest er de ikke 100%, siden det er mange strenger hvis hashes matcher. En annen ting er at du i de fleste oppgaver kan ignorere dette, siden sannsynligheten for at hashes sammenfaller fortsatt er veldig liten.

Hash definisjon og beregning

En av de beste måtene å bestemme hash-funksjonen fra streng S er som følger:

H (S) = S + S * P + S * P ^ 2 + S * P ^ 3 + ... + S [N] * P ^ N

hvor P er et tall.

Det er rimelig å velge et primtall for P, omtrent lik antall tegn i inndataalfabetet. Hvis strengene for eksempel bare skal bestå av små latinske bokstaver, er P = 31 et godt valg. Hvis bokstaver kan være både store og små, så kan du for eksempel P = 53.

Alle kodebiter i denne artikkelen vil bruke P = 31.

Det er ønskelig å lagre selve hashverdien i den største numeriske typen - int64, aka long long. Det er klart at med en strenglengde på omtrent 20 tegn vil et verdioverløp allerede oppstå. Nøkkelpunktet er at vi ikke tar hensyn til disse overløpene, som om vi tar hash-modulo 2 ^ 64.

Et eksempel på beregning av hash hvis bare små latinske bokstaver er tillatt:

Const int p = 31; lang lang hash = 0, p_pow = 1; for (størrelse_t i = 0; i

I de fleste problemer er det fornuftig å først beregne alle de nødvendige potensene til P i en eller annen matrise.

Eksempeloppgave. Søk etter dupliserte strenger

Vi er allerede i en posisjon til å effektivt løse dette problemet. Du får en liste over strenger S, hver på ikke mer enn M tegn. La oss si at du vil finne alle dupliserte rader og dele dem inn i grupper slik at hver gruppe bare inneholder de samme radene.

Ved normal sortering av strenger vil vi få en algoritme med kompleksitet O (N M log N), mens vi bruker hashes vil vi få O (N M + N log N).

Algoritme. La oss beregne hashen fra hver linje, og sortere linjene etter denne hashen.

Vektor s (n); // ... lese strenger ... // telle alle potenser av p, for eksempel opp til 10000 - maksimal lengde på strenger const int p = 31; vektor p_pow (10000); p_pow = 1; for (størrelse_t i = 1; i > hashes (n); for (int i = 0; i

Substring hash og dens raske beregning

Anta at vi får en streng S, og gitt indeksene I og J. Du vil finne hashen fra understrengen S.

Per definisjon har vi:

H = S [I] + S * P + S * P ^ 2 + ... + S [J] * P ^ (J-I)

H * P [I] = S [I] * P [I] + ... + S [J] * P [J], H * P [I] = H - H

Denne egenskapen er veldig viktig.

Det viser seg faktisk at Når vi bare kjenner hashen fra alle prefiksene til strengen S, kan vi få hashen til en hvilken som helst delstreng i O (1).

Det eneste problemet som oppstår er at du må kunne dele på P [I]. Faktisk er det ikke så lett. Siden vi beregner hasj-modulo 2 ^ 64, må vi for å dele med P [I] finne dens inverse i feltet (for eksempel ved å bruke den utvidede euklidiske algoritmen), og utføre multiplikasjon med denne inversen.

Det er imidlertid en enklere måte. I de fleste tilfeller, i stedet for å dele hashen med potensene til P, kan du tvert imot multiplisere dem med disse potensene.

La oss si at du har to hashes: en multiplisert med P [I] og den andre multiplisert med P [J]. Hvis jeg< J, то умножим перый хэш на P, иначе же умножим второй хэш на P. Теперь мы привели хэши к одной степени, и можем их спокойно сравнивать.

For eksempel kode som beregner hashen til alle prefikser og deretter sammenligner to understrenger i O (1):

streng s; int i1, i2, len; // input data // telle alle potenser av p const int p = 31; vektor i2 && h1 == h2 * p_pow) cout<< "equal"; else cout << "different";

Bruker hashing

Noen typiske bruksområder for hashing inkluderer:

  • Bestemme antall distinkte understrenger i O (N ^ 2 log N) (se nedenfor)
  • Bestemme antall palindromer i en streng

Bestemme antall distinkte understrenger

La det gis en streng S med lengde N, som bare består av små latinske bokstaver. Du vil finne antall distinkte understrenger i denne strengen.

For å løse, itererer vi over lengden på delstrengen etter tur: L = 1 .. N.

For hver L vil vi konstruere en rekke hashes av delstrenger med lengde L, og redusere hashen til én grad, og sortere denne matrisen. Antallet forskjellige elementer i denne matrisen legges til svaret.

Gjennomføring:

streng s; // input string int n = (int) s.length (); // telle alle potenser av p const int p = 31; vektor p_pow (s.length ()); p_pow = 1; for (størrelse_t i = 1; i H (s.lengde ()); for (størrelse_t i = 0; i hs (n-l + 1); for (int i = 0; i

Etc.). Valget av en bestemt hash-funksjon bestemmes av spesifikasjonene til problemet som skal løses. De enkleste eksemplene på hash-funksjoner er sjekksum eller CRC.

I det generelle tilfellet er det ingen en-til-en-korrespondanse mellom de originale dataene og hash-koden. Derfor er det mange datamatriser som gir de samme hashkodene – de såkalte kollisjonene. Sannsynligheten for kollisjoner spiller en viktig rolle i vurderingen av "kvaliteten" på hasjfunksjoner.

Sjekksummer

Ukomplisert, ekstremt rask og lett implementerbar i maskinvarealgoritmer som brukes for å beskytte mot utilsiktet forvrengning, inkludert maskinvarefeil.

Når det gjelder beregningshastighet, er den titalls og hundrevis av ganger raskere enn kryptografiske hashfunksjoner, og mye enklere i maskinvareimplementering.

Betalingen for en så høy hastighet er mangelen på kryptografisk styrke - en enkel mulighet til å justere en melding til et forhåndsbestemt beløp. Vanligvis er også bitheten til sjekksummer (typisk antall: 32 biter) lavere enn kryptografiske hashes (typiske tall: 128, 160 og 256 biter), noe som betyr muligheten for utilsiktede kollisjoner.

Det enkleste tilfellet av en slik algoritme er å dele en melding i 32- eller 16-bits ord og summere dem, som brukes for eksempel i TCP / IP.

Vanligvis kreves en slik algoritme for å spore typiske maskinvarefeil, for eksempel flere påfølgende feilbiter opp til en gitt lengde. Familien av algoritmer såkalte. "Sykliske redundanskoder" tilfredsstiller disse kravene. Disse inkluderer for eksempel CRC32 som brukes i ZIP-maskinvare.

Kryptografiske hash-funksjoner

Blant de mange eksisterende hash-funksjonene er det vanlig å skille kryptografisk sterke som brukes i kryptografi. En kryptografisk sterk hashfunksjon må først og fremst ha kollisjonsmotstand av to typer:

Bruker hashing

Hash-funksjoner brukes også i noen datastrukturer som hash-tabeller og kartesiske trær. Kravene til hash-funksjonen i dette tilfellet er forskjellige:

  • god datablanding
  • rask beregningsalgoritme

Dataavstemming

Generelt kan denne applikasjonen beskrives som å kontrollere noe informasjon for identitet til originalen, uten å bruke originalen. For verifisering brukes hashverdien til informasjonen som verifiseres. Det er to hovedretninger for denne applikasjonen:

Sjekker for feil

For eksempel kan sjekksummen overføres over kommunikasjonskanalen sammen med hovedteksten. På mottakssiden kan sjekksummen beregnes på nytt og sammenlignes med den overførte verdien. Hvis et avvik blir funnet, betyr det at det var forvrengning under overføringen, og du kan be om et nytt forsøk.

I dette tilfellet kan en husholdningsanalog av hashing være en teknikk når, når du flytter, antall bagasjestykker holdes i minnet. Da, for å sjekke, trenger du ikke å huske om hver koffert, men det er nok å telle dem. En kamp vil bety at ingen koffert har gått tapt. Det vil si at antall stykker bagasje er hashkoden.

Sjekk passordfrase

I de fleste tilfeller lagres ikke passordfraser på målobjekter, bare hashverdiene deres lagres. Det er upraktisk å lagre passordfraser, siden i tilfelle uautorisert tilgang til en fil med fraser, vil angriperen finne ut alle passordfrasene og vil kunne bruke dem med en gang, og når han lagrer hashverdier, vil han bare kjenne hashverdier ​som ikke kan reverseres til de opprinnelige dataene, i dette tilfellet, i passordfrase. Under autentiseringsprosedyren beregnes hashverdien til den angitte passordfrasen og sammenlignes med den lagrede.

Et eksempel i dette tilfellet er GNU / Linux OS og Microsoft Windows XP. De lagrer bare hash-verdier av passordfraser fra brukerkontoer.

Gir raskere datainnhenting

For eksempel, når du skriver tekstfelt i databasen, kan hashkoden deres beregnes og dataene kan plasseres i seksjonen som tilsvarer denne hashkoden. Deretter, når du søker etter data, må du først beregne hash-koden til teksten, og det vil umiddelbart bli kjent i hvilken seksjon du trenger å søke etter dem, det vil si at du ikke trenger å søke i hele databasen, men bare i en av delene (dette øker raskt søket betraktelig).

Den daglige analogen til hashing i dette tilfellet kan være plassering av ord i ordboken alfabetisk. Den første bokstaven i et ord er hash-koden, og når vi søker ser vi ikke gjennom hele ordboken, men bare den nødvendige bokstaven.

Algoritmeliste

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tiger (Whirlpool
  • IP Internett-sjekksum (RFC 1071)

Lenker

Wikimedia Foundation. 2010.

  • Hashan Moheyan
  • Hash-kode

Se hva en "hash-funksjon" er i andre ordbøker:

    Hash funksjon- en funksjon som hasheser en rekke data ved å kartlegge verdier fra et (veldig) stort sett med verdier til et (betydelig) mindre sett med verdier. På engelsk: Hash-funksjon Se også: Cryptographic Algorithms Financial ... ... Økonomisk vokabular

    kryptografisk hash-funksjon- En funksjon som konverterer tekst av vilkårlig lengde til tekst med fast (i de fleste tilfeller kortere) lengde. Hovedapplikasjonen av hash-funksjonen finnes i den digitale signaturordningen. Siden hash-funksjonen beregnes raskere enn en digital signatur, i stedet for ... ...

    Enveis hash-funksjon- hash-funksjon, som er en beregningsmessig irreversibel funksjon. På engelsk: One way hash-funksjon Se også: Cryptographic Algorithms Financial Dictionary Finam ... Økonomisk vokabular

    TIGER - hash-funksjon- TIGER hash-funksjon, utviklet av Ros Anderson og Eli Biham i 1996. TIGER-hash-funksjonen er en ny rask hash-funksjon som er designet for å være veldig rask på moderne datamaskiner, spesielt 64-bits datamaskiner. TIGER ... ... Wikipedia

    enveis hash-funksjon- For en enveisfunksjon er det beregningsmessig umulig å finne to forskjellige argumenter der verdiene er de samme. [] Emner informasjonssikkerhet EN enveis hashfunksjon ... Teknisk oversetterveiledning

    Tiger (hash-funksjon)- Tiger hash-funksjon, utviklet av Ros Anderson og Eli Biham i 1995. Tiger ble designet for å kjøre spesielt raskt på 64-bits datamaskiner. Tiger har ingen patentrestriksjoner, kan brukes fritt som med ... ... Wikipedia

    hashing funksjon- hash-funksjon 1. En funksjon som kontrollerer prosessen med å legge inn data i en hash-tabell, definere (adresser til ledige celler. 2. En funksjon som representerer kartleggingen av et fragment av en åpen melding til en kryptert streng med fast lengde. I . ... ... Teknisk oversetterveiledning

    Hash-tabell- I programmering er en hash-tabell en datastruktur som implementerer grensesnittet til en assosiativ matrise, nemlig den lar deg lagre par (nøkkel, verdi) og utføre tre operasjoner: operasjonen med å legge til et nytt par, en søkeoperasjon og en sletteoperasjon ... Wikipedia

    Hash-kode- Hashing (noen ganger hashing) konverterer en inndatamatrise med vilkårlig lengde til en utgangsbitstreng med fast lengde. Slike transformasjoner kalles også hash-funksjoner eller fold-funksjoner, og deres resultater ... ... Wikipedia

    Hash funksjon kollisjon- Kollisjonen av hash-funksjonen H er to forskjellige inngangsdatablokker x og y slik at H (x) = H (y). Kollisjoner eksisterer for de fleste hasjfunksjoner, men for "gode" hasjfunksjoner er frekvensen av deres forekomst nær det teoretiske minimum. I ... ... Wikipedia

Innenfor rammen av denne artikkelen vil jeg fortelle deg hva er hasj, hvorfor det er nødvendig, hvor og hvordan det brukes, samt de mest kjente eksemplene.

Mange informasjonsteknologioppgaver er svært datakritiske. Hvis du for eksempel trenger å sammenligne to filer på 1 KB hver og to filer på 10 GB hver, så er dette en helt annen tid. Derfor anses algoritmer som lar deg operere med kortere og mer romslige verdier som veldig populære.

En av disse teknologiene er Hashing, som har funnet sin anvendelse i å løse mange problemer. Men, jeg tror for deg, som en vanlig bruker, er det fortsatt ikke klart hva slags dyr dette er og hva det er for. Derfor vil jeg videre prøve å forklare alt med de mest enkle ord.

Merk: Materialet er beregnet på vanlige brukere og inneholder ikke så mange tekniske aspekter, men det er mer enn nok for grunnleggende kjennskap.

Hva er Hash eller Hashing?

Jeg begynner med vilkårene.

Hash-funksjon, konvolusjonsfunksjon er en spesiell type funksjon som lar deg konvertere tekster med vilkårlig lengde til en kode med fast lengde (vanligvis en kort alfanumerisk notasjon).

Hashing er selve prosessen med å konvertere kildetekster.

Hash, Hash Code, Hash Value, Hash Sum er utgangsverdien til Hash-funksjonen, det vil si den resulterende blokken med fast lengde.

Som du kan se, har begrepene en litt figurativ beskrivelse, som det er vanskelig å forstå hva alt dette er for noe. Derfor vil jeg umiddelbart gi et lite eksempel (jeg vil snakke om resten av applikasjonene litt senere). La oss si at du har 2 10GB filer. Hvordan kan du raskt finne ut hvilken du trenger? Filnavnet kan brukes, men det er enkelt å gi det nytt navn. Du kan se datoer, men etter å ha kopiert filene kan datoene være de samme eller i en annen rekkefølge. Størrelsen, som du selv forstår, kan hjelpe lite (spesielt hvis størrelsene er de samme eller du ikke har sett på de nøyaktige verdiene til bytene).

Det er her denne Hash er nødvendig, som er en kort blokk dannet fra kildeteksten til filen. Disse to 10 GB-filene vil ha to forskjellige, men korte Hash-koder (noe som "ACCAC43535" og "BBB3232A42"). Ved å bruke dem kan du raskt finne ut ønsket fil, selv etter å ha kopiert og endret navn.

Merk: På grunn av at Hash er et veldig kjent begrep i dataverdenen og på Internett, blir ofte alt som er relatert til Hash forkortet til nettopp dette ordet. For eksempel betyr uttrykket "Jeg bruker MD5-hash" i oversettelse at nettstedet eller et annet sted bruker hashing-algoritmen til MD5-standarden.

Hash-funksjonsegenskaper

Nå skal jeg snakke om egenskapene til Hash-funksjoner, slik at det er lettere for deg å forstå hvor Hash brukes og hva som trengs til. Men først, enda en definisjon.

Kollisjon- dette er en situasjon der samme hasj-sum oppnås for to forskjellige tekster. Som du selv forstår, siden en blokk med fast lengde, har den et begrenset antall mulige verdier, og derfor er gjentakelser mulig.

Og nå til selve egenskapene til Hash-funksjonene:

1. Inndata kan være en tekst av hvilken som helst størrelse, og utdata er en datablokk med fast lengde. Dette følger av definisjonen.

2. Hash-summen av de samme tekstene må være den samme. Ellers er slike funksjoner rett og slett ubrukelige - de er analoge med et tilfeldig tall.

3. En god konvolusjonsfunksjon må ha en god fordeling. Enig at hvis størrelsen på utdata-hash er for eksempel 16 byte, så hvis funksjonen returnerer bare 3 forskjellige verdier for en tekst, så er det ingen mening i en slik funksjon og disse 16 byte (16 byte er 2 ^ 128 alternativer, som er omtrent 3, 4 * 10 ^ 38 grader).

4. Hvor godt funksjonen reagerer på de minste endringer i kildeteksten. Et enkelt eksempel. Endret 1 bokstav i en 10 GB fil, funksjonsverdien skal være annerledes. Hvis dette ikke er tilfelle, er det svært problematisk å bruke en slik funksjon.

5. Sannsynligheten for en kollisjon. En svært kompleks parameter beregnet under visse forhold. Men essensen er at hva som er poenget med hash-funksjonen hvis den resulterende hash-summen ofte vil falle sammen.

6. Hastighetsberegning av hasj. Hva er bruken av en konvolusjonsfunksjon hvis det tar lang tid å beregne? Ingen, for da er det lettere å sammenligne fildataene eller bruke en annen tilnærming.

7. Kompleksiteten ved å gjenopprette de opprinnelige dataene fra Hash-verdien. Denne egenskapen er mer spesifikk enn generell, siden dette ikke alltid er nødvendig. For de mest kjente algoritmene er imidlertid denne egenskapen estimert. For eksempel kan du knapt få den originale filen fra denne funksjonen. Men hvis det er et kollisjonsproblem (du må for eksempel finne en tekst som samsvarer med en slik Hash), så kan en slik egenskap være viktig. For eksempel passord, men mer om dem senere.

8. Åpen eller lukket kildekode for en slik funksjon. Hvis koden ikke er åpen kildekode, er kompleksiteten av datagjenoppretting, nemlig kryptografisk styrke, fortsatt i tvil. Dette er delvis et problem med kryptering.

Nå kan du gå videre til spørsmålet "hva er det for noe?"

Hvorfor trengs Hash?

Det er bare tre hovedmål for hash-funksjoner (eller rettere sagt, deres formål).

1. Sjekke dataintegritet. I dette tilfellet er alt enkelt, en slik funksjon bør beregnes raskt og tillate like raskt å kontrollere at for eksempel en fil lastet ned fra Internett ikke ble skadet under overføring.

2. Øk hastigheten på datainnhenting. En fast blokkstørrelse lar deg få mange fordeler ved å løse søkeproblemer. I dette tilfellet er poenget at teknisk sett kan bruk av hash-funksjoner ha en positiv effekt på ytelsen. For slike funksjoner er sannsynligheten for kollisjon og god fordeling svært viktig.

3. For kryptografiske behov. Denne typen foldefunksjoner brukes i de sikkerhetsområdene hvor det er viktig at resultatene er vanskelige å erstatte eller hvor det er nødvendig å gjøre oppgaven med å innhente nyttig informasjon fra Hash så vanskelig som mulig.

Hvor og hvordan brukes hasj?

Som du sikkert allerede har gjettet, brukes Hash i mange oppgaver. Her er noen av dem:

1. Passord lagres vanligvis ikke i klartekst, men i form av hash-summer, noe som gir en høyere grad av sikkerhet. Tross alt, selv om en angriper får tilgang til en slik database, vil han fortsatt måtte bruke mye tid på å finne de passende tekstene for disse hashkodene. Det er her karakteristikken "kompleksiteten ved å gjenopprette de originale dataene fra Hash-verdiene" er viktig.

Merk: Jeg anbefaler deg å lese denne artikkelen for et par tips for å forbedre passordsikkerheten.

2. I programmering, inkludert databaser. Oftest snakker vi selvfølgelig om datastrukturer som tillater raske søk. Rent teknisk aspekt.

3. Ved overføring av data over et nettverk (inkludert Internett). Mange protokoller, for eksempel TCP / IP, inkluderer spesielle avmerkingsfelt som inneholder hashen til den opprinnelige meldingen, slik at hvis det er en feil et sted, vil det ikke påvirke dataoverføringen.

4. For ulike sikkerhetsrelaterte algoritmer. For eksempel brukes Hash i elektroniske digitale signaturer.

5. For å sjekke integriteten til filene. Hvis du la merke til, kan du ofte på Internett finne ytterligere beskrivelser med en hash-kode for filer (for eksempel arkiver). Dette tiltaket brukes ikke bare for at du ikke ved et uhell skal starte en fil som ble skadet ved nedlasting fra Internett, men det er også rett og slett feil på hosting. I slike tilfeller kan du raskt sjekke Hash og, om nødvendig, laste opp filen på nytt.

6. Noen ganger brukes hash-funksjoner for å lage unike identifikatorer (som en del av). For eksempel, når de lagrer bilder eller bare filer, bruker de vanligvis Hash i navn sammen med dato og klokkeslett. Dette unngår å overskrive filer med samme navn.

Faktisk, jo lenger du kommer, jo oftere brukes hash-funksjoner i informasjonsteknologi. Hovedsakelig på grunn av at datamengden og kraften til de enkleste datamaskinene har økt kraftig. I det første tilfellet handler det mer om søk, og i det andre handler det mer om sikkerhetsspørsmål.

Bemerkelsesverdige hash-funksjoner

De mest kjente er følgende tre hash-funksjoner.