Răspunsul scurt la întrebarea dvs. de hashing este „utilizați SHA-256”. Acesta este răspunsul pentru aproape fiecare problemă de hashing securizat, cu excepția cazului în care răspunsul este „utilizați SHA-512”. Dacă doriți un hash de 128 de biți, atunci puteți trunchia SHA-256 (luați primele sau ultimele 128 de biți). Toți biții din SHA-256 sunt independenți, așa că puteți extrage oricare 128 dintre ei ca hash.
Acestea fiind spuse, IMO, vă gândiți incorect la această problemă. Ideea nu este de a proteja în mod specific SessionId.Problema este că adresele URL pot conține informații sensibile, dintre care SessionId este doar un exemplu (dacă este stocat în URL). Dacă cineva știe deja adresa URL scurtată, poate doar să ceară sistemului dvs. adresa URL completă, așa că este vorba despre oprirea atacatorilor să găsească chei prin ghicire. Trebuie să faceți spațiul de taste rar, adică „mult, mult mai mare decât numărul de chei stocat efectiv”.
Mențineți o bază de date cheie/valoare, așa că nu este deloc nevoie să utilizați un hash. Puteți genera doar o cheie aleatorie pentru fiecare URL. Acest lucru este mai bun decât un hash, deoarece nu există absolut nicio legătură între cheie și valoare.
Având în vedere designul dvs., atacatorii nu pot căuta offline. Ei trebuie să contacteze serverul dvs. Să presupunem că puteți servi 1.000 de solicitări/secundă și că vă măriți spațiul de taste total pentru a fi de un trilion de ori mai mare decât numărul planificat de adrese URL. Acest lucru i-ar lua unui atacator aproximativ 15.000 de ani (~1/2 din spațiul căutat) pentru a găsi o singură adresă URL dacă ar putea consuma toată lățimea de bandă disponibilă (pe care mă aștept să o observați...). Cu doar puțină limitare a ratei pe adresă IP, ați putea complica dramatic acest atac.
Având în vedere cele de mai sus, dacă doriți să stocați un miliard de adrese URL în sistemul dvs., veți avea nevoie de un spațiu de cheie de:
log2(1 miliard de adrese URL * 1 trilion multiplicator) = 80 de biți
În Base58 (care îmi place pentru acest tip de problemă, deoarece este prietenos cu oamenii), ar fi nevoie de aproximativ 14 caractere. Modificând valorile de mai sus pentru limitarea ratei, perioada de atac împotriva căruia doriți să vă protejați și numărul de adrese URL stocate, puteți alege cât de lungi sunt cheile.
În general, puteți calcula valori aleatorii pe această scară fără să vă faceți griji cu privire la coliziuni (ceea ce este bun pentru performanță). Din același motiv pentru care este extrem de greu pentru un atacator să găsească o coliziune, este extrem de puțin probabil să ai una accidental. Dar dacă vrei să verifici din nou doar Cum puțin probabil, uită-te la Atacul de ziua de nastere. Calculele pentru „care este probabilitatea ca vreo valoare să se ciocnească” sunt diferite de „cât timp va dura unui atacator să găsească o coliziune” și, în unele cazuri, vă vor forța să utilizați chei mai lungi.
IMO, nu este nevoie de hashes. Dar dacă aveți nevoie de unul, utilizați SHA-256, trunchiat la orice număr de biți doriți.