L'applicazione scritta in PHP può essere resa persistente dalla memoria, ovvero può essere eseguita come servizio e rispondere alle richieste di un altro processo locale che è o non è persistente, ad esempio utilizzando FastCGI Process Manager . Non sono un guru PHP, ma i moduli FastCGI sono standard su molte piattaforme con cui ho lavorato prima, quindi dovrebbe essere più o meno lo stesso. In breve, usando FastCGI dovresti essere in grado di eseguire un servizio di memoria persistente (o un lavoratore Apache) che ascolta su una porta specifica per le richieste HTTP e invia le risposte HTTP all'applicazione web del chiamante. Quindi questo è il modo in cui andrei a scrivere il tuo Shamir's Secret Sharing:
Scrivi un server di chiavi persistenti in memoria applicazione PHP che richiederà una password ( key A
) come input dall'applicazione web del chiamante e un'altra password ( key B
) che inserisci durante inizializzazione dell'applicazione server chiave. Puoi rendere l'immissione di questo key B
abilitato a remoto o solo locale, ma è possibile farlo con lo stesso modulo di immissione della password e configurare il firewall in base alle tue esigenze. Quindi concatena queste due chiavi A+B
e hash questo valore (ad esempio bcrypt, cosa c'è in PHP chiamato CRYPT_BLOWFISH
, in entrambi i casi usa un algoritmo di hashing lento per una maggiore protezione contro gli attacchi brute-force) per ottenere il key C
che tu ' Utilizzerò per decifrare un database crittografato AES key D
memorizzato in un file locale. Rilascia (sovrascrivi con sciocchezze o annullamenti casuali) la tua variabile key B
, ma mantieni key A
e key C
in memoria.
Utilizzerai key A
per controllare le richieste locali successive della tua applicazione web non persistente (puoi eseguire l'hash di questo valore, ma l'uso di un algoritmo di hashing lento non ha molto senso con le richieste frequenti e gli algoritmi di hashing veloci hanno vinto » t molto di aiuto), e usare key C
per decodificare il database memorizzato localmente key D
che è necessario rinviare all'applicazione web autenticata. Ospita questa applicazione server chiave come un lavoratore Apache FastCGI, imposta la porta su cui rispondere alle richieste HTTP (non le porte HTTP (S) 80
, 8080
o 443
) e configura il tuo firewall solo rispondere alle richieste remote su questa porta selezionata per l'URL di input key B
, mentre l'URL di recupero del database key D
deve essere accessibile solo localmente sullo stesso server Web.
Quindi generare il file chiave del database crittografato. Decidi su due password casuali key A
e key B
, genera key C
come hash bcrypt delle due chiavi concatenate A+B
, e usa questo key C
in AES codifica il tuo database key D
, e memorizzalo in un file accessibile localmente. Memorizza key A
, dato che verrà utilizzato nelle tue applicazioni web scritte in PHP per recuperare e memorizzare o altrimenti memorizzare in modo sicuro key B
. Proteggi con password / cripta il tuo database usando key D
e sei a posto.
Questo approccio è essenzialmente un 2FA , dove la chiave del database viene sempre conservata in memoria, o strongmente crittografato in un file locale e la chiave di decrittografia non viene mai inviata interamente con una singola modalità di input. Se l'autore dell'attacco riceve una parte di una sola parte di questa catena di chiavi, o addirittura crea una copia completa dei file ospitati sul server Web, delle applicazioni e del database, non sarebbe in grado di decrittografare il database. Ovviamente, il tuo approccio è corretto e utilizza algoritmi di hashing con crittografia e password efficaci.