Aceasta este o întrebare stârnită pur de curiozitate, dorind să înțeleagă puțin mai multe despre criptografie și autentificare. Mulțumesc anticipat oricui își face timpul să răspundă.
În loc să sărați și să indexați o parolă, să o trimiteți la server pentru a vă autentifica, ar putea funcționa așa ceva? Un client generează o pereche de chei private/publice dintr-o parolă și sare aleatorie. Cheia publică și sarea sunt stocate de server. Pentru fiecare autentificare, serverul trimite sarea și o valoare generată aleatoriu pe care clientul să o semneze. Clientul regenerează cheia privată din parolă și sare, apoi semnează valoarea generată aleatoriu și o trimite serverului. Serverul verifică semnătura cu cheia publică corespunzătoare.
Pentru a încetini un atac de forță brută, o cheie trebuie să fie derivată din parolă și sare folosind un KDF lent, înainte de a genera cheile private/publice.
În mod alternativ, serverul poate solicita clientului să derive o cheie din valoarea generată aleatoriu, folosind niște KDF lent, înainte de a fi semnat – deși acest lucru, pentru mine, mi se pare mai puțin ideal decât doar încetinirea derivării cheii. Pentru a economisi resursele de pe server la verificarea semnăturii, se poate folosi un mecanism de stil Proof of Work în loc de un KDF lent în care clientul trebuie să găsească un nonce astfel încât hash(randomly_generated_value + nonce) > some_set_difficulty, apoi nonce este semnat și trimis la serverul de verificat. Serverul poate chiar să varieze dificultatea, să zicem crescând dificultatea pentru fiecare încercare de conectare nereușită.
Care ar fi unele avantaje și dezavantaje ale unei astfel de scheme? Bănuiesc că expunerea sării la fiecare încercare de conectare ar fi o problemă.