Datenbankinhalte AES verschlüsseln mit MySQL

Das Datenbanksystem MySQL bietet die Funktionalität Daten mit AES Verschlüsselung in einem Datenbankfeld abzulegen und natürlich auch wieder zu entschlüsseln.

Betrachten wir im ersten Schritt die notwendigen Vorarbeiten. Damit die Daten in einem Datenbankfeld verschlüsselt abgelegt werden können, benötigt man die richtige Definition für das Datenbankfeld. Verschlüsselte Daten sollten in einem BLOB formatierten Datenbankfeld abgelegt werden. Im folgenden CREATE Skript erstellen wir eine Tabelle secrets mit zwei Spalten, ID und CONTENT:

CREATE TABLE `secrets` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`content` LONGBLOB NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

Für den Verschlüsselungsvorgang benötigen wir noch einen Schlüssel. Hierzu würfeln wir eine wahllose Zeichenfolge:

mCgCizeXzYrXXTvxrNmrIsKO8vdaFs3ZzTo7UcQ8mr+Q/6KIpJDMdgeKH57weCqLH5vJ6aquAuI=

Die Verschlüsselungs Methode AES ist eine sog. Symmetrische Verschlüsselung. Die Zeichenfolge steht also in direkter Beziehung mit den Verschlüsselten Daten und wird bei jeder Ver- und Entschlüsselung benötigt. Man muss aber die Zeichenfolge selbstorganisieren und entsprechend sichern.

Speichern wir nun die Daten in der Tabelle secrets mit der Funktion AES_ENCRYPT ab:

INSERT INTO secrets (content) VALUES (AES_ENCRYPT('das ist mein geheimnis', 'mCgCizeXzYrXXTvxrNmrIsKO8vdaFs3ZzTo7UcQ8mr+Q/6KIpJDMdgeKH57weCqLH5vJ6aquAuI='));

Wenn wir uns jetzt den Inhalt der Tabelle ansehen erkennt man gar nichts. Das liegt in erster Linie an der BLOB Formatierung:

 

Geht man nun her und fragt die Daten mit einem SELECT-Statement ab:

SELECT content FROM secrets

erhält man folgendes:

 

Man kann klar erkennen, dass die Daten in der Spalte CONTENT verschlüsselt sind. Man kann jetzt „on the fly“ die Daten, mit der Funktion AES_DECRYPT, beim SELECT-Statement entschlüsseln:

SELECT AES_DECRYPT(content, 'mCgCizeXzYrXXTvxrNmrIsKO8vdaFs3ZzTo7UcQ8mr+Q/6KIpJDMdgeKH57weCqLH5vJ6aquAuI=' ) FROM secrets

und man erhält die zuvor eingegebenen Daten wieder im Klartext:

 

Die Verschlüsselung von der Datenbank selbst ausführen zu lassen, spart wieder mal die Realisierung einer Verschlüsselung auf Anwendungsebene. Im Falle das man eine Anwendung mit verschlüsselten Datenspeichern benötigt, ist die AES Variante in MySQL eine gangbare Variante.

MySQL bietet auch noch andere Verschlüsselungsalgorithmen wie z.B. DES. Diese funktionieren im Grunde ähnliche wie die AES-Variante. Welchen Algorithmus man am besten verwendet, sollte man sich genau überlegen. Das hat weniger mit der Anwendbarkeit im Programmcode zu tun als mit der Sicherheit. Es gibt ein paar Empfehlungen von offiziellen Stellen der Bundesbehörden an denen man sich orientieren kann. Und natürlich findet man eine menge Expertisen dazu im Internet.

http://www.agile-coding.net/datenbankinhalte-aes-verschluesseln-mit-mysql/