我有一个表“选项卡”,它基本上由“用户”和“数据”两列组成。“用户”是指应用程序级别的一些用户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”。
我目前的解决方法包括两个步骤:
- 将“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;
- 创建触发器,导致对列“数据”的任何插入或更新进行加密:
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”执行插入和更新。有谁知道更好的解决方法或替代方法?
非常感谢您的帮助,
简