2016-06-30 12 views
0

Ich möchte MySQL Daten mit AES automatisch verschlüsseln, so dass ich es nicht in der Anwendungsschicht tun muss. Erste Frage: Ist das überhaupt möglich? Ich habe versucht, dass einfache Ansatz:MySQL ändern Typ während Trigger vor dem Einfügen

Tabelle:

measurement 
id INT 
value VARBINARY(50) 

Trigger:

CREATE DEFINER = CURRENT_USER TRIGGER `openeHealth`.`measurement_BEFORE_INSERT` BEFORE INSERT ON `measurement` FOR EACH ROW 
BEGIN 
    SET @@session.block_encryption_mode = 'aes-256-ecb'; 
    DECLARE vKey = RANDOM_BYTES(256); 
    SET NEW.value HEX(AES_ENCRYPT(value, vKey)); 
END 

Es ist mein erster Versuch zu verwenden löst so vielleicht ist es ein einfacher Fehler oder vielleicht MySQL unterstützt nicht etwas so was.

Meine Testinstallation hat einen doppelten Wert als 'Wert'.

Und ja, mir ist bewusst, dass ich meinen zufälligen Schlüssel irgendwo speichern muss. Hat also vielleicht jemand eine Idee, wie man eine andere Tabelle aufgrund "Einfügen vor" auf den neuesten Stand bringt?

Vielen Dank

Fehlermeldung:

ERROR: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.., 1)' at line 1 
SQL Code: 
    INSERT INTO `openeHealth`.`measurement` (`id`, `owner_id`, `type_id`, `value`, `device_id`) VALUES (1, 1, 1, ..., 1) 

generierter Code von MySQL Workbench:

START TRANSACTION; 
USE `openeHealth`; 
INSERT INTO `openeHealth`.`measurement` (`id`, `owner_id`, `type_id`, `value`, `device_id`) VALUES (1, 1, 1, ..., 1); 

COMMIT; 
+0

1), wenn Sie Daten auf diese Weise zu verschlüsseln, ist es nicht durchsuchbar sein würde. Bist du sicher, dass du das willst? 2) Bitte geben Sie die genaue Fehlermeldung oder das unerwartete Verhalten an, das Sie bei der Verwendung Ihres eigenen Codes festgestellt haben. – Shadow

+0

Ja, ich möchte nicht, dass der Wert durchsuchbar ist, nur die ID des Wertes sollte im Klartext stehen. Ich habe die Frage aktualisiert. – Timo

Antwort

0

14.6.3 DECLARE Syntax

...

DECLARE ist nur innerhalb einer BEGIN ... END-Verbundanweisung zulässig und muss vor allen anderen Anweisungen am Anfang stehen.

...

Versuchen:

mysql> DROP TABLE IF EXISTS `measurement`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `measurement`(
    -> `id` INT, 
    -> `value` VARBINARY(50) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER // 

mysql> CREATE DEFINER=CURRENT_USER TRIGGER `measurement_BEFORE_INSERT` BEFORE INSERT ON `measurement` 
    -> FOR EACH ROW 
    -> BEGIN 
    -> DECLARE `SESSION_block_encryption_mode` VARCHAR(33) DEFAULT @@SESSION.`block_encryption_mode`; 
    -> -- SET @@session.block_encryption_mode = 'aes-256-ecb'; 
    -> -- DECLARE vKey = RANDOM_BYTES(256); 
    -> 
    -> SET @@SESSION.`block_encryption_mode` := 'aes-256-ecb'; 
    -> 
    -> -- SET NEW.value HEX(AES_ENCRYPT(value, vKey)); 
    -> SET NEW.`value` := HEX(AES_ENCRYPT(NEW.`value`, RANDOM_BYTES(256))); 
    -> SET @@SESSION.`block_encryption_mode` := `SESSION_block_encryption_mode`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> INSERT INTO `measurement` 
    -> (`id`, `value`) 
    -> VALUES 
    -> (1, 'myKey'); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT 
    -> `id`, 
    -> `value` 
    -> FROM 
    -> `measurement`; 
+------+----------------------------------+ 
| id | value       | 
+------+----------------------------------+ 
| 1 | 10293FC4F42FC7BAAA91C94EFF004315 | 
+------+----------------------------------+ 
1 row in set (0.00 sec) 
+0

Yey, super! Das hat gut funktioniert! Danke vielmals! – Timo

+0

@Timo würden Sie dies bitte mit dem grünen Häkchen als Akzeptiert markieren, wenn Sie zustimmen. – Drew

Verwandte Themen