Scambio di DEK e KEK (chiavi di crittografia) tra il server delle applicazioni e il server delle chiavi

7

Nella mia applicazione, è necessario crittografare i dati di un utente prima di inserirlo nel database mysql. Sto usando l'algoritmo AES per crittografare i dati usando un hash a 256 bit (e lo chiamano Data Encryption Key, o DEK in breve).

Per rendere il sistema più sicuro, invece di archiviare DEK in formato testo nel server dell'app, questo viene archiviato in forma crittografata (en_dek) nel server dell'app. La chiave per crittografare il DEK è memorizzata in un server totalmente separato e viene chiamata Key Encryption Key (KEK). Quindi ogni volta che un dato deve essere crittografato / decrittografato, in primo luogo il KEK viene utilizzato per decodificare l'en_dek, che mi dà l'effettivo DEK, e quindi questo DEK è usato per crittografare / decodificare i dati dell'utente.

Ora la mia domanda è:

[1] Devo inviare (en_dek + data) al server delle chiavi o devo recuperare KEK nel server delle app? Qual è la pratica più sicura?

[2] Entrambi questi metodi hanno un difetto che se un utente malintenzionato riesce ad accedere a uno di questi server, conoscerà sia KEK che DEK. Come possiamo evitare questo?

[3] Quando parliamo della rotazione delle chiavi, quale delle due chiavi (DEK e KEK) viene ruotata?

    
posta Nalin Gupta 18.03.2013 - 18:43
fonte

1 risposta

10

Should I send (en_dek + data) to the key server or should I fetch the KEK into the app server? Which one is more safe practice?

L'invio della chiave en_dek al server delle chiavi da gestire è praticamente come funziona un modulo di sicurezza hardware ad alto livello. Il vantaggio di questo approccio è che il materiale chiave non tocca mai il server delle applicazioni. Pertanto, qualsiasi compromissione del server delle applicazioni può decrittografare solo le chiavi attualmente in memoria, oltre a inviare potenzialmente richieste di decrittazione al server delle chiavi. Tuttavia, l'autore dell'attacco non ottiene automaticamente l'accesso alla chiave principale stessa, che è importante.

Dato che stai già comunicando l'invio dei dati a un altro sistema per la decifrazione, mi chiedo se potrebbe non essere più semplice inviare i dati, nascondendo così la chiave interamente dal server delle applicazioni?

In qualsiasi schema come questo, la sicurezza della chiave dipende interamente dalla sicurezza del server o HSM su cui è memorizzata. Di solito, i veri HSM sono abbastanza buoni per proteggere le chiavi a meno che tu non sia molto utile con l'elettronica.

Both these methods have a flaw that if an attacker is able to get access to either of these servers, he will get to know both KEK and DEK. How can we prevent this?

Non puoi, se non usando un HSM dedicato, che è essenzialmente quello che stai discutendo di costruire. Semplificherei lo schema e manterrai le chiavi su un server dedicato esclusivamente alle operazioni di crittografia e tieni il server bloccato.

Per ulteriori informazioni su questi due punti, consulta le regole OWASP sull'archiviazione crittografica .

When we talk about key rotation, which of the two keys (DEK and KEK) is rotated?

Idealmente, entrambi. Ruotare il KEK dovrebbe essere più semplice, dato che i DEK hanno dimensioni fisse e non dovrebbero essercene tutti molti. Ruotare i DEK potrebbe essere più difficile se si stanno crittografando molti dati.

Dalla pagina OWASP, che lo dice meglio di me:

Rekeying refers to the process of decrypting data and then re-encrypting it with a new key. Periodically rekeying data helps protect it from undetected compromises of older keys. The appropriate rekeying period depends on the security of the keys. Data protected by keys secured in dedicated hardware security modules might only need rekeying every three years. Data protected by keys that are split and stored on two application servers might need rekeying every year.

    
risposta data 18.03.2013 - 19:42
fonte

Leggi altre domande sui tag