Algoritmo crittografico per anonimizzare le stringhe in modo pronunciabile?

7

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?

    
posta victorhooi 26.06.2015 - 06:18
fonte

2 risposte

4

Potresti provare un hash della sillaba.

Inizia con un algoritmo di hash di base per digerire i singoli identificatori di dati; non veramente deve essere cripto-forza, e mi raccomando contro. La maggior parte delle implementazioni produrrà un array di byte che è perfetto; alcuni produrranno una singola primitiva più grande o matrici di primitive più grandi, nel qual caso vorrai dividerle in byte.

Quindi, trova o crea una ricerca di possibili valori di byte che si associano a semplici coppie di valori di consonante (Ba, Be, Bi, Bo, Bu, Cha, Che, Chi, Cho, Chu, Da, De, Di, Do , Du ecc.). L'ordine delle sillabe e il loro mapping ai valori di byte non ha importanza; l'hashing è la parte non reversibile dell'operazione, non la mappatura delle sillabe. Ricorda che ottieni solo 256 e se usi un hash sicuro potrebbe anche essere saggio includere alcuni mapping che aggiungono informazioni senza aggiungere una sillaba (un trattino o vocali che verrebbero aggiunti alla vocale della sillaba precedente per creare una decifrazione o digramma).

Con un hash di checksum a 32 bit di base come FNV-1 o Murmur, questo ti darà parole di costruzione apparentemente casuale nell'intervallo delle sillabe 2-4 con l'andamento medio di tendenza (e la possibilità di riconoscere singole parole di sillaba quasi inesistente, specialmente se gli zeri iniziali sono trattati allo stesso modo degli zero allineati o finali dell'array di byte). Usando un hash crittografico, probabilmente dovrai XOR-foldare i byte, dato che qualcosa come SHA-1 ti darà 10 parole di sillaba, motivo per cui ti consiglierei contro un hash crittografico.

Probabilmente suonerà come un giapponese di realtà alternativa, ma sarai in grado di pronunciare gli identificatori risultanti. Per renderlo più inglese, potresti iniziare con un elenco delle più comuni sillabe inglesi, come questo . Tuttavia, questo elenco includerà sillabe che sono comuni perché sono prefissi o suffissi per le radici di parole, mentre ti verranno iniettati in posizioni casuali nella parola.

    
risposta data 26.06.2015 - 18:08
fonte
2

Che cosa stai cercando di ottenere? Vuoi rendere anonimo un database con dati sensibili per poterlo consegnare in modo sicuro a un team di test di QA esterno senza compromettere il contenuto? In questo caso, l'anonimizzazione della persona e dei nomi di aziende non è sufficiente, perché anche il resto dei dati ha un'impronta che consente di trarre conclusioni al proprietario dei dati. Inoltre hai detto che ogni dato dovrebbe mappare su un hash e viceversa, ma non dovrebbe essere reversibile. Questa è una contraddizione, non è possibile ottenere entrambi.

Per quanto riguarda un algoritmo, guarda come PGP crea le impronte digitali. Sono pronunciabili e hash, costituiti da una sequenza di parole inglesi.

Sebbene la funzione di hash non sia reversibile, gli hash consentono di identificare univocamente un record appartenente a questo hash.

Sono disponibili cloni di PGP open source disponibili, quindi dovresti essere in grado di ottenere il codice sorgente.

Invece dell'hashing puoi aggiungere un campo che ti riempie con stringhe casuali generate da un algoritmo come:

void Main()
{
    MakeRandomString(4).Dump();
}


private string MakeRandomString(int n)  
{  
    var bits = new List<string>()  
    {  
            "na",  "bla",  "chee",  "dee",  "ay",              
            "tree", "th",  "goo",  "foo",              
            "ook",  "ta",  "bee",              
            "zoo",  "ai",  "kawee",  "jam",  "ya"            
    };  

    StringBuilder sb = new StringBuilder();  
    Random r = new Random();  
    for (int i = 0; i < n; i++)  
    {  
        sb.Append(bits[r.Next(bits.Count)]);  
    }  

    return sb.ToString();  
}  

Questo creerà parole fantasy casuali come:

cheekaweefoobla
yataaitree
deetreenana

È un codice leggermente modificato che ho preso da qui . Per l'esportazione puoi usare quel campo come riferimento. Sarà in grado di mappare la riga originale. Puoi migliorare il codice sopra utilizzando un generatore casuale crittografico.

    
risposta data 26.06.2015 - 08:49
fonte

Leggi altre domande sui tag