Mysql AES Encription

MySql AES Encription

Mysql bietet die Möglichkeit an, Einträge bzw. Felder verschlüsselt abzuspeichern. Dazu wird die Stored Function AES_Encrypt und AES_Decrypt angeboten:

CREATE  TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`first_name` LONGBLOB NULL ,
`address` LONGBLOB NOT NULL ,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci

Mit Standard aes-128-ecb
INSERT into user (first_name, address) VALUES (AES_ENCRYPT('Hansueli', SHA2('supersichereraeskeyAlsHash',512)),AES_ENCRYPT('Heimatadresse', SHA2('supersichereraeskeyAlsHash',512)));
SELECT AES_DECRYPT(first_name, SHA2('supersichereraeskeyAlsHash',512)) as first_name, AES_DECRYPT(address, SHA2('supersichereraeskeyAlsHash',512)) as address from user;
Mit aes-256-cbc

Ab Version 5.6.17 bietet MySQL nebst ecb auch noch weitere Modi an. Z.B. 256 bit cbc. CBC benötigt aber zusätzlich noch IV-Bytes:

SET @iv = RANDOM_BYTES(16);

IV-Bytes werden entsprechend verwendet:

ALTER TABLE user ADD COLUMN iv BINARY(16);
INSERT into user (id, first_name, address, iv) VALUES (10, AES_ENCRYPT('Hansueli', SHA2('supersichereraeskeyAlsHash',512),@iv), AES_ENCRYPT('Heimatadresse', SHA2('supersichereraeskeyAlsHash',512),@iv),@iv);
SELECT AES_DECRYPT(first_name, SHA2('supersichereraeskeyAlsHash',512), (select iv from user where id = 10)) as first_name, AES_DECRYPT(address, SHA2('supersichereraeskeyAlsHash',512),(select iv from user where id = 10)) as address, iv from user where id = 10;

Die IV-Bytes müssen mit (wirklichem!!) Zufallsprinzip erstellt und abgespeichert werden.

Verschlüsselungs-Algorithmus

Mysql benutzt per Standard einen 128-bit Schlüssel mit ECB block cipher mode. Das reicht wohl für die meisten Bedürfnisse aus. Dies kann aber auch bei Bedarf geändert werden.

Anzeigen des verwendeten Algorithmus

mysql> SELECT @@session.block_encryption_mode;
+---------------------------------+
| @@session.block_encryption_mode |
+---------------------------------+
| aes-128-ecb                     |
+---------------------------------+
1 row in set (0.00 sec)

Ändern des Algorithmus

mysql> SET @@session.block_encryption_mode = 'aes-256-cbc';
Query OK, 0 rows affected (0.00 sec)

Der Standard-Algorithmus kann aber auch auf der DB konfiguriert werden. Dazu muss im File my.ini folgendes eingetragen werden:

[mysqld]
...
block_encryption_mode=aes-256-cbc

Zu erwähnen ist, dass dieser Standard über den obigen SET-Befehl übersteuert werden kann.

 

Referenzen