Motivazione
Lavoro con set di dati che contengono informazioni di identificazione personale (PII) e talvolta ho bisogno di condividere parte di un set di dati con terze parti, in un modo che non espone le PII e sottopone il mio datore di lavoro alla responsabilità. Il nostro approccio abituale qui è quello di trattenere i dati interamente, o in alcuni casi per ridurne la risoluzione; ad esempio, la sostituzione di un indirizzo esatto con la contea o il tratto di censimento corrispondenti.
Ciò significa che determinati tipi di analisi ed elaborazione devono essere eseguiti internamente, anche quando una terza parte ha risorse e competenze più adatte all'attività. Poiché i dati di origine non vengono divulgati, il modo in cui procediamo con questa analisi ed elaborazione manca di trasparenza. Di conseguenza, la capacità di qualsiasi terza parte di eseguire QA / QC, regolare i parametri o apportare perfezionamenti può essere molto limitata.
Anonimizzazione dei dati riservati
Un'attività consiste nell'identificare le persone con i loro nomi, nei dati inviati dall'utente, tenendo conto degli errori e delle incoerenze. Un privato potrebbe essere registrato in un posto come "Dave" e in un altro come "David", le entità commerciali possono avere molte abbreviazioni diverse e ci sono sempre alcuni errori di battitura. Ho sviluppato script basati su una serie di criteri che determinano quando due record con nomi non identici rappresentano lo stesso individuo e assegnano loro un ID comune.
A questo punto possiamo rendere anonimo il set di dati trattenendo i nomi e sostituendoli con questo numero ID personale. Ma questo significa che il destinatario non ha quasi alcuna informazione, ad esempio sull'intensità della partita. Preferiremmo essere in grado di trasmettere quante più informazioni possibili senza divulgare l'identità.
Cosa non funziona
Ad esempio, sarebbe bello poter crittografare le stringhe preservando la distanza di modifica. In questo modo, le terze parti potrebbero eseguire parte del proprio QA / QC o scegliere di effettuare ulteriori elaborazioni per conto proprio, senza mai accedere (o essere in grado di eseguire il reverse engineering) delle PII. Forse abbiniamo le stringhe internamente con la modifica della distanza <= 2 e il destinatario vuole esaminare le implicazioni del rafforzamento di tale tolleranza per modificare la distanza <= 1.
Ma l'unico metodo che ho familiarità con ciò è ROT13 (più in generale, qualsiasi cifra di spostamento ), che a malapena conta come crittografia; è come scrivere i nomi sottosopra e dire: "Prometti di non capovolgere il foglio?"
Un'altra cattiva soluzione sarebbe abbreviare tutto. "Ellen Roberts" diventa "ER" e così via. Questa è una soluzione scadente perché in alcuni casi le iniziali, in associazione con i dati pubblici, rivelano l'identità di una persona, e in altri casi è troppo ambigua; "Benjamin Othello Ames" e "Bank of America" avranno le stesse iniziali, ma i loro nomi sarebbero altrimenti diversi. Quindi non fa nessuna delle cose che vogliamo.
Un'alternativa non elegante è quella di introdurre campi aggiuntivi per tenere traccia di alcuni attributi del nome, ad esempio:
+-----+----+-------------------+-----------+--------+
| Row | ID | Name | WordChars | Origin |
+-----+----+-------------------+-----------+--------+
| 1 | 17 | "AMELIA BEDELIA" | (6, 7) | Eng |
+-----+----+-------------------+-----------+--------+
| 2 | 18 | "CHRISTOPH BAUER" | (9, 5) | Ger |
+-----+----+-------------------+-----------+--------+
| 3 | 18 | "C J BAUER" | (1, 1, 5) | Ger |
+-----+----+-------------------+-----------+--------+
| 4 | 19 | "FRANZ HELLER" | (5, 6) | Ger |
+-----+----+-------------------+-----------+--------+
Lo chiamo "inelegante" perché richiede di anticipare quali qualità potrebbero essere interessanti ed è relativamente grossolano. Se i nomi vengono rimossi, non c'è molto che si possa ragionevolmente concludere sulla forza della corrispondenza tra le righe 2 e 3, o sulla distanza tra le righe 2 e 4 (cioè, quanto sono vicine alla corrispondenza).
Conclusione
L'obiettivo è quello di trasformare le stringhe in modo tale da preservare quante più qualità utili della stringa originale mentre oscuri la stringa originale. La decrittazione dovrebbe essere impossibile o così poco pratica da essere effettivamente impossibile, indipendentemente dalle dimensioni del set di dati. In particolare, sarebbe molto utile un metodo che preservi la distanza di modifica tra stringhe arbitrarie.
Ho trovato un paio di articoli che potrebbero essere rilevanti, ma sono un po 'sopra la mia testa: