Proiectăm o aplicație web în care utilizatorii pot partaja documente între ei. Scopul final este de a obține încrederea zero necesară utilizatorilor, adică criptarea la nivelul clientului se asigură că serverele (sau orice intermediari) nu pot vedea nicio dată în text simplu. (Sunt conștient de potențialele deficiențe ale unei soluții de criptare bazate pe browser. Avem idei pentru a contracara unele dintre probleme, s-ar putea să întreb despre ele mai târziu, dar nu vreau să poluez această întrebare.)
Schema de bază pentru încredere zero ar arăta astfel:
- Dacă utilizatorul se înscrie (prin OAuth2), browserul său generează o expresie de acces aleatorie de 32 de caractere de bază 62.
- Această expresie de acces este utilizată pentru a obține o cheie publică/privată folosind PBKDF2.
- Cheia publică este trimisă la server, utilizatorului i se solicită expresia de acces aleatoare generată sub 1. astfel încât să o poată nota.
- Generăm o cheie aleatorie pentru fiecare document, o criptăm cu cheile publice ale tuturor participanților și o stocăm împreună cu documentul.
Cheia privată și fraza de acces aleatorie inițială (1.) nu părăsesc niciodată clientul, așa că nu există nicio modalitate de a putea decripta datele pe partea de server.
DAR: Acest lucru nu este atât de convenabil pentru utilizatorul final. Dacă pierd cheia (și cu siguranță o vor face), atunci nu au acces la niciunul dintre documentele lor. Dacă se conectează pe alt dispozitiv, trebuie să introducă expresia de acces. Avem de-a face cu un grup de utilizatori foarte divers și cei mai mulți dintre ei nu sunt deloc „cunoscători în tehnologie” și nu ar trebui să fie.
Există soluții BYOK precum cele folosite de Google Workspace CSE. Dar AFAICS utilizatorul ar trebui să se autentifice la un alt serviciu pentru a utiliza serviciul nostru. Nici asta nu este convenabil și poate pur și simplu nu poate fi explicat pentru utilizatorii noștri.
Având în vedere că controlăm autentificarea - este furnizată de Auth0 - există vreo modalitate de a stoca cheia privată a utilizatorului oriunde (chiar și terțe părți) fără ca utilizatorul să fie nevoit să se autentifice de două ori?
De asemenea, avem în vedere un mod pe care îl numim modul „soft”, în care stocăm cheia privată în numele utilizatorului utilizând o infrastructură complet separată, folosind o HSM. Acest lucru ar încălca, desigur, principiul zero încredere, dar cel puțin ar proteja împotriva încălcării datelor în cazul în care documentele criptate sunt scurse. Utilizatorii pot oricând să opteze pentru modul „hard”. (Există o problemă dacă un document este partajat între un utilizator care folosește modul „hard” și un utilizator care folosește modul „soft”, practic încălcând promisiunea făcută utilizatorului folosind modul „hard”. Am aborda acest lucru clarând și opțional, permiteți utilizatorului să impună ca toți participanții să folosească modul „hard”.)
Are vreun sens? Există îndrumări pentru citiri suplimentare? Vă rog să mă scuzați, dacă nu am putut fi suficient de concis sau clar.