1

我有一个表“选项卡”,它基本上由“用户”和“数据”两列组成。“用户”是指应用程序级别的一些用户ID,“数据”是指用户存储的一些机密信息。

CREATE TABLE IF NOT EXISTS tab(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user VARCHAR(255),
    data BLOB
);

我需要使用各个用户的单独密钥加密“数据”列中的每个 blob,该密钥是根据用户的密码计算的,并在用户登录时存储在临时表中。为了执行加密和解密,我定义了两个存储过程“encData”和“decData”。

但是有一个问题:加密方案应该对运行在数据库之上的任何应用程序完全透明。不应更改表和列的名称,即“tab.data”上的 SELECT 语句应隐式调用“decData”,而 INSERT 和 UPDATE 应隐式调用“encData”。

我目前的解决方法包括两个步骤:

  1. 将“tab”重命名为“tab_encrypted”并创建一个名为“tab”的视图,这会导致“data”列上的任何 SELECT 语句被解密:
    ALTER TABLE tab RENAME TO tab_encrypted;
    
    CREATE OR REPLACE VIEW tab AS
        SELECT id, user, decData(data) AS data FROM tab_encrypted;
    
  2. 创建触发器,导致对列“数据”的任何插入或更新进行加密:
    CREATE TRIGGER encOnInsert BEFORE INSERT ON tab_encrypted FOR EACH ROW
        SET NEW.data = encData(NEW.data);
    
    CREATE TRIGGER encOnUpdate BEFORE UPDATE ON tab_encrypted FOR EACH ROW
        SET NEW.data = encData(NEW.data);

不幸的是,由于派生列,视图“选项卡”既不可插入也不可更新,这使得有必要对“tab_encrypted”执行插入和更新。有谁知道更好的解决方法或替代方法?

非常感谢您的帮助,

4

0 回答 0