Studiem un hash $H$ definit de $H(m):=H_2(H_1(m))$, cu SHA-256 pentru $H_1$ si MD5 pentru $H_2$.
The Rezistența la coliziune a MD5 este grav ruptă, prin urmare argumentul generic¹ că rezistența la coliziune a $H$ este cel puțin cea mai slabă dintre rezistența la coliziune a $H_1$ și $H_2$ nu ne duce nicăieri.
Argumentul genericâ² că prima rezistență preimagine a $H$ este cel putin aceea de $H_2$ funcționează în măsura în care avem încredere în rezistența preimagine a MD5; care este pus la îndoială (vezi acest), dar nu rupte în practică.
Singurul lucru la care mă pot gândi despre rezistența a doua preimagine $H$ este că nu poate fi mai bună decât rezistența a doua preimagine a $H_1$. Acest lucru nu oferă nicio asigurare de securitate și, din moment ce rezistența a doua preimagine a SHA-256 este considerată bună, nici nu dă un atac.
Din punct de vedere aplicat (despre care pare să fie întrebarea, deoarece menționează o aplicație concretă), nu văd că niciunul dintre atacurile criptoanalitice existente asupra MD5 sau SHA-256 sunt relevante.
- Rezistența la coliziune a MD5 este ruptă.Dar dimensiunea scurtă de intrare MD5 (dimensiunea de ieșire de 256 de biți a lui SHA-256 este doar o jumătate de bloc de intrare din MD5) și constrângerea grea că această intrare este un hash, sunt suficiente pentru a face inaplicabile atacurile de coliziune MD5 existente (restricționând celor mult mai buni decât forța brută).
- Atât SHA-256, cât și MD5 au un efect nedorit proprietatea extensiei de lungime, dar lungimea fixă a intrării MD5 o blochează pentru proprietatea lui MD5. Și re-hashing-ul ieșirii SHA-256 la jumătate de dimensiune blochează cel pentru SHA-256.
Astfel, singurele atacuri relevante din punct de vedere criptografic pe care le văd sunt cele care rămân pentru hashuri ideale $H_1$ și $H_2$ cu lăţimea lor de ieşire respectivă. De cand $H_2$ este mult mai îngustă decât $H_1$, atacurile cu forță brută sunt limitate de lățimea de $H_2$ și considerente de viteză. În special:
- Hash-ul compus al întrebării are o lățime de numai 128 de biți, astfel că coliziunile pot fi afișate cu aproximativ $2^{66}$ evaluări (atât pentru SHA-256, cât și pentru MD5) folosind un standard căutare distribuită de coliziuni. Îmi pot imagina situații în care rezistența scăzută la coliziune este o problemă (și nu pot spune aici, asta depinde de aplicație).
- Hashul compus nu este utilizabil pentru întinderea cheii, așa cum ar fi nevoie pentru parole, pentru că este mult prea rapid și nu este greu de memorie. Totuși, nu există nicio indicație că întinderea cheii este o cerință.
Acest hash compus nu are un argument clar de securitate, nu este foarte rapid, mai ales pentru introducerea scurtă, și este rău din perspectiva relațiilor publice, deoarece MD5 este stricat. Din câte îmi dau seama, este in practica cam la fel de bun pe cât poate fi orice hash ușor de rapid pe 128 de biți tehnic puncte de vedere, inclusiv nesatisfăcător în ceea ce privește rezistența la coliziune (dar nu există nicio certitudine că rezistența la coliziune este o cerință în cazul de utilizare).Nu văd niciun motiv să folosesc acel hash compus mai degrabă decât ceva mai modern și mai sigur decât MD5, inclusiv unele SHA-2 (eventual trunchiate) sau SHAKE128 de la SHA-3 cu dimensiunea de ieșire reglabilă sau Blake2b (sau Blake3 după ce praful se așează) .
¹ Ipoteza o coliziune pentru $H$, acesta este $(m,m')$ cu $m\ne m'$ și $H(m)=H(m')$. Putem calcula $w=H_1(m)$ și $w'=H_1(m')$. Dacă $w=w'$, avem o coliziune pentru $H_1$. Altfel, avem $H_2(w)=H_2(w')$ cu $w\ne w'$, deci o coliziune pentru $H_2$. Astfel am spart rezistența la coliziune pt $H_1$ sau $H_2$.
² Emiteți ipoteza unui algoritm care găsește prima preimagine pentru $H$, care este dat $h$ găsirea $m$ astfel încât $H(m)=h$ cu probabilitate deloc neglijabilă și efort fezabil. Putem calcula $w=H_1(m)$ și este așa încât $h=H_2(w)$. Astfel am construit o metodă de găsire a primei imagini prealabile pentru $H_2$ cu aceeași probabilitate neneglijabilă de succes și în esență același efort ca și algoritmul ipotetizat.
³ Un algoritm care găsește a doua preimagine pentru $H_1$, care este dat $m$ găsirea $m'\ne m$ astfel încât $H_1(m)=H_1(m')$, găsește și a doua preimagine pentru $H$.