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.