Problema
Sto cercando di spiegare lo scenario completo nei prossimi paragrafi. Penso che sia importante per ottenere un contesto in cui viene posta la domanda, quindi ti prego di sopportare me, anche se è un muro di testo.
Al momento sono incaricato di anonimizzare i dati in modo sicuro. L'idea è di usare HMAC(<string to anonymize>, key)
per rendere anonimi i dati in modo che non possano essere invertiti. Ad esempio se hai un ID cliente ( CUST299128218
) questo sarebbe HMAC-ed usando SECRET
come chiave a 543a36dd07fe4a3fa4a2db202546eaaccaef71f871ebafe11de3b54784ba266e
. Dal momento che vogliamo eseguire analisi sui dati resi anonimi, è importante che lo stesso ID cliente produca sempre lo stesso digest HMAC. Quindi non possiamo gettare via la chiave segreta poiché abbiamo bisogno di anonimizzare i dati futuri con la stessa chiave.
Ovviamente la chiave deve essere archiviata in un posto sicuro in modo che non venga eliminata. Altrimenti qualcuno che conosce un ID cliente potrebbe facilmente trovare quel cliente specifico nei dati resi anonimi. Per vari motivi tecnici / organizzativi non è possibile utilizzare un modulo di sicurezza hardware per la memorizzazione della chiave. Quindi ho dato un'occhiata al Vault di HashiCorp, che sembra essere una buona idea per questo in quanto fornisce un'API REST dove puoi dargli un testo in chiaro e restituisce l'HMAC di questo testo in chiaro utilizzando un archivio precedentemente memorizzato chiave. La chiave non lascia mai il Vault, che è molto meglio che avere la chiave memorizzata in alcune proprietà di configurazione del software di anonimizzazione.
Tuttavia stiamo parlando di grandi quantità di set di dati per essere resi anonimi (alcune centinaia di migliaia fino a pochi milioni al giorno) ed è prevedibile che chiamino l'API Vault per ogni set di dati (possibilmente più volte se più articoli devono essere resi anonimi) si tradurrà in un tonnellata di spese generali che potrebbe sovraccaricare l'infrastruttura che abbiamo a disposizione per questo.
Soluzione proposta
Quindi ho avuto questa idea: cosa succede se ho usato una stringa fissa (ad esempio 'customer_id_secret_bootstrap'
) e ho permesso a Vault di creare un HMAC su questo utilizzando la chiave segreta. Quindi uso questo HMAC come chiave segreta per l'HMAC attuale sui dati da anonimizzare. In termini funzionali:
temp_key = CALL_VAULT('customer_id_secret_bootstrap')
anonymized_text = HMAC( <plaintext>, temp_key)
In questo modo ho potuto effettuare una sola chiamata a Vault e mantenere la chiave temporanea in memoria. Dovrei sempre recuperare la stessa chiave temporanea da Vault (poiché si tratta di un HMAC), ma la chiave originale (che è usata per derivare la chiave temporanea) non lascia mai il vault e quando il programma si chiude, la chiave temporanea non può essere ricreata senza accedere al Vault. In questo modo, assicurerei la sicurezza della chiave senza avere un milione di chiamate al Vault.
Domanda
Ora sapendo che non sono un esperto di sicurezza di gran lunga, questa potrebbe essere una pessima idea per ragioni sconosciute a me. Pertanto mi piacerebbe eseguire questo con voi esperti qui - potete dirmi se questa è una buona o cattiva idea e se è una cattiva idea potresti suggerire un approccio alternativo che assicurerebbe la sicurezza della chiave e sarà scalabile?
Aggiornamento / Modifica
Come molte risposte sottolineano che non è sufficiente per sostituire gli ID in quanto vi sono altri campi che possono essere utilizzati per correlare le informazioni a un piccolo gruppo di persone o anche a una singola persona (ad es. i timestamp sono grandiosi per questo). Ci occupiamo anche di questo rimuovendo o sostituendo tali informazioni per garantire che ciò non possa accadere (abbiamo una lista di controllo molto lunga per quanto riguarda tali cose che si basa su standard di anonimizzazione). Non volevo inserire questi dettagli qui perché la domanda è già molto prolissa.