Stai descrivendo alcuni problemi diversi.
Archiviazione di credenziali e altri segreti
I don't want to store this 'master' key in the source code (PHP), on disk, or anywhere else in plain text.
Hai ragione nel dire che i segreti hardcoding sono una cattiva idea, potresti provare a usare qualcosa come hashicorpo-vault ( Questo particolare articolo può essere correlato al tuo flusso di lavoro) o un servizio di gestione delle chiavi come Amazon KMS .
Accesso crittografato per più utenti
Ci sono alcune strategie diverse per questo tipo di installazione. È possibile crittografare i dati con una chiave condivisa e quindi crittografare quella chiave per ciascun utente utilizzando la chiave pubblica dell'utente. Dovresti quindi aggiornare la chiave per file e ricodificare nuovamente con la chiave pubblica di ogni utente se ci sono stati cambiamenti nell'appartenenza al gruppo di accesso.
La derivazione di una chiave basata sulla password può essere complicata perché è necessario assicurarsi di aggiornare correttamente tutte le chiavi e ripetere la crittografia se la password dell'utente cambia.
Potresti dare un'occhiata al progetto Mylar del MIT , in quanto cerca di realizzare qualcosa di simile alla memorizzazione e all'accesso modello che hai descritto
Scenario di violazione
My initial concern is that if there is a data breach of source code and data, then an attacker would see that the same key was encrypted many times (once for each user). Could this then reduce the security of the 'master' key?
Se decifri sempre il lato server e l'utente malintenzionato ha accesso, può prendere la copia decrittografata dei dati.
Se stai creando chiavi private che utilizzano la password come seme , quindi si rischia di rischiare soprattutto se le password possono essere identificate rubandole o invertendo gli hash.
Più generalmente
Could this then reduce the security of the 'master' key? Either by patterns in the encrypted data or by testing that a decryption attempt on one record matches that of another?
Credo che ti stia chiedendo se la crittografia dello stesso valore con più chiavi per utente diverse renderebbe più semplice tornare al valore in testo originale (?).
Se conosci il valore del testo in chiaro potresti essere in grado di capire gli altri valori di crittografia. Questo è noto come attacco " testo in chiaro noto ". Tuttavia, questo non significa che funzioni se ti capita di conoscere due diversi risultati di crittografia e sapere che l'input era lo stesso, ma non conosci l'input effettivo.
La tua domanda potrebbe anche essere che data la funzione di crittografia f(key, masterkey)
e poi eseguirla una volta con key1
e poi con key2
confrontando i due risultati ti permette di calcolare masterkey
o conoscere l'output di f(key1, masterkey)
ti consente di calcolare key2
?
Potrebbe essere possibile, ma dipenderebbe dagli algoritmi specifici, se c'è il padding, ecc. Se c'è un'entropia significativa negli algoritmi, lievi cambiamenti negli input dovrebbero dare output molto diversi che non mostrano pattern. Puoi anche leggere le " chiavi deboli " e Selected-plaintext attack .