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
- http://thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques/
- http://mysqlblog.fivefarmers.com/2014/03/27/mysql-5-6-17-now-with-better-encryption/
- http://mysqlserverteam.com/understand-and-satisfy-your-aes-encryption-needs-with-5-6-17/