Kategorien
Programmierung

Einfache Anonymisierung von Kundendaten mit MySQL / MariaDB

Wer lokal Anwendungen entwickelt oder diese auf Demo-Systemen zum Testen bereitstellt, hat oft das Problem dass sinnvolle Daten notwendig sind um eine Anwendung korrekt testen zu können. Nun ist es aber rechtlich und moralisch bedenklich echte Personendaten auf einem Preview oder Entwicklungssystem zu verwenden da solche System auch oft weit weniger abgesichert sind.

Eine Möglichkeit das Problem zumindest abzumildern ist, die Personen bezogenen Daten, zu anonymisieren.

Eine einfach Möglichkeit wäre, Felder wie Vorname und Nachname per Skript mit Zufallsdaten zu füllen. Die schönere Variante ist es jedoch, innerhalb einer Tabelle bestimmte Felder zufällig durch zu tauschen.

Geschieht dies mit Feldern wie Vorname,Nachname, E-Mail, Benutzername sind die Daten meist schon ausreichend anonym. Wer sicher gehen will anonymisiert auch noch die Adressdaten wie Straße und Ort.

Ein MySQL Statment das dies für das Feld „mail“ in der Tabelle „users“ vornimmt, sieht wie folgt aus:

# Temporäre Tabelle mit den zu anonymisierenden erstellen
CREATE TEMPORARY TABLE IF NOT EXISTS users_rand AS (SELECT id,firstname,lastname,mail FROM users);

# Eigentliche Anonymisierung
update users set mail= (SELECT mail FROM users_rand AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM users)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1) 

Dies lässt sich mit anderen Feldern wiederholen in dem man aus „..set mail= (SELECT mail..“ zum Beispiel „..set firstname=(SELECT firstname .. “ macht. Die verwendeten Felder müssen beim Erstellen der temp. Tabelle mit angegeben worden sein.

# Temporäre Tabelle mit den zu anonymisierenden Daten erstellen
CREATE TEMPORARY TABLE IF NOT EXISTS users_rand AS (SELECT id,username,firstname,lastname,mail FROM users);

# Eigentliche Anonymisierung
update users set username = (SELECT username FROM users_rand AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM users)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1)

Je nach den verwendeten Indizes und der Größe der Tabelle kann dies eine Weile dauern.

Nach einigen Durchläufen mit allen wichtigen Feldern sollten die Daten so durchmischt sein das keine Bezüge zu echten Personen mehr möglich sein dürften.

Welche Felder anonymisiert werden sollten muß jeder selbst entscheiden. Neben den offensichtlichen Feldern können auch IDs und Referenzen zu anderen Tabellen und Daten oder Mitgliedsnummern sinnvoll sein.

Von Christian Stengel

Geek, PHP Entwickler, Linux Admin

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.