2016-06-30 74 views
0

我希望MySQL使用AES自動加密數據,以便我不必在應用程序層中執行此操作。第一個問題:這甚至可能嗎? 我想,簡單的方法:在插入之前觸發MySQL時的更改類型

表:

measurement 
id INT 
value VARBINARY(50) 

觸發:

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 

這是我第一次嘗試使用觸發器,所以也許這是一個簡單的故障或者也許MySQL不支持的東西喜歡這個。

我的testinsert有一個Double值作爲'value'。

是的,我知道我需要將我的隨機密鑰存儲在某個地方。所以也許有人有一個想法如何更新另一個表「應該在之前插入」?

非常感謝

錯誤消息:

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) 

生成MySQL工作臺的代碼:

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

COMMIT; 
+0

1)如果這種方式對數據進行加密,它是不會被搜索。你確定這是你想要的嗎? 2)請提供您在使用自己的代碼時遇到的確切錯誤消息或意外行爲。 – Shadow

+0

是的,我不希望該值可以被搜索,只是值的標識應該是純文本的。我更新了這個問題。 – Timo

回答

0

14.6.3 DECLARE Syntax

...

DECLARE僅在BEGIN ... END複合語句 中被允許,並且必須在其開始之前,在任何其他語句之前。

...

嘗試:

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,太棒了!這很好用!非常感謝! – Timo

+0

@Timo您是否願意在綠色複選標記標記爲「已接受」(如果您同意)。 – Drew