Puncte:2

De ce funcțiile hash universale împiedică adversarii, dar funcțiile hash uniforme nu?

drapel cn

Înainte de a-mi expune întrebarea reală, permiteți-mi mai întâi câteva terminologii, astfel încât să fim cu toții pe aceeași pagină:

Lăsa $U=\{k_1,...,k_u\}$ universul cheilor posibile, $|U|=u$. Folosim o tabelă hash $T$ cu $m$ celule, numărând de la $0$ la $m-1$. Folosim o familie de funcții hash $H$, astfel încât fiecare $h\în H$ are probabilitatea 1 USD/m$ că două chei distincte $k$ și $k'$ hash, deci aceeași valoare, adică $P(h(k)=h(k'))=1/m$.

În cele din urmă, hashing universal înseamnă că pentru hashing, o funcție hash aleatorie (satisfăcător 1 USD/m$ cerința menționată mai sus) este aleasă din H. Conform cercetării mele (și aceasta pare să fie în conformitate cu binecunoscutul manual de algoritmi CLRS), folosim întotdeauna doar un singur funcția hash pe toată durata de rulare a tabelului nostru hash. Celelalte elemente din familia hash sunt astfel relevante doar în timp ce tabelul este creat (adică, la primul apel de program), dar una din această funcție a fost aleasă ca fiind fixă ​​și toate celelalte nu mai sunt relevante. Acest lucru are, de asemenea, sens, deoarece dacă ați alege diferite funcții hash pentru diferite chei, atunci trebuie să aveți din nou o mapare de la tastă la funcția utilizată -- ceea ce nu ar avea prea mult sens, aceasta este problema pe care o vom rezolva. : știi unde să depozitezi cheia; dar funcția hash aleasă ar depinde de cheie, așa că am obține un paradox. :) Deci, este destul de logic să alegem o singură funcție pe toată durata de rulare.

După ce am clarificat că, intrebarea mea:

Cum ne ajută alegerea unei funcții hash aleatoare să ne apărăm de un adversar, dacă este încă fixă ​​pe durata de viață a mesei? Nu văd nicio diferență pentru a avea o singură funcție hash fixată în avans.

Singura motivație menționată în orice prelegere și material academic este aceea de a îngreuna viața unui adversar, deoarece pentru orice funcție hash fixă ​​putem concepe o secvență de chei care se hash la aceeași valoare, provocând astfel comportamentul în cel mai rău caz al tabelului hash. Așadar, afirmația este că, deoarece alegem acum o funcție hash aleatorie, nu mai știți care este folosită, așa că nici nu puteți concepe o astfel de secvență de taste de atac. Pur și simplu nu cumpăr argumentul ăsta.

După ce ați creat tabelul de hash cu hashing universal de asemenea au o singură funcție hash pentru care poți găsi o astfel de secvență, așa că nu am rezolvat problema. Cred că întrebarea importantă este de unde ar trebui să știe un adversar care funcție hash este folosită!

Deci, dacă folosim doar o singură funcție hash și chiar o facem publică, atunci poți fi atacat, desigur. Dar de ce ar trebui acea funcție să fie publică? Codul nu este aproape niciodată public, nu-i așa? Deci, presupunând că acel cod nu este public, un adversar nu știe ce funcție hash este folosită -- dacă aveți una singură sau una aleasă la întâmplare dintr-o familie întreagă.

Astfel, dacă presupunem că funcția nu este publică și adversarul o poate deduce „cumva” (este chiar posibil? Măsurând timpii de execuție, de exemplu?), atunci din nou nu are nicio diferență dacă există una care este fixată în avans sau dacă s-a remediat numai după inițializarea tabelului.

Astfel, în orice caz, argumentul adversarului pare să nu funcționeze - pare să fie greșit, cu excepția cazului în care funcția hash folosită este de fapt publică, ceea ce pur și simplu nu pot să cred. Deci, ce se întâmplă aici?

Puncte:1
drapel ng

Într-adevăr, în aplicarea tabelelor hash, rațiunea alegerii la întâmplare a unei funcții hash într-o familie de funcții hash universal este de a asigura că adversarii care folosesc tabelul hash nu știu ce funcție hash am ales. Și asta, combinat cu proprietățile unei familii de funcții hash universale, face ca adversarii să nu poată crea intenționat coliziuni hash.

Codul nu este aproape niciodată public, nu-i așa?

Pe Principiul (al doilea) al lui Kerckhoffs, trebuie să presupunem că adversarii cunosc codul. Acest lucru reflectă faptul că codul obiect este foarte des accesibil adversarilor și (deși necesită efort) este posibil să se efectueze o inginerie inversă a ceea ce face (de asemenea, software-ul open-source este din ce în ce mai comun). Deci, în loc să presupunem că codul este secret, facem o presupunere mult mai mică că alegerea funcției hash în familia de funcții hash universală este aleatorie și secretă.Aceasta este o presupunere rezonabilă, cel puțin inițial, pentru că alegerea se face în timpul execuției, când aplicația este pornită (sau, pentru o bază de date, când este creată baza de date), și astfel analiza codului singură nu va ajuta la determinarea acestei alegeri.

Important, o implementare ar trebui să încerce ca această alegere să nu se scurgă, de ex. printr-o sincronizare canal lateral. Este destul de dificil, deoarece evităm coliziunile pentru că încetinesc lucrurile, astfel că coliziunile sunt în mod inerent detectabile prin sincronizare.

Prof.Chaos avatar
drapel cn
Ah, deci este într-adevăr pentru că presupunerea este că codul este cunoscut. Cine ar fi crezut.:) Mulțumesc!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.