publish and discover academic work ...

Daten Anonymisierung in der Datenbank

Sicher sind Sie als Entwickler auch schon Mal in die Situation geraten, ein Programm testen zu müssen und zwar am liebsten mit echten Daten. Dafür müssen sie aber zuerst anonymisiert werden. Es gibt viele Möglichkeiten das zu tun, der eine schreibt ein Script, das dann mehrere Stunden lang läuft und ein anderer benutzt ein Werkzeug wie z.B. Databene Benerator. Ich schlage Ihnen vor, direkt mit der Datenbank zu arbeiten.

Unsere Ausgangsposition sieht wie folgt aus. Wir haben eine Tabelle, die folgende Spalten beinhaltet:

  • first_name
  • gender
  • last_name
  • address_1
  • address_2
  • home_phone
  • birthdate
  • ssn
  • password

Selbstverständlich müssen die Daten, die in der Spalte first_name und last_name stehen, durch Anonymisierte-Daten ersetzen. Die Adressen und Telefonnummern dürfen auch nicht vergessen werden. Dafür haben wir folgende Daten vorbereitet:

Für first_name gilt die Regel, wenn es sich um eine weibliche Person handelt, soll das Feld mit einem der folgenden Namen gesetzt werden:
Patricia, Taylor, Susan, Lisa, Linda, Sandra, Carol, Debra, Teresa, Rebecca, Diana, Veronika, Helen, Alexandra, Svetlana, Elona, Marina, Mila, Olga, Vasilisa, Marta.


Handelt es sich um eine männliche Person, so werden die entsprechenden Felder mit folgenden Namen gefüllt:

David, John, Robert, Steven, William, Mark, Thomas, Michael, Richard, Kevin, Donald, Andrew, Ruslan, Eugene, Robert, Alexandr, Christian, Franz, Daniel

Für last_name machen wir keinen Unterschied zwischen den Geschlechtern und schreiben eine von den folgenden Nachnamen hinein:

Johnson, Anderson, Reed, Erickson, Frank, Lucas, Jenkins, Watson, Morgan, Kim, Musterman, Schröder, Merkel, Urchik, Kuleshov, Smit, Areshnik, Pekar, Matroskin, Gallagher


Die addresse_1 ersetzen wir durch 123 Main Street. Die adresse_2 ist entweder NULL, wenn sie leer ist, oder 123 Main Street anderfalls.
home_phone enthält nach der Anonymisierung entweder NULL oder 111-111-2222.

birthdate ist eigentlich nicht so kritisch, aber für mehr Anonymität ändern wir zumindest den Monat und Tag Wert.

ssn ist ein eindeutiger Zufallswert, der immer mit '30' anfängt.
password ist immer NULL.

Haben Sie schon eine Idee, wie wir nun unsere Testdaten, direkt in die Datenbank schreiben können. Schauen Sie sich zuerst meine Lösung unter dem Spoiler an, dann verrate ich Ihnen das Wichtigste: die Lösung ist verdammt einfach!

Lösung
SET @rand = 276821; 
UPDATE users
  SET first_name=
        CASE WHEN gender='F' || gender='f' THEN ELT(FLOOR(1+RAND() * 21), 'Patricia', 'Taylor', 'Susan', 'Lisa', 'Linda', 'Sandra', 'Carol', 'Debra', 'Teresa', 'Rebecca', 'Diana', 'Veronika', 'Helen', 'Alexandra', 'Svetlana', 'Elona', 'Marina', 'Mila', 'Olga', 'Vasilisa', 'Marta')
                                           ELSE ELT(FLOOR(1+RAND() * 19), 'David', 'John', 'Robert', 'Steven', 'William', 'Mark', 'Thomas', 'Michael', 'Richard', 'Kevin', 'Donald', 'Andrew', 'Ruslan', 'Eugene', Robert, 'Alexandr', 'Christian', 'Franz', 'Daniel')
        END,
      last_name = ELT(FLOOR(1+RAND() * 20), 'Johnson', 'Anderson', 'Reed', 'Erickson', 'Frank', 'Lucas', 'Jenkins', 'Watson', 'Morgan', 'Kim', ' Musterman ', ' Schröder ', ' Merkel ', 'Urchik', 'Kuleshov', ' Smit ', 'Areshnik', 'Pekar', 'Matroskin', 'Gallagher'),
      address_1 = '123 Main Street',
      address_2 =
        CASE WHEN address_2 is not null THEN 'Apt. 14'
                                        ELSE null
        END,
      home_phone =
        CASE WHEN home_phone is not null THEN '111-111-2222'
                                         ELSE null
        END,
      birthdate =
        CASE WHEN birthdate is not null THEN MAKEDATE(YEAR(birthdate),FLOOR(RAND()*365))
                                        ELSE null
        END,
      ssn =
        CASE WHEN ((@rand + 609673) % 1048576 <> 0) && ((@rand + 609673) % 1048576 <> 1000000)
               THEN CONCAT('30',LPAD(@rand:=(@rand + 609673) % 1048576,7,'0'))
             ELSE CONCAT('30',LPAD(@rand:=(@rand + 609673*2) % 1048576,7,'0'))
        END,
      password = null;


Und nun die Erklärung:

Um einen Wert aus einer Liste zufällig zu wählen, benutzen wir die Funktion ELT(FLOOR(1+RAND() * 21),...), wobei FLOOR(1+RAND() * 21) eine zufällige Zahl zwischen 1 und 21 generiert.

Die Operatoren CASE, IF, IFNULL(), NULLIF() sind — denke ich — selbsterklärend.

Um ssn zu generieren, benutzen wir einen Zufallszahlengenerator, er benötigt einen Startwert( als SID bekannt), den wir ganz zu Beginn, in der Variable @rand gespeichert haben. Jede weitere Zufallszahl wird mit @rand:=(@rand + 609673*2) % 1048576 erzeugt und der Endwert wird dann mit CONCAT('30',LPAD(@rand, 7, '0')) gesetzt.

Diese Vorgehensweise hat mehrere Vorteile, sie ist schnell, verständlich und braucht nichts außer der Datenbank, die wir sowieso schon haben.
  • cron cron,
  • 28 Februar 2013, 21:54
  • 1

Kommentare (0)

RSS zusammenklappen / ausklappen

Kommentar schreiben

Ihr Name
Sie sind ein Gast, Sie dürfen keine HTML-Tags verwenden
Bitte geben Sie die Zeichen in das folgende Feld ein