Cum se configurează smartphone-uri și PC-uri. Portal informativ

Funcția hash criptografică. Ce este Hash sau Hashing


Ce este un hash? O funcție hash este o transformare matematică a informațiilor într-un șir scurt, de lungime specifică.

De ce este necesar acest lucru? Analiza folosind funcții hash este adesea folosită pentru a monitoriza integritatea fișierelor importante ale sistemului de operare, a programelor importante și a datelor importante. Controlul poate fi efectuat fie după cum este necesar, fie în mod regulat.

Cum se face? Mai întâi, determinați integritatea fișierelor care trebuie monitorizate. Pentru fiecare fișier, valoarea lui hash este calculată folosind un algoritm special și rezultatul este salvat. După timpul necesar, se face un calcul similar și se compară rezultatele. Dacă valorile sunt diferite, atunci informațiile conținute în fișier au fost modificate.

Ce caracteristici ar trebui să aibă o funcție hash?

  • trebuie să poată efectua conversii de date arbitrare la lungime fixă;
  • trebuie să aibă un algoritm deschis, astfel încât puterea sa criptografică să poată fi investigată;
  • trebuie să fie unilateral, adică nu ar trebui să fie posibil din punct de vedere matematic să se determine datele inițiale pe baza rezultatului;
  • trebuie să „reziste” la coliziuni, adică nu trebuie să producă aceleași valori pentru diferite date de intrare;
  • nu ar trebui să necesite resurse de calcul mari;
  • cu cea mai mică modificare a datelor de intrare, rezultatul ar trebui să se schimbe semnificativ.

Care sunt algoritmii de hashing populari?În prezent sunt utilizate următoarele funcții hash:

  • CRC – cod de redundanță ciclică sau sumă de control. Algoritmul este foarte simplu și are un număr mare de variații în funcție de lungimea de ieșire necesară. Nu criptografic!
  • MD 5 este un algoritm foarte popular. Ca și versiunea anterioară, MD 4 este o funcție criptografică. Dimensiunea hash este de 128 de biți.
  • SHA -1 este, de asemenea, o funcție criptografică foarte populară. Dimensiunea hash este de 160 de biți.
  • GOST R 34.11-94 este un standard criptografic rusesc pentru calculele funcției hash. Dimensiunea hash este de 256 de biți.

Când poate un administrator de sistem să folosească acești algoritmi? Adesea, atunci când descărcați orice conținut, de exemplu, programe de pe site-ul producătorului, muzică, filme sau alte informații, există o valoare a sumelor de control calculată folosind un anumit algoritm. Din motive de securitate, după descărcare, trebuie să calculați independent funcția hash și să comparați valoarea cu ceea ce este indicat pe site sau în atașamentul la fișier. Ai făcut asta vreodată?

Ce este mai convenabil să calculezi un hash? Acum există un număr mare de utilități similare, atât plătite, cât și gratuite pentru utilizare. Mie personal mi-a plăcut HashTab. În primul rând, în timpul instalării, utilitarul este încorporat ca o filă în proprietățile fișierului, în al doilea rând, vă permite să selectați un număr mare de algoritmi de hashing și, în al treilea rând, este gratuit pentru uz privat necomercial.

Ce este rusa? După cum am menționat mai sus, în Rusia există un standard de hashing GOST R 34.11-94, care este utilizat pe scară largă de mulți producători de instrumente de securitate a informațiilor. Unul dintre aceste instrumente este programul pentru repararea și monitorizarea stării inițiale a pachetului software FIX. Acest program este un mijloc de monitorizare a eficacității utilizării securității informațiilor.

FIX (versiunea 2.0.1) pentru Windows 9x/NT/2000/XP

  • Calculul sumelor de control ale fișierelor specificate folosind unul dintre cei 5 algoritmi implementați.
  • Fixarea și monitorizarea ulterioară a stării inițiale a pachetului software.
  • Comparația versiunilor de pachete software.
  • Fixarea și controlul directoarelor.
  • Controlul modificărilor în fișierele specificate (directoare).
  • Generarea de rapoarte în formate TXT, HTML, SV.
  • Produsul are certificat FSTEC pentru NDV 3 Nr. 913 până la 1 iunie 2013.

Dar semnătura digitală? Rezultatul calculului funcției hash, împreună cu cheia secretă a utilizatorului, merge la intrarea algoritmului criptografic, unde este calculată semnătura digitală electronică. Strict vorbind, funcția hash nu face parte din algoritmul de semnătură digitală, dar adesea acest lucru este făcut intenționat pentru a exclude un atac care utilizează o cheie publică.

În prezent, multe aplicații de comerț electronic vă permit să stocați cheia secretă a utilizatorului într-o zonă privată de token (ruToken, eToken) fără capacitatea tehnică de a o prelua de acolo. Tokenul în sine are o zonă de memorie foarte limitată, măsurată în kiloocteți. Pentru a semna un document, nu există nicio modalitate de a transfera documentul în jeton în sine, dar este foarte simplu să transferați hash-ul documentului pe token și să primiți o semnătură digitală electronică ca urmare.

Adnotare: Această prelegere formulează conceptul de funcție hash și oferă, de asemenea, o scurtă prezentare generală a algoritmilor pentru generarea de funcții hash. În plus, se ia în considerare posibilitatea utilizării algoritmilor de criptare bloc pentru a genera o funcție hash.

Scopul prelegerii: să se familiarizeze cu conceptul de funcție hash, precum și cu principiile de funcționare a unor astfel de funcții.

Conceptul de funcție hash

Funcția hash este o funcție matematică sau de altă natură care, pentru un șir de lungime arbitrară, calculează o valoare întreagă sau un alt șir de lungime fixă. Matematic se poate scrie astfel:

unde M este mesajul original, uneori numit prototip, iar h este rezultatul, numit valoare hash (și de asemenea cod hash sau rezumatul mesajului(din engleza rezumatul mesajului)).

Semnificația funcției hash este de a determina trăsătura caracteristică a preimaginei - valoarea funcției hash. Această valoare are de obicei o dimensiune fixă, cum ar fi 64 sau 128 de biți. Codul hash poate fi analizat în continuare pentru a rezolva orice problemă. De exemplu, hashingul poate fi utilizat pentru a compara datele: dacă două matrice de date au coduri hash diferite, se garantează că matricele sunt diferite; dacă sunt aceleași, matricele sunt cel mai probabil aceleași. În general, nu există o corespondență unu-la-unu între datele sursă și codul hash datorită faptului că numărul de valori ale funcției hash este întotdeauna mai mic decât numărul de opțiuni de date de intrare. În consecință, există multe mesaje de intrare care dau aceleași coduri hash (astfel de situații sunt numite ciocniri). Probabilitatea de coliziuni joacă un rol important în evaluarea calității funcțiilor hash.

Funcțiile hash sunt utilizate pe scară largă în criptografia modernă.

Cea mai simplă funcție hash poate fi construită folosind operația „sum modulo 2” după cum urmează: obținem șirul de intrare, adăugăm toți octeții modulo 2 și returnăm octetul rezultat ca valoare hash. Lungimea valorii funcției hash în acest caz va fi de 8 biți, indiferent de dimensiunea mesajului de intrare.

De exemplu, să presupunem că mesajul original, tradus în formă digitală, a fost următorul (în hexazecimal):

Să convertim mesajul în formă binară, să scriem octeții unul sub celălalt și să adăugăm biții în fiecare coloană modulo 2:

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

Rezultatul (0110 0101 (2) sau 65 (16)) va fi valoarea hash.

Cu toate acestea, o astfel de funcție hash nu poate fi utilizată în scopuri criptografice, cum ar fi generarea unei semnături electronice, deoarece este destul de ușor să schimbați conținutul mesajului semnat fără a modifica valoarea sumei de control.

Prin urmare, funcția hash considerată nu este potrivită pentru aplicațiile criptografice. În criptografie, o funcție hash este considerată bună dacă este dificil să se creeze două preimagini cu aceeași valoare hash și, de asemenea, dacă rezultatul funcției nu depinde în mod explicit de intrare.

Să formulăm cerințele de bază pentru funcțiile hash criptografice:

  • funcția hash trebuie să fie aplicabilă unui mesaj de orice dimensiune;
  • calcularea valorii funcției trebuie efectuată suficient de rapid;
  • Având în vedere o valoare cunoscută a funcției hash, ar trebui să fie dificil (practic imposibil) să găsiți o imagine inversă adecvată a lui M;
  • dat fiind un mesaj M cunoscut, ar trebui să fie dificil să găsești un alt mesaj M' cu aceeași valoare hash ca și mesajul original;
  • ar trebui să fie dificil să găsești vreo pereche de mesaje distincte aleatoriu cu aceeași valoare hash.

Crearea unei funcții hash care să îndeplinească toate cerințele de mai sus nu este o sarcină ușoară. De asemenea, este necesar să ne amintim că intrarea funcției primește date de dimensiune arbitrară, iar rezultatul hash nu ar trebui să fie același pentru date de dimensiuni diferite.

În prezent, în practică, funcțiile care procesează mesajul de intrare bloc cu bloc și calculează valoarea hash h i pentru fiecare bloc M i al mesajului de intrare în funcție de dependențele formei sunt folosite ca funcții hash

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

unde h i-1 este rezultatul obținut la calcularea funcției hash pentru blocul anterior de date de intrare.

Ca rezultat, ieșirea funcției hash h n este o funcție a tuturor n blocuri ale mesajului de intrare.

Utilizarea algoritmilor de criptare bloc pentru a genera o funcție hash

Puteți utiliza o funcție hash de bloc ca funcție hash. Dacă algoritmul de bloc utilizat este criptografic puternic, atunci funcția hash bazată pe acesta va fi sigură.

Cel mai simplu mod de a utiliza un algoritm de blocare pentru a obține un cod hash este criptarea mesajului în modul CBC. În acest caz, mesajul este reprezentat ca o secvență de blocuri, a căror lungime este egală cu lungimea blocului algoritmului de criptare. Dacă este necesar, ultimul bloc este captusit în dreapta cu zerouri pentru a crea un bloc de lungimea necesară. Valoarea hash va fi ultimul bloc de text criptat. Dacă se utilizează un algoritm puternic de criptare bloc, valoarea hash rezultată va avea următoarele proprietăți:

  • Este aproape imposibil să se calculeze o valoare hash pentru o anumită matrice deschisă de informații fără a cunoaște cheia de criptare;
  • Fără a cunoaște cheia de criptare, este aproape imposibil să selectezi datele deschise pentru o anumită valoare a funcției hash.

Valoarea hash astfel generată este de obicei numită inserție de imitație sau autentificatorși este folosit pentru a verifica integritatea mesajului. Astfel, inserția imitativă este o combinație de control care depinde de datele deschise și informațiile cheie secrete. Scopul utilizării inserției imitative este de a detecta toate modificările accidentale sau intenționate în matricea de informații. Valoarea obținută de funcția hash la procesarea mesajului de intrare este atașată mesajului în momentul în care se știe că mesajul este corect. Destinatarul verifică integritatea mesajului calculând mesajul imitat al mesajului primit și comparându-l cu codul hash primit, care trebuie transmis într-o manieră sigură. Una dintre astfel de metode sigure ar putea fi criptarea inserției imitative cu cheia privată a expeditorului, de exemplu. crearea unei semnături. De asemenea, este posibil să se cripteze codul hash rezultat cu un algoritm de criptare simetric dacă expeditorul și destinatarul au o cheie de criptare simetrică comună.

Procesul specificat de obținere și utilizare a inserțiilor de imitație este descris în standardul intern GOST 28147-89. Standardul propune utilizarea celor 32 de biți inferiori ai blocului obținut la ieșirea întregii operațiuni de criptare a mesajului în modul de înlănțuire a blocurilor de criptare pentru a controla integritatea mesajului transmis. În același mod, puteți utiliza orice bloc bloc pentru a forma o inserție simulată. algoritm de criptare simetric.

O altă modalitate posibilă de a utiliza un cifru bloc pentru a genera un cod hash este următoarea. Mesajul original este procesat secvenţial în blocuri. Ultimul bloc este completat cu zerouri dacă este necesar; uneori lungimea mesajului sub forma unui număr binar este adăugată ultimului bloc. În fiecare etapă, criptăm valoarea hash obținută în etapa anterioară, folosind ca cheie blocul de mesaj curent. Ultima valoare criptată primită va fi rezultatul hash final.

De fapt, există mai multe alte scheme posibile pentru utilizarea unui cifru bloc pentru a genera o funcție hash. Fie M i blocul mesajului original, h i valoarea funcției hash la etapa i-a, f este algoritmul de criptare a blocurilor utilizat în modul de înlocuire simplă și fie operația de adăugare modulo 2. Atunci , de exemplu, sunt posibile următoarele scheme pentru generarea unei funcții hash:

În toate aceste scheme, lungimea valorii hash generată este egală cu lungimea blocului de criptare. Toate acestea, precum și alte scheme pentru utilizarea unui algoritm de criptare bloc pentru a calcula valorile hash, pot fi utilizate în practică.

Principalul dezavantaj al funcțiilor hash concepute pe baza algoritmilor bloc este viteza relativ scăzută de funcționare. Puterea criptografică necesară poate fi atinsă cu mai puține operațiuni asupra datelor de intrare. Există algoritmi de hashing mai rapizi proiectați independent, de la zero, pe baza cerințelor de putere criptografică (cele mai comune dintre ei sunt MD5, SHA-1, SHA-2 și GOST R 34.11-94).

Și așa mai departe.). Alegerea uneia sau alteia funcții hash este determinată de specificul problemei care se rezolvă. Cele mai simple exemple de funcții hash sunt suma de control sau CRC.

În general, nu există o corespondență unu-la-unu între datele sursă și codul hash. Prin urmare, există multe seturi de date care dau aceleași coduri hash - așa-numitele coliziuni. Probabilitatea de coliziuni joacă un rol important în evaluarea „calității” funcțiilor hash.

Sume de control

Necomplicat, extrem de rapid și ușor de implementat în algoritmii hardware utilizați pentru a proteja împotriva distorsiunilor neintenționate, inclusiv a erorilor hardware.

Viteza de calcul este de zeci și sute de ori mai rapidă decât funcțiile hash criptografice și mult mai simplă în implementarea hardware.

Prețul pentru o viteză atât de mare este lipsa puterii criptografice - o oportunitate ușoară de a ajusta mesajul la o sumă precunoscută. De asemenea, sumele de control (tipic: 32 de biți) sunt de obicei mai mici în lățime decât hashurile criptografice (tipic: 128, 160 și 256 de biți), ceea ce înseamnă că pot apărea coliziuni neintenționate.

Cel mai simplu caz al unui astfel de algoritm este împărțirea unui mesaj în cuvinte de 32 sau 16 biți și însumarea acestora, care este folosit, de exemplu, în TCP/IP.

De regulă, un astfel de algoritm este necesar pentru a urmări erorile hardware tipice, cum ar fi câțiva biți eronați consecutivi la o lungime dată. Așa-numita familie de algoritmi „cod de redundanță ciclică” îndeplinește aceste cerințe. Acestea includ, de exemplu, CRC32, utilizat în echipamentele ZIP.

Funcții hash criptografice

Printre multele funcții hash existente, este obișnuit să se distingă funcțiile hash puternice din punct de vedere criptografic utilizate în criptografie. O funcție hash rezistentă la cripto trebuie să aibă în primul rând rezistent la coliziune doua tipuri:

Folosind hashing

Funcțiile hash sunt, de asemenea, folosite în unele structuri de date - tabele hash și arbori cartezieni. Cerințele pentru funcția hash în acest caz sunt diferite:

  • mixabilitate bună a datelor
  • algoritm de calcul rapid

Reconcilierea datelor

În general, această aplicație poate fi descrisă ca verificarea unor informații pentru a fi identice cu originalul, fără a utiliza originalul. Pentru reconciliere, se folosește valoarea hash a informațiilor care sunt verificate. Există două domenii principale ale acestei aplicații:

Verificarea erorilor

De exemplu, suma de control poate fi transmisă prin canalul de comunicare împreună cu textul principal. La capătul de recepție, suma de control poate fi recalculată și comparată cu valoarea transmisă. Dacă este detectată o discrepanță, aceasta înseamnă că a apărut o distorsiune în timpul transmisiei și poate fi solicitată o repetare.

Un analog de uz casnic al hashingului în acest caz poate fi tehnica atunci când, la mutare, numărul de bagaje este păstrat în memorie. Apoi, pentru a verifica, nu trebuie să vă amintiți despre fiecare valiză, ci doar să le numărați. Un meci va însemna că nicio valiză nu este pierdută. Adică, numărul de bagaje este codul său hash.

Verificarea frazei de acces

În cele mai multe cazuri, frazele de acces nu sunt stocate pe ținte, sunt stocate doar valorile hash ale acestora. Nu este recomandabil să stocați fraze de acces, deoarece în cazul accesului neautorizat la un fișier cu fraze, atacatorul va afla toate frazele de acces și le va putea folosi imediat, iar la stocarea valorilor hash, va învăța doar valorile hash. care nu sunt reversibile în datele originale, în acest caz, expresie de acces. În timpul procedurii de autentificare, valoarea hash a frazei de acces introduse este calculată și comparată cu cea salvată.

Un exemplu în acest caz ar fi GNU/Linux și Microsoft Windows XP. Ele stochează doar valori hash ale frazelor de acces din conturile de utilizator.

Accelerează recuperarea datelor

De exemplu, atunci când câmpurile de text sunt scrise într-o bază de date, codul hash al acestora poate fi calculat și datele pot fi plasate într-o secțiune corespunzătoare acelui cod hash. Apoi, atunci când căutați date, va trebui mai întâi să calculați codul hash al textului și veți ști imediat în ce secțiune trebuie să îl căutați, adică va trebui să căutați nu în întreaga bază de date, ci numai într-o secțiune a acesteia (acest lucru accelerează foarte mult căutarea).

Un analog comun al hashingului în acest caz poate fi plasarea cuvintelor într-un dicționar în ordine alfabetică. Prima literă a unui cuvânt este codul său hash, iar atunci când căutăm, nu ne uităm prin întregul dicționar, ci doar litera dorită.

Lista de algoritmi

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tigru (Vârtej
  • Sumă de verificare IP Internet (RFC 1071)

Legături

Fundația Wikimedia. 2010.

Vedeți ce este „Cod hash” în alte dicționare:

    Cod hash- rezultatul unei combinații aritmetice cu toți octeții codului programului sau setului de date. Rezultatul algoritmului de hashing include doar câțiva octeți, iar algoritmul este proiectat în așa fel încât orice modificare a codului programului sau a datelor cu... ... Terminologie oficială

    Cod hash- rezultatul unei combinații aritmetice cu toți octeții codului programului sau setului de date. Rezultatul algoritmului de hashing include doar câțiva octeți, iar algoritmul este proiectat în așa fel încât orice modificare a codului programului sau a datelor cu... ...

    codul de autentificare a mesajului folosind o funcție hash- (ITU T N.235.3, ITU T N.235.1). Subiecte: telecomunicații, concepte de bază EN codul de autentificare a mesajelor hashedHMAC... Ghidul tehnic al traducătorului

    În programare, un tabel hash este o structură de date care implementează interfața matrice asociativă, și anume, vă permite să stocați perechi (cheie, valoare) și să efectuați trei operații: operația de adăugare a unei noi perechi, operația de căutare și operația de ștergere. ... Wikipedia

    MAC (codul de autentificare a mesajelor) este un mijloc de a oferi protecție împotriva imitației în protocoalele de autentificare a mesajelor cu participanți de încredere reciprocă, un set special de caractere care este adăugat la ... ... Wikipedia

    Hashing (uneori hashing) este transformarea unei matrice de date de intrare de lungime arbitrară într-un șir de biți de ieșire de lungime fixă. Astfel de transformări sunt numite și funcții hash sau funcții de convoluție, iar rezultatele lor... ... Wikipedia

    Acest articol este despre cod. Pentru metoda brainstorming, consultați cardul CRC. Verificarea redundanței ciclice (CRC) este un algoritm pentru calcularea unei sume de control conceput pentru a verifica integritatea... ... Wikipedia

    - (Prescurtare pentru codul de autentificare a mesajelor bazat pe hash, codul hash de autentificare a mesajelor). A avea o modalitate de a verifica integritatea informațiilor transmise sau stocate într-un mediu care nu are încredere este o parte integrantă și necesară a lumii... ... Wikipedia

    MI 2891-2004: Recomandare. GSOEI. Cerințe generale pentru software-ul instrumentelor de măsură- Terminologie MI 2891 2004: Recomandare. GSOEI. Cerințe generale pentru software-ul instrumentelor de măsurare: Informații de măsurare a datelor prezentate într-o formă adecvată pentru transmitere, interpretare sau prelucrare. Definițiile termenului din... ... Dicționar-carte de referință de termeni ai documentației normative și tehnice

Și așa mai departe.). Alegerea uneia sau alteia funcții hash este determinată de specificul problemei care se rezolvă. Cele mai simple exemple de funcții hash sunt suma de control sau CRC.

În general, nu există o corespondență unu-la-unu între datele sursă și codul hash. Prin urmare, există multe seturi de date care dau aceleași coduri hash - așa-numitele coliziuni. Probabilitatea de coliziuni joacă un rol important în evaluarea „calității” funcțiilor hash.

Sume de control

Necomplicat, extrem de rapid și ușor de implementat în algoritmii hardware utilizați pentru a proteja împotriva distorsiunilor neintenționate, inclusiv a erorilor hardware.

Viteza de calcul este de zeci și sute de ori mai rapidă decât funcțiile hash criptografice și mult mai simplă în implementarea hardware.

Prețul pentru o viteză atât de mare este lipsa puterii criptografice - o oportunitate ușoară de a ajusta mesajul la o sumă precunoscută. De asemenea, sumele de control (tipic: 32 de biți) sunt de obicei mai mici în lățime decât hashurile criptografice (tipic: 128, 160 și 256 de biți), ceea ce înseamnă că pot apărea coliziuni neintenționate.

Cel mai simplu caz al unui astfel de algoritm este împărțirea unui mesaj în cuvinte de 32 sau 16 biți și însumarea acestora, care este folosit, de exemplu, în TCP/IP.

De regulă, un astfel de algoritm este necesar pentru a urmări erorile hardware tipice, cum ar fi câțiva biți eronați consecutivi la o lungime dată. Așa-numita familie de algoritmi „cod de redundanță ciclică” îndeplinește aceste cerințe. Acestea includ, de exemplu, CRC32, utilizat în echipamentele ZIP.

Funcții hash criptografice

Printre multele funcții hash existente, este obișnuit să se distingă funcțiile hash puternice din punct de vedere criptografic utilizate în criptografie. O funcție hash rezistentă la cripto trebuie să aibă în primul rând rezistent la coliziune doua tipuri:

Folosind hashing

Funcțiile hash sunt, de asemenea, folosite în unele structuri de date - tabele hash și arbori cartezieni. Cerințele pentru funcția hash în acest caz sunt diferite:

  • mixabilitate bună a datelor
  • algoritm de calcul rapid

Reconcilierea datelor

În general, această aplicație poate fi descrisă ca verificarea unor informații pentru a fi identice cu originalul, fără a utiliza originalul. Pentru reconciliere, se folosește valoarea hash a informațiilor care sunt verificate. Există două domenii principale ale acestei aplicații:

Verificarea erorilor

De exemplu, suma de control poate fi transmisă prin canalul de comunicare împreună cu textul principal. La capătul de recepție, suma de control poate fi recalculată și comparată cu valoarea transmisă. Dacă este detectată o discrepanță, aceasta înseamnă că a apărut o distorsiune în timpul transmisiei și poate fi solicitată o repetare.

Un analog de uz casnic al hashingului în acest caz poate fi tehnica atunci când, la mutare, numărul de bagaje este păstrat în memorie. Apoi, pentru a verifica, nu trebuie să vă amintiți despre fiecare valiză, ci doar să le numărați. Un meci va însemna că nicio valiză nu este pierdută. Adică, numărul de bagaje este codul său hash.

Verificarea frazei de acces

În cele mai multe cazuri, frazele de acces nu sunt stocate pe ținte, sunt stocate doar valorile hash ale acestora. Nu este recomandabil să stocați fraze de acces, deoarece în cazul accesului neautorizat la un fișier cu fraze, atacatorul va afla toate frazele de acces și le va putea folosi imediat, iar la stocarea valorilor hash, va învăța doar valorile hash. care nu sunt reversibile în datele originale, în acest caz, expresie de acces. În timpul procedurii de autentificare, valoarea hash a frazei de acces introduse este calculată și comparată cu cea salvată.

Un exemplu în acest caz ar fi GNU/Linux și Microsoft Windows XP. Ele stochează doar valori hash ale frazelor de acces din conturile de utilizator.

Accelerează recuperarea datelor

De exemplu, atunci când câmpurile de text sunt scrise într-o bază de date, codul hash al acestora poate fi calculat și datele pot fi plasate într-o secțiune corespunzătoare acelui cod hash. Apoi, atunci când căutați date, va trebui mai întâi să calculați codul hash al textului și veți ști imediat în ce secțiune trebuie să îl căutați, adică va trebui să căutați nu în întreaga bază de date, ci numai într-o secțiune a acesteia (acest lucru accelerează foarte mult căutarea).

Un analog comun al hashingului în acest caz poate fi plasarea cuvintelor într-un dicționar în ordine alfabetică. Prima literă a unui cuvânt este codul său hash, iar atunci când căutăm, nu ne uităm prin întregul dicționar, ci doar litera dorită.

Lista de algoritmi

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Tigru (Vârtej
  • Sumă de verificare IP Internet (RFC 1071)

Legături

Fundația Wikimedia. 2010.

  • Heshan Moheyan
  • Cod hash

Vedeți ce este o „funcție Hash” în alte dicționare:

    Funcția hash- o funcție care realizează hashingul unei matrice de date prin maparea valorilor dintr-un set (foarte) mare de valori într-un set (semnificativ) mai mic de valori. În engleză: Funcția Hash Vezi și: Algoritmi criptografici Financiar... ... Dicţionar financiar

    funcția hash criptografică- O funcție care convertește text de lungime arbitrară în text de lungime fixă ​​(în majoritatea cazurilor mai mică). Aplicația principală a funcțiilor hash este în schema de semnătură digitală. Deoarece funcția hash este calculată mai rapid decât o semnătură digitală, atunci în loc de... ...

    Funcție hash într-un singur sens- funcția hash, care este o funcție ireversibilă din punct de vedere computațional. În engleză: Funcția hash unidirecțională Vezi și: Algoritmi criptografici Dicționar financiar Finam... Dicţionar financiar

    TIGER - funcție hash- Funcția hash TIGER dezvoltată de Ros Anderson și Eli Beham în 1996. Funcția de hash TIGER este o nouă funcție de hash rapidă care este concepută pentru a fi foarte rapidă pe computerele moderne, în special pe computerele pe 64 de biți. TIGRU...... Wikipedia

    funcția hash unidirecțională- Pentru o funcție unidirecțională, este imposibil din punct de vedere computațional să găsiți două argumente diferite pentru care valorile sale sunt aceleași. [] Subiecte securitatea informațiilor RO funcția hash unidirecțională... Ghidul tehnic al traducătorului

    Tigru (funcție hash)- Funcția Tiger hash dezvoltată de Ros Anderson și Eli Beham în 1995. Tiger a fost conceput pentru a rula foarte rapid pe computere pe 64 de biți. Tiger nu are restricții de brevet, poate fi folosit liber cu... ... Wikipedia

    funcția hash- funcția hash 1. O funcție care controlează procesul de introducere a datelor într-un tabel hash, determinând (adresele celulelor libere. 2. O funcție care reprezintă o mapare a unui fragment dintr-un mesaj deschis într-un șir criptat de lungime fixă. În ...... Ghidul tehnic al traducătorului

    Tabel de hash- În programare, un tabel hash este o structură de date care implementează interfața matrice asociativă, și anume, vă permite să stocați perechi (cheie, valoare) și să efectuați trei operații: operația de adăugare a unei noi perechi, operația de căutare și ștergerea operațiune... Wikipedia

    Cod hash- Conversia hashing (uneori hashing, hashing în engleză) a unei matrice de date de intrare de lungime arbitrară într-un șir de biți de ieșire de lungime fixă. Astfel de transformări sunt numite și funcții hash sau funcții de convoluție, iar rezultatele lor... ... Wikipedia

    Ciocnirea funcției hash- O coliziune cu funcția hash H este două blocuri de date de intrare diferite x și y astfel încât H(x) = H(y). Există coliziuni pentru majoritatea funcțiilor hash, dar pentru funcțiile hash „bune” frecvența apariției lor este aproape de minimul teoretic. În... ... Wikipedia

Algoritmii de căutare pe care i-am luat în considerare se bazează de obicei pe o operație de comparare abstractă. Ceea ce iese în evidență din această serie este metoda de căutare distributivă, descrisă în „Tabelele de simboluri și arborii de căutare binari”, în care elementul cu cheia i este stocat în poziția i-a a tabelului, ceea ce vă permite să îl accesați direct. Căutarea distributivă folosește valorile cheie ca indici de matrice, mai degrabă decât operanzi ai unei operațiuni de comparare; Metoda în sine se bazează pe faptul că cheile sunt numere întregi diferite din același interval ca și indecșii tabelului. În acest capitol, ne vom uita la hashing, o versiune avansată a căutării distributive folosită în aplicații de căutare mai tipice, unde cheile nu au proprietăți atât de convenabile. Rezultatul final al acestei abordări este complet diferit de metodele bazate pe comparație - în loc să navigăm prin structurile de date din dicționar prin compararea cheilor de căutare cu cheile din elemente, încercăm să accesăm elementele din tabel direct prin efectuarea unei conversii aritmetice a cheilor. la adrese de tabel.

Algoritmii de căutare care utilizează hashing au două părți distincte. Primul pas este de a calcula o funcție hash care convertește cheia de căutare într-o adresă din tabel. În mod ideal, chei diferite s-ar mapa la adrese diferite, dar adesea două sau mai multe chei diferite se pot mapa la aceeași adresă în tabel. Prin urmare, a doua parte a căutării prin hashing este procesul de rezoluție a coliziunilor, care gestionează astfel de chei. Una dintre tehnicile de rezolvare a conflictelor pe care le vom analiza în acest capitol folosește liste legate, deci are aplicare imediată în situații dinamice în care este dificil să se prezică în avans numărul de chei de căutare. Celelalte două metode de rezoluție a coliziunilor ating un nivel ridicat performanţă caută deoarece elementele sunt stocate într-o matrice fixă. Vom lua în considerare o modalitate de a îmbunătăți aceste metode, permițându-le să fie utilizate în cazurile în care dimensiunea tabelului nu poate fi prezisă în avans.

Hashingul este un bun exemplu al echilibrului dintre timp și memorie. Dacă nu ar exista o limită a cantității de memorie utilizată, orice căutare ar putea fi efectuată cu un singur acces la memorie, pur și simplu folosind cheia ca adresă de memorie, ca într-o căutare distributivă. Cu toate acestea, acest caz ideal nu este de obicei realizabil, deoarece cheile lungi pot necesita o cantitate mare de memorie. Pe de altă parte, dacă nu ar exista restricții asupra perioada de graţie, ar fi posibil să se descurce cu o cantitate minimă de memorie folosind metoda de căutare secvențială. Hashing este o modalitate de a folosi o cantitate rezonabilă atât de memorie, cât și de timp și de a obține un echilibru între aceste două extreme. În special, puteți menține orice echilibru prin simpla schimbare a dimensiunii tabelului, în loc să rescrieți codul sau să alegeți diferiți algoritmi.

Hashingul este una dintre problemele clasice din informatică: diverșii algoritmi ai săi au fost studiați în detaliu și sunt utilizați pe scară largă. Vom vedea că, în ipoteze foarte laxe, putem spera să suportăm operațiuni de găsire și inserare în tabele de simboluri cu timp de execuție constant, indiferent de dimensiunea tabelului.

Această valoare așteptată este performanța teoretică optimă pentru orice implementare a tabelului de simboluri, dar hashingul nu este încă un panaceu din două motive principale. In primul rand, perioada de graţie depinde de lungimea cheii, care în aplicațiile reale folosind chei lungi poate fi semnificativă. În al doilea rând, hashingul nu oferă implementări eficiente ale altor operațiuni din tabelul de simboluri, cum ar fi selectarea sau sortarea. În acest capitol vom analiza în detaliu aceste și alte probleme.

Funcții hash

În primul rând, este necesar să se rezolve problema calculării unei funcții hash care convertește cheile în adrese de tabel. De obicei, implementarea acestui calcul aritmetic nu este dificilă, dar trebuie totuși să aveți grijă să nu întâlniți diverse capcane subtile. Dacă aveți un tabel care poate conține M elemente, aveți nevoie de o funcție care convertește cheile în numere întregi din interval. O funcție hash ideală ar trebui să fie ușor de calculat și ar trebui să fie similară cu o funcție aleatoare: pentru orice argument dat, rezultatele ar trebui să fie într-un anumit sens la fel de probabile.

Funcția hash depinde de tipul cheii. Strict vorbind, fiecare tip posibil de cheie necesită o funcție hash separată. Pentru a îmbunătăți eficiența, este de obicei de dorit să se evite conversia explicită a tipului, îndreptându-se în schimb la ideea de a trata reprezentarea binară a cheilor dintr-un cuvânt de mașină ca un număr întreg care poate fi utilizat în calcule aritmetice. Hashing-ul precede limbajele de nivel înalt - pe computerele timpurii era obișnuit să se trateze o valoare fie ca o cheie șir, fie ca un număr întreg. Unele limbaje de nivel înalt îngreunează scrierea de programe care depind de reprezentarea tastelor de către un anumit computer, deoarece astfel de programe sunt în mod inerent dependente de mașină și, prin urmare, dificil de portat pe un alt computer. În mod obișnuit, funcțiile hash depind de procesul de conversie a cheilor în numere întregi, așa că poate fi dificil ca implementările hash să fie atât independente de mașină, cât și eficiente. În general, cheile simple întregi sau în virgulă mobilă pot fi convertite cu o singură operație a mașinii, dar cheile șir și alte tipuri de taste compozite necesită mai multă suprasarcină și o atenție sporită acordată eficienței.

Probabil cea mai simplă situație este atunci când tastele sunt numere în virgulă mobilă dintr-un interval fix. De exemplu, dacă cheile sunt numere mai mari decât 0 și mai mici de 1, puteți pur și simplu să le înmulțiți cu M, să rotunjiți rezultatul la cel mai mic număr întreg și să obțineți o adresă în intervalul între 0 și M - 1; un astfel de exemplu este prezentat în fig. 14.1. Dacă cheile sunt mai mari decât s și mai mici decât t, ele pot fi scalate scăzând s și împărțind cu t-s, aducându-le în intervalul de valori între 0 și 1, apoi înmulțind cu M pentru a obține adresa din tabel .


Orez. 14.1.

Pentru a converti numerele în virgulă mobilă între 0 și 1 în indici ai unui tabel a cărui dimensiune este 97, înmulțiți acele numere cu 97. În acest exemplu, au avut loc trei coliziuni: pentru indici egali cu 17, 53 și 76. Valorile hash sunt determinați de cei mai înalți biți ai cheii, biții de ordin inferior nu joacă niciun rol. Unul dintre obiectivele proiectării unei funcții hash este acela de a elimina acest dezechilibru, astfel încât fiecare bit să fie numărat în timpul calculului.

Dacă cheile sunt numere întregi pe w biți, acestea pot fi convertite în floats și împărțite la 2 w pentru a produce floats în intervalul între 0 și 1, apoi înmulțite cu M ca în paragraful anterior. Dacă operațiunile cu virgulă mobilă durează mult și numerele nu sunt suficient de mari pentru a provoca o depășire, același rezultat poate fi obținut folosind aritmetica întregului: înmulțiți tasta cu M, apoi deplasați dreapta w biți pentru a împărți la 2 w (sau, dacă înmulțirea are ca rezultat un depășire, faceți o tură și apoi o înmulțire). Astfel de metode sunt inutile pentru hashing, cu excepția cazului în care cheile sunt distribuite uniform în interval, deoarece valoarea hash este determinată doar de cifrele inițiale ale cheii.

O metodă mai simplă și mai eficientă pentru numerele întregi pe w biți este una dintre cele mai frecvent utilizate metode de hashing - alegerea unui număr prim ca dimensiunea M a tabelului și calcularea restului la împărțirea k la M, adică. h(k) = k mod M pentru orice cheie întreagă k. Această funcție se numește funcție hash modulară. Este foarte ușor de calculat (k % M în C++) și este eficient pentru a obține o distribuție uniformă a valorilor cheie între valorile mai mici decât M. Un mic exemplu este prezentat în Figura 1. 14.2.


Orez. 14.2.

Cele trei coloane din dreapta arată rezultatul hashingului cheilor pe 16 biți afișate în stânga utilizând următoarele funcții:

v% 97 (stânga)

v% 100 (centru) și

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

unde a = .618033. Dimensiunile tabelului pentru aceste funcții sunt, respectiv, 97, 100 și 100. Valorile apar aleatoare (deoarece cheile sunt aleatorii). A doua funcție (v % 100) folosește numai cele două cifre din dreapta ale tastelor și, prin urmare, poate prezenta performanțe slabe pentru cheile non-aleatorie.

Hashingul modular se aplică și tastelor cu virgulă mobilă. Dacă cheile sunt într-un interval mic, le puteți scala la numere între 0 și 1,2 w pentru a produce valori întregi pe w biți și apoi utilizați o funcție hash modulară. O altă opțiune este să utilizați pur și simplu reprezentarea binară a cheii (dacă este disponibilă) ca operand al funcției hash modulare.

Hashingul modular este folosit în toate cazurile în care există acces la biții care alcătuiesc cheile, fie că sunt numere întregi reprezentate de un cuvânt de mașină, o secvență de caractere împachetate într-un cuvânt de mașină sau reprezentate de orice altă variantă posibilă. O secvență de caractere aleatoare împachetate într-un cuvânt de mașină nu este exact aceeași cu cheile întregi aleatoare, deoarece nu toți biții sunt folosiți pentru codare. Dar ambele tipuri (și orice alt tip de cheie codificat pentru a se potrivi într-un cuvânt de mașină) pot fi făcute să apară ca indici aleatori pe un tabel mic.

Motivul principal pentru alegerea unui tabel de hash primar de dimensiune M pentru hashing modular este prezentat în Fig. 14.3. În acest exemplu de date de caractere pe 7 biți, cheia este tratată ca un număr de bază 128 - o cifră pentru fiecare caracter din cheie. Cuvântul corespunde acum numărului 1816567, care poate fi scris și ca

deoarece în codul ASCII caracterele n, o și w corespund numerelor 1568 = 110, 1578 = 111 și 1678 = 119. Alegerea unei dimensiuni de tabel de M = 64 pentru acest tip de cheie este nefericită, deoarece adăugarea multiplilor lui 64 (sau 128) la x nu schimbă valoarea lui x mod 64 - pentru orice cheie, valoarea hash este valoarea ultimelor 6 cifre a acelei chei. Desigur, o funcție hash bună trebuie să țină cont de toți biții de cheie, în special pentru cheile de caractere. Situații similare pot apărea atunci când M conține un factor care este o putere a lui 2. Cel mai simplu mod de a evita acest lucru este să alegeți un număr prim pentru M.


Orez. 14.3.

Fiecare rând al acestui tabel conține: un cuvânt de 3 litere, o reprezentare ASCII a cuvântului respectiv ca număr de 21 de biți în forme octale și zecimale și funcții hash modulare standard pentru dimensiunile tabelelor 64 și 31 (cele două coloane din dreapta). O dimensiune a tabelului de 64 produce rezultate nedorite, deoarece numai biții din dreapta cheii sunt utilizați pentru a obține valoarea hash, iar literele din cuvintele obișnuite nu sunt distribuite uniform. De exemplu, toate cuvintele care se termină cu litera y au o valoare hash de 57. În schimb, valoarea simplă 31 provoacă mai puține coliziuni într-un tabel care are mai mult de jumătate din dimensiune.

Hashingul modular este foarte simplu de implementat, cu excepția faptului că dimensiunea tabelului trebuie să fie un număr prim. Pentru unele aplicații, vă puteți mulțumi cu un număr prim mic cunoscut sau puteți căuta în lista numerelor prime cunoscute unul care se apropie de dimensiunea necesară a tabelului. De exemplu, numerele egale cu 2 t - 1 sunt prime atunci când t = 2, 3, 5, 7, 13, 17, 19 și 31(și pentru nicio altă valoare a lui t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не единственная причина, по которой размер таблицы стоит сделать простым числом; еще одна причина рассматривается в разделе 14.4.


Orez. 14.4.

Acest tabel al celor mai mari numere prime mai mici de 2 n este pentru , poate fi folosit pentru a aloca dinamic un tabel hash atunci când doriți ca dimensiunea tabelului să fie un număr prim. Pentru orice valoare pozitivă dată din intervalul acoperit, acest tabel poate fi utilizat pentru a determina numărul prim care diferă cu mai puțin de un factor de 2.

O altă opțiune pentru manipularea cheilor întregi este să combinați metodele multiplicative și modulare: înmulțiți cheia cu o constantă între 0 și 1, apoi împărțiți modulo M. Cu alte cuvinte, trebuie să utilizați funcția . Există o relație între valorile lui , M și radixul efectiv al cheii care ar putea duce teoretic la un comportament anormal, dar dacă se utilizează o valoare arbitrară a lui a, este puțin probabil să apară vreo problemă într-o aplicație reală. Adesea valoarea φ = 0,618033... (rația de aur) este aleasă ca a.

Au fost explorate multe alte variante ale acestei teme, în special funcțiile hash, care pot fi implementate folosind instrucțiuni eficiente ale mașinii, cum ar fi schimbarea și alocarea măștilor (vezi secțiunea referințe).

În multe aplicații care folosesc tabele de simboluri, cheile nu sunt numere și nu sunt neapărat scurte; mai des acestea sunt șiruri alfanumerice care pot fi destul de lungi. Deci, cum calculezi o funcție hash pentru un cuvânt precum averylongkey?

În codul ASCII pe 7 biți, acest cuvânt corespunde unui număr de 84 de biți \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(align*),

care este prea mare pentru a gestiona funcțiile aritmetice normale pe majoritatea computerelor. Și adesea este necesar să procesați chei mult mai lungi.

Pentru a calcula o funcție hash modulară pentru cheile lungi, acestea sunt convertite fragment cu fragment. Puteți profita de proprietățile aritmetice ale funcției de modul și puteți utiliza algoritmul lui Horner (vezi Secțiunea 4.9 „Tipuri de date abstracte”). Această metodă se bazează pe un alt mod de scriere a numerelor corespunzătoare tastelor. Pentru exemplul luat în considerare, scriem următoarea expresie: \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. \end(align* )

Adică, numărul zecimal corespunzător codificării caracterelor unui șir poate fi calculat prin scanarea acestuia de la stânga la dreapta, înmulțind valoarea acumulată cu 128 și apoi adăugând valoarea de codificare a următorului caracter. În cazul unui șir lung, această metodă de calcul va duce în cele din urmă la un număr mai mare decât cel care poate fi reprezentat în general într-un computer. Cu toate acestea, acest număr nu este necesar, deoarece este necesar doar restul (mic) al împărțirii sale cu M. Rezultatul poate fi obținut fără a stoca măcar o valoare acumulată mare, deoarece în orice moment al calculului, putem arunca un multiplu de M - de fiecare dată când efectuăm înmulțirea și adunarea, trebuie doar să stocăm restul împărțirii modulo M. Rezultatul va fi același ca și cum am avea ocazia să calculăm un număr lung și apoi efectuați împărțirea (vezi. exercițiul 14.10). Această observație duce la o metodă aritmetică simplă pentru calcularea funcțiilor hash modulare pentru șiruri lungi - vezi Programul 14.1. Acest program folosește un ultim truc: în loc să folosească baza 128, folosește numărul prim 127. Motivul acestei schimbări este discutat în paragraful următor.

Există multe modalități de a calcula funcțiile hash la aproximativ același cost ca hashingul modular folosind metoda lui Horner (una sau două operații aritmetice pentru fiecare caracter din cheie). Pentru cheile aleatoare, aceste metode sunt practic aceleași, dar cheile reale sunt rareori aleatorii. Capacitatea de a randomiza chei reale la costuri reduse ne determină să luăm în considerare algoritmi de hashing aleatoriu, deoarece avem nevoie de funcții hash care creează indici aleatori pe un tabel, indiferent de distribuția cheilor. Randomizarea nu este dificil de organizat, deoarece nu este deloc necesar să aderăm literalmente la definiția hashingului modular - este necesar doar ca în calculul unui număr întreg mai mic decât M să fie utilizați toți biții cheii.

Programul 14.1. Funcție hash pentru taste șir

M = 96 și a = 128 (sus),

M = 97 și a = 128 (centru) și

M=96 și a=127 (jos)

Distribuția neuniformă în primul caz este rezultatul utilizării neuniforme a literelor și al persistenței neuniformității datorită faptului că atât dimensiunea tabelului, cât și factorul sunt multipli ai lui 32. Celelalte două exemple par a fi aleatorii deoarece tabelul mărimea și factorul sunt numere coprime.

Programul 14.1 arată o modalitate de a face acest lucru: utilizarea unui prim de bază în loc de o putere de 2 și un număr întreg corespunzător reprezentării ASCII a șirului. În fig. 14.5 Fig. Figura 14.5 arată modul în care această modificare îmbunătățește distribuția pentru cheile de șir tipice. În teorie, valorile hash produse de Programul 14.1 ar putea produce rezultate slabe pentru dimensiunile tabelelor care sunt multipli de 127 (deși în practică acest lucru ar fi probabil aproape imperceptibil); pentru a crea un algoritm randomizat, se poate alege o valoare multiplicatoare la întâmplare. O abordare și mai eficientă este utilizarea valorilor aleatorii pentru coeficienții din calcul și o valoare aleatorie diferită pentru fiecare cifră a cheii. Această abordare produce un algoritm randomizat numit hashing universal.

Teoretic, o funcție hash universală ideală este una pentru care probabilitatea unei coliziuni între două chei diferite dintr-un tabel de dimensiunea M este exact 1/M. Se poate dovedi că utilizarea unei secvențe de valori distincte aleatoare ca coeficient a din Programul 14.1, mai degrabă decât o valoare arbitrară fixă, transformă hashingul modular într-o funcție hash universală. Cu toate acestea, costul generării unui nou număr aleator pentru fiecare caracter din cheie este de obicei inacceptabil. În practică, compromisul prezentat în Programul 14.1 poate fi atins prin nu stocarea unui tablou de numere aleatoare diferite pentru fiecare caracter cheie, ci prin variarea coeficienților prin generarea unei secvențe pseudo-aleatoare simple.

Pentru a rezuma, pentru a utiliza hashing pentru a implementa un tabel de simbol abstract, mai întâi trebuie să extindeți interfața de tip abstract pentru a include o operație hash, care mapează cheile la numere întregi nenegative mai mici decât dimensiunea tabelului M.

Cele mai bune articole pe această temă