Puncte:3

Acesta ar fi considerat un hash securizat al parolei?

drapel ng

Cred că am înțeles bine, dar vreau să mă asigur că acest lucru va implica bani.

  1. Cerința pentru parolă este de minimum 16 caractere și trebuie să conțină unul dintre [Super, Inferior, Cifră, Alte]
  2. Sarea mea este Crypto RNG generată de 64 de octeți
  3. Convertesc sarea în Base64 (fără urmă ==)
  4. Obțin apoi octeții UTF8 de concatenare (SaltString + Parolă)
  5. Apoi SHA512 acești octeți într-o buclă de 100.000 de ori
private static byte[] SaltPassphrase(byte[] salt, șir parolă)
{
    var sha512 = SHA512.Create();
    // Sare ca șir Base64 (fără == la sfârșit) urmat de parolă
    intrare șir = $"{Convert.ToBase64String(sare)[0..^2]}{parolă}";
    byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(input));
    pentru (int i = 0; i < 100_000; i++)
        bytes = sha512.ComputeHash(bytes);
    octeți returnați;
}

EDITAȚI | × Mulțumesc tuturor pentru explicațiile detaliate și comentariile utile!

drapel jp
Puneți prea mult accent pe sare -- tot ce are nevoie este să fie unic, astfel încât un atacator nu poate executa atacuri paralele împotriva mai multor conturi care au aceeași sare. Dincolo de asta e exagerat.
drapel hm
Am fost de acord că sărurile sunt mai mari decât este necesar - dar sărurile sunt nu doar pentru rezistența la calculul paralel, ci și pentru rezistența la *pre*-calcul. Deci, ele trebuie să fie nu doar unice în domeniul hashlistului / platformei țintă, ci și practic unice *la nivel global* - suficient pentru a face imposibilă precalcularea și apoi stocarea lor. De exemplu, bcrypt și scrypt folosesc o sare de 128 de biți (16 octeți) - încă destul de mai mică decât 64 de octeți, dar suficientă pentru a face construirea unei liste cu toate valorile în mare măsură imposibilă.
marcelm avatar
drapel cn
**[Nu vă creați propria funcție de hashing a parolei](https://security.stackexchange.com/a/31846/99775), punct.**
Persistence avatar
drapel br
@marcelm - Dacă toată lumea ar urma acel sfat, nu am avea funcții de hashing a parolei... Poate că ai putea spune „cu excepția cazului în care ești expert în criptografie”
marcelm avatar
drapel cn
@Persistence Nu, pentru că oamenii tind să creadă că sunt experți în ceva ce nu sunt. Acest comentariu este făcut în contextul nenumăratelor întrebări SE despre hobe-brew crypto, iar răspunsul este întotdeauna: _nu face_. Criptografii efectivi care fac acest lucru profesional nu vor fi opriți de un comentariu pe crypto.SE oricum.
Persistence avatar
drapel br
Ai o idee... Efectul Dunning Kreuger este puternic
Seth R avatar
drapel in
Experții @Persistence în criptografie nu caută sfaturi cu privire la Stack Exchange. Dacă citiți acest lucru, nu ar trebui să creați funcții hash.
Persistence avatar
drapel br
@SethR - Nu este neapărat adevărat... Sunt atât un expert în software, cât și un inginer electronic, la un nivel postuniversitar.Folosesc în continuare Stack Overflow și Electronics SE pentru că le folosesc și alți experți și nimeni, nici măcar experții, nu poate ști totul.
Peter Morris avatar
drapel ng
Nu am creat o funcție de hashing cripto, le-am folosit pe cele existente.
marcelm avatar
drapel cn
@PeterMorris Nu, ți-ai creat propria funcție de hashing a parolei. Faptul că ați folosit SHA512 ca primitiv în funcția dvs. este irelevant. Este destul de ușor să creezi un algoritm nesigur folosind blocuri de construcție sigure. [AES-ECB](https://crypto.stackexchange.com/a/20946/32547) ar fi un exemplu binecunoscut în acest sens. Criptografia este foarte greu de corectat, de aceea oamenii care știu ce fac folosesc doar algoritmi bine verificați, care au rezistat controlului public. Folosirea propriei criptografii vă deschide la riscuri mult mai mari decât utilizarea unor algoritmi bine-cunoscuți.
Peter Morris avatar
drapel ng
@marcelm Ah, înțeleg, mulțumesc pentru această informație, apreciez!
drapel in
„și trebuie să conțină unul din fiecare [Super, Inferior, Cifră, Altul]” -> În mod normal, îmi las managerul de parole să genereze o parolă aleatorie pentru fiecare site web, dar pentru site-urile web care mă obligă să folosesc anumite caractere speciale, am o singură parolă care practic este format doar din caractere speciale. Acestea sunt de obicei site-urile web care nu contează.
marcelm avatar
drapel cn
@PeterMorris Nicio problemă! Am observat și un defect interesant în algoritmul tău. Toate acestea devin mult prea multe pentru comentarii, așa că am scris un răspuns.
Wernfried Domscheit avatar
drapel za
De ce tăiați `==` din sare?
Wernfried Domscheit avatar
drapel za
În afară de toată teoria dată în diferitele răspunsuri: cel puțin unii oameni cred că dezvoltarea unui algoritm hash este ușoară. Dar uite cât de mulți, sau mai bine cât de puțini [algoritmi de hash pentru parole](https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms) sunt de fapt disponibili, pare să fie o treabă grea și doar câțiva experți din întreaga lume sunt disponibile. capabil să le dezvolte.Se pare că este mult mai ușor să dezvoltați un [limbaj de programare](https://en.wikipedia.org/wiki/List_of_programming_languages)
Puncte:32
drapel in

Cu excepția cantității de iterație (putem susține că este, de asemenea, mică â¡ și o oarecare pierdere de entropie *), raspunsul este nu!

  • Nu este duritatea memoriei care previne în principal căutările masive ASIC/GPU
  • Nu există mai multe fire care să împiedice în principal căutările masive de CPU.

Există deja algoritmi de hashing al parolelor, alții decât hashurile criptografice, cum ar fi seria SHAx. Unele importante sunt Scrypt (2009), PBKDF2 (2000), Argon2 (2015), și Hashing cu baloane (2016). Argon2 a fost câștigătorul competiția de hashing a parolelor a avut loc în 2015. Acum, Balloon Hashing poate lupta cu Argon2. Utilizați Balloon Hashing sau Argon2 pentru hashing securizat al parolei.

Există deja biblioteci pentru fiecare pentru care trebuie doar să le parametrizați Argon2 în loc să scrii singur detaliile.

O bibliotecă bună Argon2

Iată parametrii;

Utilizare: ./argon2 [-h] sare [-i|-d|-id] [-t iterații] [-m memorie] [-p paralelism] [-l lungime hash] [-e|-r] [- v (10|13)]
        Parola este citită din stdin
Parametri:
        sare Sarea de folosit, minim 8 caractere
        -i Folosește Argon2i (acesta este implicit)
        -d Utilizați Argon2d în loc de Argon2i
        -id Utilizați Argon2id în loc de Argon2i
        -t N Setează numărul de iterații la N (implicit = 3)
        -m N Setează utilizarea memoriei de 2^N KiB (implicit 12)
        -p N Setează paralelismul la N fire (implicit 1)
        -l N Setează lungimea ieșirii hash la N octeți (implicit 32)
        -e Ieșire numai hash codificat
        -r Afișează numai octeții bruti ai hashului
        -v (10|13) Versiunea Argon2 (implicit la cea mai recentă versiune, în prezent 13)

        -h Tipăriți utilizarea argon2

Aș putea întreba ce este $i,d,$ și $id$ în Argon2. Răspunsul este de la draft-irtf-cfrg-argon2-03;

Dacă nu cunoașteți diferența dintre ele sau considerați atacurile laterale drept amenințări viabile, alegeți Argon2id.

  • Argon2d este mai rapid și utilizează acces la memorie în funcție de date. Dependența de date activează imediat canalul lateral. Acest lucru este potrivit pentru criptomonede și aplicații fără amenințări din partea atacurilor pe canale laterale.

  • Argon2i folosește acces la memorie independent de date, iar acest lucru este preferat pentru hashingul parolelor și pentru derivarea cheilor bazate pe parole.

  • Argon2id În prima jumătate a primei iterații funcționează ca Argon2i, iar restul funcționează ca Argon2d. Acest lucru permite atât protecția canalului lateral, cât și compromisul timp-memorie.

Hashing cu baloane

Acum, este în Publicația specială NIST 800-63B și are nevoie de ceva timp pentru adaptare. Sunt unele biblioteci gata de utilizare.

Principalele proprietăți sunt;

  • Duritatea memoriei a fost dovedită
  • Este proiectat pe primitivele standard: poate folosi oricare dintre funcțiile hash criptografice fără memorie, cum ar fi SHA2, SHA3 și BLAKE2.
  • Are rezistență încorporată împotriva atacurilor pe canale laterale, care necesită ca modelul de acces la memorie să fie independent de biții de date care urmează să fie hashing.

Puțin despre parole

Pentru parolele utilizatorului, ar trebui să-i instruiți să le folosească zaruri generarea de parole bazată. Dacă nu le folosesc, atunci restricționarea acestora poate fi utilă. Rețineți că parolele bazate pe dicewire nu au nevoie de restricții superioare, inferioare, cu cifre etc.Prin urmare, aveți grijă să restricționați utilizatorii la anumite reguli.

Puține despre managerii de parole

În plus, aproape toată lumea are un smartphone. Se poate folosi manageri de parole pentru a stoca parole care sunt parole aproape aleatorii generate de managerii de parole și stocate. Informați utilizatorii și despre acest lucru. Unele dintre ele sunt gratuite LastPass, 1 Parolă, și KeepPass.


Raspuns la comentariu:

Nu prea pot folosi un algoritm care folosește multă memorie (dacă am înțeles corect Duritatea memoriei) pentru că este un server. Este abordarea corectă, este SHA512 potrivit și iterațiile sunt potrivite ținând cont de lungimea parolei?

SHA-512 are o utilizare foarte mică a memoriei pentru parole, trebuie doar să stocheze 1024 de biți pentru a produce un hash de parolă. Parametrul de memorie implicit al lui Argon2 este $2^{12}$KiB = 4MiB. Dacă luăm în considerare că un sistem poate rula orice cantitate de fire, atunci puterea de a forța brut un algoritm bazat pe SHA-512 este redusă de 32768 de ori. Deci, chiar și puțină utilizare a memoriei întărește complexitatea hashing-ului parolei $2^{15}$. 4MiB este perfect pentru servere și se poate ajusta memoria în funcție de accesul de conectare pe secundă sau mai bine cumpărați ceva mai multă memorie. Amintiți-vă, algoritmii de hashing a parolei au lăsat memoria sistemului. Blocajul de luat în considerare este numărul de solicitări de conectare pe secundă.


â¡) Rezultatul vitezei OpenSSL pentru a arăta că SHA-512 100K este mic.

Faceți sha512 timp de 3 secunde pe blocuri de 64 de dimensiuni: 10896142 sha512 în 3,00 secunde
Faceți sha512 timp de 3 secunde pe 256 de blocuri de dimensiune: 4673961 sha512 în 2,99 secunde

*) Cât de multă entropie pierdem entropia per iterație a unei funcții hash criptografice

Osifrage zguduitoare a scris un răspuns grozav despre asta.. Miezul rezultatului este

Mai degrabă, există șanse mari ca pentru orice funcție fixă ​​F, să fie multe cicluri pe care F este o permutare și limitată la care F păstrează astfel entropia

Peter Morris avatar
drapel ng
Nu prea pot folosi un algoritm care folosește multă memorie (dacă am înțeles corect Duritatea memoriei) pentru că este un server. Este abordarea corectă, este SHA512 potrivit și iterațiile sunt potrivite ținând cont de lungimea parolei?
kelalaka avatar
drapel in
@PeterMorris Funcția de hashing a parolei are parametri ajustabili. Trebuie să setați ținta de securitate, apoi să ajustați parametrii. Dacă nu puteți folosi o memorie mare, atunci trebuie să creșteți numărul de iterații. Performanța o puteți găsi pe forumurile hashcat, în special pentru GPU-uri.
stefreak avatar
drapel jp
Algoritmii de hashing a parolelor @PeterMorris sunt utilizați pe servere aproape 100% din timp. O căutare rapidă pe Google dezvăluie că Argon2 utilizează 1 MiB de memorie în mod implicit. Acest lucru este în regulă și de obicei nu este o problemă. Vă rugăm să nu rulați propriul hashing al parolei, aceste lucruri sunt greu de corectat. Mai ales dacă mizele sunt mari.
Cort Ammon avatar
drapel gb
Pentru a pune comentariul lui Stefreak în perspectivă, la prețurile actuale de piață vorbiți despre ceva de ordinul a patru zecimi de penny de memorie DDR4. Dacă acest lucru este inacceptabil, atunci cred că merită să te gândești îndelung dacă ai infrastructura necesară pentru un sistem care implică bani.
drapel il
@kelalaka există un motiv pentru care sugerați `argon2` peste ceva de genul https://en.wikipedia.org/wiki/Bcrypt?
kelalaka avatar
drapel in
@N3buchadnezzar de cele mai multe ori Bcrypt este în regulă, așa cum se precizează în [Wikipedia](https://en.wikipedia.org/wiki/Bcrypt#Comparison_to_other_password_hashing_algorithms). Cu toate acestea, Argon2 are factor de paralelizare, rezistență pe canalul lateral și parametrizare independentă (vezi parametrul bibliotecii și comparați cu BCrypt) și Argon2 este, de asemenea, un KDF Bcrypt nu este.
Peter Morris avatar
drapel ng
@kelalaka Mulțumesc pentru răspunsul detaliat. Mi-am actualizat întrebarea cu privire la argon2. Vrei să-mi spui ce crezi, te rog? Mulțumiri!
kelalaka avatar
drapel in
@PeterMorris a răspuns odată, nu schimba sursa mai ales după toate acestea. În schimb, poți pune o nouă întrebare. L-am derulat.
kelalaka avatar
drapel in
@PeterMorris Și, ediția ta poate fi potrivită și pentru [security.se]. Căutați răspunsuri și acolo.
Peter Morris avatar
drapel ng
@kelalaka Bine, m-am gândit că ar fi bine să atașez. Ce fel de parametri voi avea nevoie pentru dimensiunea memoriei + iterații? Nu vreau ca serverul meu să fie paralizat, dar nici nu vreau să-l sparg prea ușor.
kelalaka avatar
drapel in
@PeterMorris parametrii impliciti? Puteți măsura timpul pe serverul dvs. În general, solicităm ca toate procesele să se termine în 1 secundă, deoarece nu dorim să avem un decalaj pentru utilizatori. Puteți să vă măsurați serverul și să întrebați despre acest lucru pe [security.se], consultați [this](https://security.stackexchange.com/questions/210982/what-are-the-minimum-parameters-for-argon2) sau [ căutare](https://security.stackexchange.com/search?q=argon2+parameter)
polfosol avatar
drapel in
O idee: Lastpass este **NU** gratuit. Se preface că este așa
Puncte:10
drapel in

Dincolo de răspunsul excelent al lui @kelalka, merită subliniat diferențele cheie dintre implementarea dvs. și abordările mai standard de hashing iterativ, cum ar fi PBKDF2. Deși PBKDF2 nu este greu de memorie, la fel ca unii algoritmi mai noi de hashing a parolei, îl consider (sau bcrypt) suficient pentru majoritatea scopurilor. Este probabil cel mai asemănător cu soluția propusă de dvs., așa că va fi mai ușor de înțeles. https://en.wikipedia.org/wiki/PBKDF2

O schimbare esențială este că introduce parola în mod repetat cu rezultatele anterioare. Acest lucru previne convergența hashului. Numărul de iterații este probabil mic în comparație cu spațiul funcției hash, așa că este posibil să nu fie semnificativ, dar dacă spațiul efectiv ajunge mai mic decât credem că ar putea fi. Când indexați valorile în mod repetat, fiecare iterație reduce spațiul dvs. potențial de ieșire cu o cantitate mică din cauza coliziunilor. Când repeți din nou și din nou, ajungi cu valori din ce în ce mai puțin diferite.

De asemenea, cerințele de complexitate a parolei sunt considerate dăunătoare. Luați în considerare o politică modernă privind parolele: https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

Maarten Bodewes avatar
drapel in
Ce vrei să spui cu convergența unui hash? Un ciclu (se pare)? Și dacă da, cum te salvează includerea unei constante (în cadrul iterației, desigur) de asta?
drapel ar
@MaartenBodewes: Presupun că ceea ce înseamnă Meir prin convergență este faptul că, deoarece funcțiile hash criptografice (restrânse la intervalul lor de ieșire) nu sunt bijecții, iterarea unui hash va scădea treptat numărul de ieșiri posibile și, astfel, crește riscul unei astfel de ieșiri. ciocnirea hashe-urilor repetate: dacă $H^{(m)}(a)=H^{(m)}(b)$ pentru niște $m$, atunci $H^{(n)}(a)=H^{ (n)}(b)$ pentru toți $nâ¥m$. Includerea intrării inițiale în funcția hash (adică înlocuirea $H$ cu ceva de genul $H_a(x) =H(x\ ||\ a)$ previne acest lucru: $H_a^{(m)}(a)=H_b^ {(m)}(b)$ _nu_ implică $H_a^{(n)}(a)=H_b^{(n)}(b)$ pentru $n>m$.
drapel ar
⦠Acestea fiind spuse, atâta timp cât funcția hash $H$ are o lungime decentă de ieșire, coliziunile nu sunt o problemă cu adevărat majoră chiar și pentru funcțiile hash reiterate fără astfel de modificări. Cred că am un răspuns vechi undeva aici unde fac calculele, dar practic, dacă dimensiunea spațiului de intrare _actual_ al hash-ului iterat (inclusiv atât parolele reale, cât și orice încercat de atacatorii cu forță brută) este semnificativ sub limita zilei de naștere, coliziuni sunt în mare parte irelevante. Pentru hashuri moderne cu ieșiri de 256 de biți sau mai lungi, acesta este aproape sigur cazul.
Maarten Bodewes avatar
drapel in
Ah, bine, asta are sens, deși cred că așteptarea unei coliziuni de 256 de biți este încă o noțiune destul de exagerată. Acum înțeleg de ce sarea sau parola se repetă în general în introducere. .... uh da, ce spui :P
Meir Maor avatar
drapel in
Dacă am avea un PRF adevărat, problema pare într-adevăr minoră. Dar ne facem griji că nu avem de fapt un PRF adevărat, iar hashingul iterativ naiv poate amplifica imperfecțiuni minore ale PRF. De asemenea, nu văd niciun motiv pentru a lăsa probleme minore care pot fi rezolvate trivial.
ilkkachu avatar
drapel ws
O chestiune oarecum legată este că, din moment ce lucrul lor este deja destul de aproape de PBKDF2, ar putea la fel de bine să folosească PBKDF2_, așa că ar putea măcar să cunoască ceva.
Meir Maor avatar
drapel in
Cu siguranță am spus că este similar cu PBKDF2 și, evident, oamenii ar trebui să folosească chestii standard. PBKDF2 nu este de ultimă generație, dar este suficient atunci când este reglat corespunzător, IMHO. Deși personal este cel mai puțin favorit dintre opțiunile rezonabile, obișnuiam să prefer bcrypt și are avantajele de a fi în preajmă pentru totdeauna fără pată, iar acum avem familii de argon și scrypt. Deci, deși consider că PBKDF2 este suficient, este cea mai proastă opțiune rezonabilă.
kelalaka avatar
drapel in
@IlmariKaronen există unul [aici](https://crypto.stackexchange.com/q/15068/18298).
Puncte:9
drapel cn

Este o idee proastă să vă proiectați propriul hash de parolă.

Realizarea de funcții criptografice este încă un proces de încercare și eroare. Sigur, de-a lungul timpului am dat peste niște lucruri care sunt o idee bună sau chiar obligatorii. Și cu siguranță am învățat o mulțime de lucruri care nu muncă. Dar nu știm cum să facem lucrurile care s-au dovedit sigure până la capăt. O mică greșeală foarte subtilă poate face ca un construct criptografic să eșueze catastrofal. Și sunt mult de oportunităţi pentru astfel de greşeli. Voi numi câteva mai târziu.

Cel mai bun lucru pe care îl putem face acum este ca oamenii cu experiență în acest domeniu să facă un lucru cripto, apoi toată lumea încearcă să spargă acel lucru cripto. Dacă toată lumea încearcă suficient și nu reușește la asta pentru o lungă perioadă de timp, atunci avem ceva care este probabil suficient de bun. Încă nu putem dovedi absența problemelor, dar dacă mii de criptoanaliști nu au putut, atunci sperăm că și următoarea mie nu pot.

Dar chiar și asta eșuează din când în când. Uneori, după ani, chiar decenii, o problemă critică se găsește în ceva care a fost cercetat de cei mai deștepți oameni timp de secole. De aceea MD5 nu mai este considerat OK și de ce RC4 este considerat problematic. Sau peisajul se schimbă, conducând de ex. la nevoia de săruri în hash-urile parolelor și funcții de hash lente intenționat.

Utilizând cei mai cunoscuți algoritmi criptografici actuali, putem valorifica această experiență colectivă și, probabil, evităm repetarea greșelilor din trecut. S-ar putea să se descopere noi greșeli, dar asta nu poate fi evitat. Cineva care își construiește propriile funcții cripto, este probabil să repete unele dintre aceste greșeli sau să creeze altele complet noi.

Știu, știu, este distractiv să proiectezi singur chestia asta. Și este bine să construiești ceva care să se simtă în siguranță. Stack Exchange este plin de întrebări despre criptarea personalizată și (în special) hash-uri de parole. Problema este că este ușor să construiești ceva pe care tu însuți nu poți rupe. Dar asta nu înseamnă că alții nu pot.Această zicală este străveche și apare destul de des încât acum este cunoscut ca legea lui Schneier.

Ce poate merge rau?

Deci, pot exista probleme cu nucleul unui algoritm criptografic. Acesta este ceea ce a spart MD5 și RC4.

Sau algoritmul poate fi complet ok, dar o implementare poate fi ruptă. Aceasta poate fi o simplă eroare sau poate fi ceva mai subtil, cum ar fi a atac pe canalul lateral (care sunt surprinzător de dificil de evitat uneori).

Dar este, de asemenea, posibil (ușor, chiar) ca primitivele criptografice sigure cu implementări fără erori să fie utilizate incorect, făcând sistemul nesigur. De exemplu, folosind corect criptarea și semnăturile digitale, dar făcând presupuneri naive în timpul unei strângeri de mână de comunicare (SSL a avut parte de probleme cu aceasta). Un alt exemplu binecunoscut este AES-ECB, care utilizează AES perfect fin într-un mod care poate scurge informații semnificative.

În funcția ta hash?

Propria ta funcție de hashing a parolei cade pradă, de asemenea, la ceva de genul acesta aici:

repeta 100_000:
    hash = sha512(hash)

SHA-512 este perfect în regulă (din câte știm). Folosirea lui în felul acesta este descurajată.

SHA-512 generează o ieșire de 512 biți „nedistingebilă de aleatorie” pentru fiecare intrare. Poate genera aceeași ieșire pentru două intrări distincte, aceasta se numește coliziune. Problema este că funcțiile hash pe N-biți pe intrările pe N-biți nu sunt în general bijectiv. Aceasta înseamnă că atunci când se alimentează o ieșire SHA-512, unele dintre valorile posibile de 512 biți se vor ciocni cu altele, producând aceeași ieșire. De necesitate, aceasta înseamnă, de asemenea, că alte valori hash nu pot fi generate deloc.

Să ne uităm la cum funcționează acest lucru pentru SHA-512, trunchiat la 4 biți. Mai exact, luăm primul octet de la ieșire și scoatem la zero cei 4 biți înalți din acest octet. Octetul unic rezultat este folosit ca intrare în runda următoare. Diferite moduri de selectare a biților dau rezultate diferite, dar principiul este același.

Încercarea tuturor celor 16 intrări posibile pentru mai multe runde ne oferă aceste lanțuri:

în 1. 2. 3. 4. 5. 6. 7.
00 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08
06 -> 08 /
07 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06
08 -> 06 /   
03 -> 04 -> 05 \
13 -> 15 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14
04 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14 /
15 -> 05 -> 09 -> 02 -> 10 -> 14 /
05 -> 09 -> 02 -> 10 -> 14 -> 14  
01 -> 11 -> 02 -> 10 -> 14 /
09 -> 02 -> 10 -> 14 -> 14  
11 -> 02 -> 10 -> 14 /
02 -> 10 -> 14 -> 14  
12 -> 10 / /
10 -> 14 -> 14   
14 -> 14 /

După doar 6 runde, cele 16 ieșiri posibile au fost reduse la doar 3. Același efect poate fi văzut pentru trunchieri mai mari. Am rulat câteva simulări pentru SHA-512 trunchiate la primul 1 octet (2â¸), 2 octeți (2¹â¶) și 3 octeți (2²â´):

                octeți: 1 2 3
          spațiu de intrare: 256 65536 16777216
converge către valori M: 13 330 2765
       după N runde: 31 518 7114

Puteți observa că efectul de convergență este prezent în toate cele trei scenarii. În ceea ce privește SHA-512 netăiat, computerul meu nu este suficient de rapid pentru a calcula acest lucru, nu am putut găsi nicio informație despre puterea și certitudinea efectului și nu sunt suficient de inteligent pentru a construi o dovadă (dacă o dovadă este chiar posibil). Dar șansele sunt că veți vedea efectul și în SHA-512 complet. Instinctul meu suspectează că reduce spațiul hash cu rădăcina pătrată (înjumătățirea lungimii biților), dar aș putea greși foarte mult [actualizare: vezi linkurile furnizate în comentarii: unu, Două, Trei]. 100.000 runde limitează probabil și daunele.

Acum, asta vă dăunează cu adevărat hașul? Probabil ca nu. Dar este o slăbiciune, una pe care funcțiile hash de parole din lumea reală au grijă să o evite (de exemplu, asigurându-se că parola și sarea sunt amestecate înapoi în mod regulat).

Cred că acesta este un exemplu grozav al capcanelor subtile din proiectarea cripto. Este atât de ușor să ratezi așa ceva. De aceea recomand să folosiți un algoritm testat în luptă. Sunt mai bune decât orice putem veni cu tine sau cu mine.

Celelalte răspunsuri fac deja câteva recomandări pentru ce hashuri să folosească; Bine: pbkdf2, bcrypt. Mai bine: argon2, scrypt. Am auzit că Balonul este un lucru, dar nu știu nimic despre el, așa că nu am o părere despre el.

kelalaka avatar
drapel in
FYI. Există un calcul pentru cazul general [Entropia la iterarea funcțiilor hash criptografice] (https://crypto.stackexchange.com/q/15068/18298). Îmi amintesc un altul, însă, pe care nu l-am găsit.
chux - Reinstate Monica avatar
drapel cn
Răspuns frumos care se adresează direct codului OP.
kelalaka avatar
drapel in
Ok, [am găsit ceea ce căutam](https://crypto.stackexchange.com/a/51029/18298) și răspunsul ar trebui să fie surprinzător pentru tine. Nu ne așteptăm ca funcțiile hash criptografice iterate să piardă prea multă entropie datorită [ciclurilor mari așteptate](https://crypto.stackexchange.com/a/68442/18298) ale lucrării lui Harris.
marcelm avatar
drapel cn
@kelalaka Foarte interesant, mulțumesc pentru link-uri! Dar dacă înțeleg corect [al treilea link](https://crypto.stackexchange.com/a/68442), înseamnă că relativ _puține_ elemente sunt de așteptat să fie pe cicluri. Aproximativ ââ dintre ele, de fapt, astfel încât iterarea ar reduce în cele din urmă spațiul efectiv la rădăcina pătrată a elementelor, înjumătățind lungimea efectivă a biților. Sau interpretez greșit ceva?
kelalaka avatar
drapel in
Ideea pe care s-ar putea să-l ratezi este că 1M este prea mic pentru a vedea acest efect. Primul link vorbește despre 256 de iterații, iar al treilea link vorbește despre momentul în care iterația ajunge la rădăcina pătrată. Majoritatea elementelor sunt încă pe cozi...
marcelm avatar
drapel cn
Destul de corect. Acest tip de matematică este întotdeauna interesant, dar este greu să înțelegi bine scalele implicate. Totuși, am remarcat efectul limitat din cauza numărului de runde din răspunsul meu inițial, dar toată acea parte a fost oricum doar o bănuială :)
Puncte:1
drapel cn

Cred că răspunsul este: „Securizat” este relativ. Doar cei 512 biți de sare (8*64 biți) oferă aproximativ 6*10^57 de posibilități. Transformarea sării (prin BASE64) nu îi schimbă rezistența.

Apoi aveți 992 de biți (62*16 biți) care fac parola (26*2 litere plus 10 cifre), sau aproximativ 4*10^28 de posibilități. Presupunând o probabilitate uniformă (mai degrabă puțin probabilă dacă este ales de un om) veți avea aproximativ 1504 biți de intrare pentru a produce 512 biți de ieșire, până la (are conflicte probabile) 5*10^452 posibilități. Este o imens număr.

Cifrele presupun că sarea nu poate fi „exclusă” din hash, astfel încât sarea extinde intervalul de căutare.

Repetarea hash-ului va încetini doar construirea tabelului, fără a căuta rezultatul (tabelul rezultat va avea cel mult 2^512 intrări).

kelalaka avatar
drapel in
Considerăm că sarea este publică. Pentru atacatorii cu forță brută, acesta împiedică doar tabelele curcubeu și vor căuta doar parola, nu parola și sarea. Un atacator al sistemului va primi sarea și hașul. Ele sunt de obicei stocate într-un șir. Prin urmare, doar puterea mecanismelor de hashing a parolei și a parolei este importantă.
kelalaka avatar
drapel in
Sarea ucide mesele curcubeului. Este evident. Cu toate acestea, securitatea hashing-ului parolei nu se bazează pe secretul sării.

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.