Ho un numero di requisiti apparentemente contraddittori:
1) Otteniamo contenuti per utenti di terze parti; i contenuti per determinati utenti devono essere archiviati crittografati a riposo per motivi di conformità
2) L'utente dovrebbe essere in grado di decrittografare e visualizzare i propri contenuti tramite una webapp / api protetta
3) Ci sono molti utenti su un determinato account, e tutti dovrebbero essere in grado di decrittografare e visualizzare i reciproci contenuti (implicando una chiave condivisa)
4) Un processo di lavoro di back-end dovrebbe essere in grado di decodificare e rielaborare il contenuto dell'utente in qualsiasi momento, se vogliamo (ad esempio) migliorare la nostra analisi
Se dovessimo, potremmo sacrificare il n. 4 (o forse chiedere all'autore di autorizzarlo).
Naturalmente non voglio archiviare la chiave di crittografia in testo normale ovunque. Sarebbe molto più conveniente archiviarlo a livello di utente, crittografato da un hash PBKDF2'ed dalla propria password - ma questo introduce un flusso di lavoro ingombrante se dimentica la password e deve ripristinarla (dato che ora non è più possibile derivare la chiave .)
Non posso neanche usare la password, perché l'accesso al contenuto già crittografato dovrebbe sopravvivere alle richieste di modifica delle password. Inoltre, ovviamente non abbiamo accesso alla password in chiaro nei processi di lavoro back-end asincroni.
C'è un modo generalmente accettato di farlo? Per esempio. potrei usare un qualche tipo di flusso di lavoro 2FA-ish per recuperare un utente segreto che non immagazzino mai localmente, ma che è usato per proteggere la chiave?