Proiectez o API web care trebuie să acorde acces la diverse aplicații client printr-o cheie API trimisă ca antet http. Știu, nu chiar cum ar trebui făcut, dar nu am control asupra acestei părți.
Designul meu actual pentru cheia api: au 16 octeți pentru id-ul aplicației (un ghid) în baza de date + 16 octeți generați aleatoriu (keybytes). Datorită politicii companiei, mi s-a cerut să nu stochez cheile API în db, așa că stochez un hash sha256 de (clientid + keybytes + salt) și sarea în baza de date.
Ori de câte ori vine o solicitare, împart cheia API în (id, keybytes), caut clientul în baza de date după id, apoi calculez sha256 (id + keybytes + salt-from-db) și verific dacă se potrivește cu hash-ul stocat în baza de date. . Cerințele echipei de securitate corporativă au fost să nu stocheze cheia API în db, ci să stocheze un hash al acesteia (la fel ca o parolă de utilizator). De asemenea, am luat în considerare PBKDF2 (folosesc .net 5), dar s-ar putea să fie prea lent pentru a o face la fiecare solicitare primită (trebuie să ruleze pentru fiecare solicitare, deoarece nu pot schimba aplicațiile client pentru a se autentifica printr-un apel lent, apoi trimite un simbol, ar trebui să trimită cheia la fiecare cerere).
Practic, aceasta este la fel ca și stocarea sha256 (parolă+sare) în DB pentru un utilizator, așa că nu sunt sigur dacă este „destul de bun” (având în vedere că parola este aleatorie de 16 octeți și ID-ul utilizatorului este alți 16 octeți aleatoriu - ghidul aplicației și db-ul este teoretic nu este accesibil).
O alternativă pe care o am pentru cheile API este să utilizez AES-GCM: generați nonce aleatoriu (iv) și criptați id-ul aplicației (ghid) cu o cheie secretă (stocată numai în setările webapi, nu db) și folosiți octeții (nonce , encryptedid, tag) ca cheie API. Acest lucru ar însemna nicio căutare a bazei de date în cazul cheilor api greșite. Cu toate acestea, nu sunt sigur cât de sigură este această soluție (la urma urmei, criptez doar un singur bloc de date de 128 de biți - ghidul appid - cu o cheie, printre toți apiclienții).
Care este „acceptabil” (dacă sunt ambele, o voi lua pe prima, deoarece este deja implementată) în cazul unei „încălcări de securitate (baza de date este furată de exemplu)?
Știu, dacă ajung la db, cheia api este cea mai mică dintre preocupările mele, dar tot aș vrea să aud o părere....