数据加密 SQL 兼容性 #
在 SphereEx-DBPlusEngine SQL 解析引擎的基础上,数据安全加密功能通过对 SQL 语法树的改写并配合不同的加密算法,可以实现 SQL 敏感字段的加解密处理。 受限于不同加密算法的运算特征,数据加密功能可能存在部分 SQL 运算无法兼容,需要用户在使用过程中进行规避,下面展示了 SphereEx-DBPlusEngine 能够支持以及不支持的常用 SQL 列表,可供用户使用参考。
说明:以下不支持的 SQL 列表仅针对配置了加密列的场景,非加密场景下 SphereEx-DBPlusEngine 能够支持全部 SQL 运算。 子查询等复杂查询受限于简单查询语句的兼容性,如果出现函数、表达式中包含加密列等操作,目前暂时无法支持。
支持的常用 SQL 列表 #
MySQL #
- DML 语句——SELECT
SQL 示例 | 说明 |
---|---|
SELECT u.* FROM t_user u WHERE u.user_id = ? | 支持简单查询的查询星号展开 |
SELECT u., o., i.* FROM t_user u INNER JOIN t_order o ON u.user_id = o.user_id INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE u.user_id = ? | 支持关联查询的查询星号展开 |
SELECT * FROM (SELECT COUNT(DISTINCT user_id) FROM t_user u WHERE user_id = ? GROUP BY user_id) temp | 支持子查询的查询星号展开 |
SELECT temp.* FROM (SELECT COUNT(user_id), MAX(user_id), MAX(user_id) + 1, (SELECT 1 + 1 FROM DUAL) FROM t_user WHERE user_id = ? GROUP BY user_id) temp | 支持简单查询、关联查询、子查询组合场景下的复杂查询星号展开 |
SELECT u.user_id, (SELECT user_name FROM t_user LIMIT 1) FROM t_user u WHERE u.user_id = ? | 支持 Projection 子查询 |
SELECT * FROM (SELECT * FROM t_user) AS temp WHERE user_id = ? | 支持 Table 子查询和 Join 子查询 |
SELECT u.* FROM t_user u WHERE u.user_name = (SELECT user_name FROM t_user WHERE user_id = ?) | 支持 Predicate 子查询 |
SELECT * FROM t_user u INNER JOIN t_merchant m ON u.telephone = m.telephone WHERE u.user_id = ? | 支持 MySQL INNER JOIN、CROSS JOIN、STRAIGHT_JOIN、NATURAL JOIN、NATURAL LEFT JOIN、NATURAL RIGHT JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN 等关联类型 |
SELECT * FROM t_user u INNER JOIN t_merchant m USING (telephone) INNER JOIN t_order USING (user_id) WHERE u.user_id = ? | 支持使用 ON/USING 或者 NATURAL JOIN 等关联条件 |
SELECT COUNT(DISTINCT user_id) FROM t_user u WHERE user_id = ? GROUP BY telephone | 支持 MySQL GROUP BY 语句中包含加密列 |
SELECT * FROM t_user WHERE user_name > ? | 支持使用特定算法下加密列的大小比较 |
SELECT * FROM t_user WHERE user_id between ? and ? | 支持使用特定算法下加密列的范围查询 |
SELECT * FROM t_user ORDER BY user_name | 支持使用特定算法下加密列的排序 |
- DML 语句——INSERT
SQL 示例 | 说明 |
---|---|
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) VALUES (?, ?, ?, ?, ?, ‘2017-08-08’) | 支持简单 INSERT VALUES 语句加密改写 |
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) SELECT 40, user_name, password, email, telephone, creation_date FROM t_user WHERE user_id = ? | 支持 INSERT SELECT 加密改写,源表和目标表的加密列需要使用相同的加密算法 |
- DML 语句——UPDATE
SQL 示例 | 说明 |
---|---|
UPDATE t_user SET password = ? WHERE user_id = ? | 支持简单 UPDATE 语句加密改写 |
- DML 语句——DELETE
SQL 示例 | 说明 |
---|---|
DELETE FROM t_user t WHERE t.password IN (?) | 支持简单 DELETE 语句加密改写 |
Oracle #
- DML 语句——SELECT
SQL 示例 | 说明 |
---|---|
SELECT user_id, u.* FROM t_user u WHERE u.user_id = ? | 支持简单查询的查询星号展开 |
SELECT * FROM t_user u FULL OUTER JOIN t_order o ON u.user_id = o.user_id FULL OUTER JOIN t_order_item i ON o.order_id = i.order_id WHERE u.user_id = ? | 支持关联查询的查询星号展开 |
SELECT temp.* FROM (SELECT COUNT(user_id), MAX(user_id), MAX(user_id) + 1, (SELECT 1 + 1 FROM DUAL) FROM t_user WHERE user_id = ? GROUP BY user_id) temp | 支持子查询的查询星号展开 |
SELECT temp.* FROM (SELECT COUNT(user_id) AS user_id_count, MAX(user_id) AS user_id_max, MAX(user_id) + 1 AS user_id_expression_max, (SELECT 1 + 1 FROM DUAL) AS subquery_expression FROM t_user WHERE user_id = ? GROUP BY user_id) temp | 支持简单查询、关联查询、子查询组合场景下的复杂查询星号展开 |
SELECT u.user_id, (SELECT user_name FROM t_user WHERE ROWNUM <= 1) FROM t_user u WHERE u.user_id = ? | 支持 Projection 子查询 |
SELECT * FROM (SELECT * FROM t_user) WHERE user_id = ? | 支持 Table 子查询和 Join 子查询 |
SELECT u.* FROM t_user u WHERE u.user_name = (SELECT user_name FROM t_user WHERE user_id = ?) | 支持 Predicate 子查询 |
SELECT * FROM t_user u LEFT OUTER JOIN t_merchant m USING (telephone) LEFT OUTER JOIN t_order USING (user_id) WHERE user_id = ? | 支持 Oracle INNER JOIN、CROSS JOIN、NATURAL JOIN、NATURAL LEFT JOIN、NATURAL RIGHT JOIN、FULL OUTER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN 等关联类型 |
SELECT * FROM t_user u NATURAL JOIN t_merchant m WHERE u.user_id = ? | 支持使用 ON/USING 或者 NATURAL JOIN 等关联条件 |
SELECT COUNT(user_id), MAX(user_id), MAX(user_id) + 1, (SELECT 1 + 1 FROM DUAL) FROM t_user WHERE user_id = ? GROUP BY telephone | 支持 Oracle GROUP BY 语句中包含加密列 |
SELECT * FROM t_user u WHERE u.user_id = ? FOR UPDATE OF u.telephone, u.user_id | 支持 Oracle SELECT FOR UPDATE column 加密 |
SELECT * FROM t_user WHERE user_name > ? | 支持使用特定算法下加密列的大小比较 |
SELECT * FROM t_user WHERE user_id between ? and ? | 支持使用特定算法下加密列的范围查询 |
SELECT * FROM t_user ORDER BY user_name | 支持使用特定算法下加密列的排序 |
SELECT * FROM t_user u FULL OUTER JOIN t_order o ON u.user_id > o.user_id FULL OUTER JOIN t_order_item i ON o.order_id < i.order_id WHERE u.user_id = ? | JOIN 查询中的关联列使用 >、>=、<、<= 等比较运算符进行关联查询(待实现) |
- DML 语句——INSERT
SQL 示例 | 说明 |
---|---|
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) VALUES (?, ?, ?, ?, ?, DATE ‘2017-08-08’) | 支持简单 INSERT VALUES 语句加密改写 |
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) SELECT 40, user_name, password, email, telephone, creation_date FROM t_user WHERE user_id = ? | 支持 INSERT SELECT 加密改写,源表和目标表的加密列需要使用相同的加密算法 |
INSERT ALL INTO t_user (user_id, user_name, password, email, telephone, creation_date) VALUES (?, ?, ?, ?, ?, DATE ‘2017-08-08’) INTO t_merchant (merchant_id, country_id, merchant_name, business_code, telephone, creation_date) VALUES (?, ?, ?, ?, ?, DATE ‘2017-08-08’) SELECT * FROM DUAL | 支持 INSERT ALL VALUES 批量插入语句加密改写 |
INSERT ALL WHEN creation_date < DATE ‘2017-08-08’ THEN INTO t_user (user_id, user_name, password, email, telephone, creation_date) WHEN creation_date = DATE ‘2017-08-08’ THEN INTO t_user (user_id, user_name, password, email, telephone, creation_date) ELSE INTO t_user (user_id, user_name, password, email, telephone, creation_date) SELECT user_id + 2, user_name, password, email, telephone, creation_date FROM t_user WHERE user_id >= ? | 支持 INSERT ALL 条件插入语句加密改写,条件表达式中不支持加密列运算 |
DML 语句——UPDATE
SQL 示例 说明 UPDATE t_user SET password = ? WHERE user_id = ? 支持简单 UPDATE 语句加密改写 DML 语句——DELETE
SQL 示例 说明 DELETE FROM t_user t WHERE t.password IN (?) 支持简单 DELETE 语句加密改写 DML 语句——MERGE
SQL 示例 说明 MERGE INTO t_user t1 USING t_user_bak t2 ON (t1.id = t2.id) WHEN MATCHED THEN UPDATE SET t1.password = t2.password, t1.status = ? DELETE WHERE t1.status = ? WHEN NOT MATCHED THEN INSERT (t1.password, t1.status) VALUES (t2.password, t2.status) 支持简单 MERGE 语句加密改写,目标表和源表的加密算法需要保持一致,如果源表是子查询,那么仅支持对于子查询的加密
不支持的常用 SQL 列表 #
MySQL #
- DML 语句——SELECT
SQL 示例 | 说明 |
---|---|
- | 不支持 Projection 子查询、Table 子查询、Join 子查询、Predicate 子查询和 Insert Select 子查询之外的子查询加密改写 |
SELECT * FROM t_user u INNER JOIN t_merchant m USING (telephone) INNER JOIN t_order USING (user_id) WHERE u.user_id = ? | 不支持 JOIN 查询中的关联列(包括 On、Using、Natural Join 和 Where 中使用的关联列)使用不同的加密算法 |
SELECT * FROM t_user u INNER JOIN t_merchant m ON u.telephone > m.telephone WHERE u.user_id = ? | 不支持 JOIN 查询中的关联列使用 >、>=、<、<= 等比较运算符进行关联查询 |
- DML 语句——INSERT
SQL 示例 | 说明 |
---|---|
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) SELECT 40, ‘zhangsan’, ‘123456’, ‘11@qq.com’, ‘12345678901’, NOW() | 不支持 INSERT SELECT 中 SELECT 常量进行加密 |
- DML 语句——UPDATE
SQL 示例 | 说明 |
---|---|
- | 不支持 UPDATE JOIN 加密改写 |
- DML 语句——DELETE
SQL 示例 | 说明 |
---|---|
- | 不支持 DELETE JOIN 加密改写 |
Oracle #
- DML 语句——SELECT
SQL 示例 | 说明 |
---|---|
- | 不支持 Projection 子查询、Table 子查询、Join 子查询、Predicate 子查询和 Insert Select 子查询之外的子查询加密改写 |
SELECT * FROM t_user u LEFT OUTER JOIN t_merchant m USING (telephone) LEFT OUTER JOIN t_order USING (user_id) WHERE user_id = ? | 不支持 JOIN 查询中的关联列(包括 On、Using、Natural Join 和 Where 中使用的关联列)使用不同的加密算法 |
- DML 语句——INSERT
SQL 示例 | 说明 |
---|---|
INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) SELECT 40, ‘zhangsan’, ‘123456’, ‘11@qq.com’, ‘12345678901’, NOW() FROM DUAL | 不支持 INSERT SELECT 中 SELECT 常量进行加密 |
- DML 语句——UPDATE
SQL 示例 | 说明 |
---|---|
- | 不支持 UPDATE JOIN 加密改写 |
- DML 语句——DELETE
SQL 示例 | 说明 |
---|---|
- | 不支持 DELETE JOIN 加密改写 |
- DML 语句——MERGE
SQL 示例 | 说明 |
---|---|
- | 不支持 MERGE 目标表和原表加密配置不一致或者源表是子查询、目标表需要加密的场景 |