2016-06-30 73 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