我希望MySQL能够自动使用AES加密数据,因此我没有在应用程序层中执行此操作。第一个问题:这甚至可能吗? 我试过这个简单的方法:
表:
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 Workbench代码:
START TRANSACTION;
USE `openeHealth`;
INSERT INTO `openeHealth`.`measurement` (`id`, `owner_id`, `type_id`, `value`, `device_id`) VALUES (1, 1, 1, ..., 1);
COMMIT;
答案 0 :(得分:0)
...
仅允许在BEGIN ... END复合语句中使用DECLARE 并且必须在任何其他陈述之前开始。
...
尝试:
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)