【问题标题】:MySQL change type while trigger before insertMySQL在插入前触发时更改类型
【发布时间】:2016-11-02 07:46:06
【问题描述】:

我希望 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 值作为“值”。

是的,我知道我需要将随机密钥存储在某个地方。所以也许有人知道如何更新另一个表,因为“插入之前”?

非常感谢

错误信息:

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;

【问题讨论】:

  • 1) 如果您以这种方式加密数据,它将无法被搜索。你确定这是你想要的吗? 2) 请提供您在使用自己的代码时遇到的确切错误消息或意外行为。
  • 是的,我不希望值是可搜索的,只是值的 id 应该是纯文本。我更新了问题。

标签: mysql triggers insert aes


【解决方案1】:

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)

【讨论】:

  • @Timo 如果您同意,请用绿色复选标记将此标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多