Logo
数据加密

数据加密 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 目标表和原表加密配置不一致或者源表是子查询、目标表需要加密的场景