Come implementare l'algoritmo di condivisione segreta di shamir usando AES_ENCYRPT

1

Sto usando MySQL AES_ENCRYTP() e AES_DECRYPT() per memorizzare dettagli sensibili in un database e attualmente memorizzando la chiave in un file php all'esterno della web root con accesso in sola lettura. Il file chiave ha il seguente aspetto:

<?php
    define("CRYPTO_KEY", "SOME-LONG-KEY-HERE");
?>

Dopo un'ulteriore lettura, le persone consigliano che la chiave SOLO sia presente in memoria e utilizzi qualcosa come Condivisione segreta di Shamir WikiPedia article .

Come funzionerebbe nel mio caso con php , e dove in memoria sarebbe memorizzata la chiave?

Grazie per l'aiuto.

    
posta Justin 12.06.2013 - 02:31
fonte

2 risposte

2

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.

    
risposta data 13.07.2013 - 03:03
fonte
0

Stai facendo un paio di domande qui, una su AES e un'altra su schemi di condivisione segreti. Sono tecnologie ortogonali, quindi in teoria è possibile crittografare il file chiave utilizzando AES [con una chiave diversa] e condividere il risultato utilizzando uno schema di condivisione segreta. Sembra che uno schema di ritorno a capo potrebbe essere sulla falsariga di ciò che stai cercando. Ma poi la domanda diventa come memorizzare la chiave di crittografia della chiave, ecc.

    
risposta data 13.06.2013 - 00:15
fonte

Leggi altre domande sui tag