NB: Originariamente l'ho postato su SO ( link ), ma poi rendi conto che la sicurezza SE è più adatta, dal momento che esistono domande su Crypto-PAn, che è simile qui
Ho un logfile di query di database che vorrei rendere anonimo - queste sono ottenute dai client e quindi analizzate esternamente. I clienti vorrebbero anonimizzare questi dati abbastanza per proteggere le informazioni identificative, ma lasciano comunque abbastanza per consentire un'analisi utile.
Alcune linee possono contenere indirizzi IP (es. IP sorgente) - Credo di poter usare qualcosa come Crypto -PAn per anonimizzare quelli. La mia comprensione è che questo anonimizzato è iniettivo (1: 1) oltre che ripetibile, ma anche non reversibile.
Allo stesso modo, le righe possono contenere anche campi e valori - ad es. { "name.first": "John" }
.
Per i valori, sono contento di utilizzare semplicemente MD5 (o simili sui contenuti) - non è così importante che vediamo quello che sono.
Tuttavia, per i campi del database, vorremmo conservarli in un formato in qualche modo leggibile. Questo perché faremmo analisi delle prestazioni basate su quei campi (ad esempio raggruppando le query in base ai campi ecc.)
Ad esempio, name.first
potrebbe diventare Tree.Blackboard
.
I vincoli sono:
- Ogni parola inserita deve essere mappata a un hash e viceversa (capisco che ci saranno delle collisioni, ma speriamo che siano abbastanza rare).
- Ripetibile - Se abbiamo più file di log, vogliamo lo stesso hash generato ogni volta: questo ci permetterà di confrontare i file di log.
- Non reversibile - Idealmente, non dovrebbe esserci un modo semplice per invertire l'hash per ottenere il nome del campo originale.
- Leggibile dall'uomo - L'hash dovrebbe essere leggibile / pronunciabile dall'uomo, ma non devono necessariamente essere parole inglesi valide (ad esempio
Flerti
è accettabile,037751d79d1ebfdd0664b2c66b8d66d1
non lo è)
Ho discusso con un collega, e un modo in cui pensavamo era:
- Prendi il nome del campo e passa attraverso un hash unidirezionale standard (ad esempio MD5).
- Prendi un numero sufficiente di bit di ordine basso dall'hash risultante per mappare un dizionario di parole inglesi (ad esempio 1.000.000 di parole valide). Usa l'intero equivalente di quei bit e fai una mod per indicizzare una parola in quel dizionario.
L'idea è che - le parole dovrebbero essere leggibili ma anche sempre coerenti (supponendo che il tuo dizionario sia rimasto lo stesso)
Se alcuni individui erano preoccupati per gli attacchi al dizionario (ad esempio il nome del campo "firstname" sarebbe sempre mappato per dire "Blackboard"), allora quella persona potrebbe avere il proprio keyfile specifico usato per salare l'hash. Ciò significa che sarebbe ripetibile per i file di registro resi anonimi da essi (ad esempio, "firstname" potrebbe sempre corrispondere a "Billion" per loro), ma non sarebbe lo stesso di altre persone che utilizzano altri file di chiavi.
Domanda 1 - Esiste già un algoritmo crittografico esistente (simile a Crypto-PAn) che può essere utilizzato per anonimizzare le stringhe in modo pronunciabile / leggibile?
Domanda 2 - In caso contrario, si vedono dei buchi evidenti nell'approccio semplicistico descritto sopra?