语法清单 #
| 语法 | 描述 | 类型 |
|---|---|---|
| CREATE ENCRYPT RULE | 创建加密规则 | RDL |
| ALTER ENCRYPT RULE | 修改加密规则 | RDL |
| DROP ENCRYPT RULE | 删除加密规则 | RDL |
| SHOW ENCRYPT RULES | 查看加密规则 | RQL |
| select [,string] … [,] decrypt({tableName}, {encryptColumn}, {encryptValue}), [,string] … | 查询解密结果 | RQL |
1. 创建加密规则 #
CreateEncryptRule ::=
'CREATE' 'ENCRYPT' 'RULE' ifNotExists? encryptDefinition (',' encryptDefinition)* (',' queryWithPlainOrCipher)?
ifNotExists ::=
'IF' 'NOT' 'EXISTS'
encryptDefinition ::=
ruleName '(' 'COLUMNS' '(' columnDefinition (',' columnDefinition)* ')' (',' queryWithPlainOrCipher)? ')'
columnDefinition ::=
'(' 'NAME' '=' columnName (',' 'DATA_TYPE' '=' dataType)? (',' 'PLAIN' '=' plainColumnName)? ',' 'CIPHER' '=' cipherColumnName (',' 'CIPHER_DATA_TYPE' '=' dataType)? (',' 'ASSISTED_QUERY' '=' assistedQueryColumnName (',' 'ASSISTED_QUERY_DATA_TYPE' '=' dataType)?)? (',' 'LIKE_QUERY' '=' likeQueryColumnName (',' 'LIKE_QUERY_DATA_TYPE' '=' dataType)?)? ',' encryptAlgorithmDefinition (',' assistedQueryAlgorithmDefinition)? (',' likeQueryAlgorithmDefinition)? (',' queryWithPlainOrCipher)? ')'
encryptAlgorithmDefinition ::=
'ENCRYPT_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
assistedQueryAlgorithmDefinition ::=
'ASSISTED_QUERY_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
likeQueryAlgorithmDefinition ::=
'LIKE_QUERY_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
propertiesDefinition ::=
'PROPERTIES' '(' key '=' value (',' key '=' value)* ')'
queryWithPlainOrCipher ::=
: ('QUERY_WITH_CIPHER_COLUMN' | 'QUERY_WITH_PLAIN') '=' ('TRUE' | 'FALSE')
;
tableName ::=
identifier
columnName ::=
identifier
dataType ::=
string
plainColumnName ::=
identifier
cipherColumnName ::=
identifier
assistedQueryColumnName ::=
identifier
likeQueryColumnName ::=
identifier
encryptAlgorithmType ::=
string
key ::=
string
value ::=
literal
参数说明
| 名称 | 数据类型 | 说明 |
|---|---|---|
| tableName | IDENTIFIER | 表名称 |
| columnName | IDENTIFIER | 逻辑列名称 |
| DATA_TYPE | IDENTIFIER | 逻辑列数据类型 |
| PLAIN | IDENTIFIER | 明文列名称 |
| CIPHER | IDENTIFIER | 加密列名称 |
| CIPHER_DATA_TYPE | IDENTIFIER | 加密列数据类型 |
| ASSISTED_QUERY_COLUMN | IDENTIFIER | 辅助查询列 1.5.0 前参数,已做兼容,目前可用 |
| ASSISTED_QUERY | IDENTIFIER | 辅助查询列 1.5.0 后参数,推荐使用 |
| ASSISTED_QUERY_DATA_TYPE | IDENTIFIER | 辅助查询列数据类型 |
| LIKE_QUERY_COLUMN | IDENTIFIER | 模糊查询列 1.5.0 前参数,已做兼容,目前可用 |
| LIKE_QUERY | IDENTIFIER | 模糊查询列 1.5.0 后参数,推荐使用 |
| LIKE_QUERY_DATA_TYPE | IDENTIFIER | 模糊查询列数据类型 |
| ENCRYPT_ALGORITHM | STRING | 加密算法名称 |
| ASSISTED_QUERY_ALGORITHM | STRING | 辅助查询算法 |
| LIKE_QUERY_ALGORITHM | STRING | 模糊查询算法 |
PLAIN指定明文数据列,CIPHER指定密文数据列,创建加密规则后,Proxy 将禁止对明文列、密文列进行除 ADD COLUMN 外的 DDL 操作encryptAlgorithmType指定加密算法类型,请参考 加密算法- 重复的
tableName将无法被创建 QUERY_WITH_CIPHER_COLUMN使用密文列查询:支持大写或小写的 true 或 false,支持表级别和列级别以及全局级别的设置,与QUERY_WITH_PLAIN互斥QUERY_WITH_PLAIN使用明文列查询:支持大写或小写的 true 或 false,支持表级别和列级别以及全局级别的设置,与QUERY_WITH_CIPHER_COLUMN互斥ASSISTED_QUERY辅助查询列:不能与逻辑列重名,在用户的 CIPHER (加密字段)以及对应的加密算法无法支持查询时,可以配置该字段用来辅助查询。例如用户配置的加密算法对于同一个值进行多次加密的结果不同,那么就无法使用 CIPHER (加密字段)进行查询,这时候就需要使用辅助查询列进行查询。辅助查询列对应的算法一般可以使用不可逆的算法,但是对于同一个值进行多次加密的结果需要相同LIKE_QUERY模糊查询列:不能与逻辑列重名,用于帮助用户进行 like 查询时使用的列。一般 CIPHER (加密字段) 配置的算法无法支持 like 查询,所以当用户需要使用 like查询时,需要配置模糊查询列以及对应的模糊查询算法ASSISTED_QUERY_ALGORITHM辅助查询算法:即辅助查询列对应的算法。一般是不可逆,并且多次加密结果一致的算法LIKE_QUERY_ALGORITHM模糊查询算法:即模糊查询列对应的算法,可以支持 like 查询的算法
示例
创建数据加密规则
CREATE ENCRYPT RULE t_encrypt (
COLUMNS (
(
NAME=merchant_name, DATA_TYPE='varchar(20)',
PLAIN=merchant_name_plain,
CIPHER=merchant_name_cipher, CIPHER_DATA_TYPE='varchar(100)',
ASSISTED_QUERY=merchant_name_assisted, ASSISTED_QUERY_DATA_TYPE='varchar(100)',
LIKE_QUERY=merchant_name_like, LIKE_QUERY_DATA_TYPE='varchar(50)',
ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc'))),
ASSISTED_QUERY_ALGORITHM(TYPE(NAME='MD5',PROPERTIES('salt'='121212'))),
LIKE_QUERY_ALGORITHM(TYPE(NAME='CHAR_DIGEST_LIKE',PROPERTIES('delta'='2'))), QUERY_WITH_CIPHER_COLUMN=true
)
), QUERY_WITH_PLAIN=true
);
使用 ifNotExists 子句创建数据加密规则
CREATE ENCRYPT RULE IF NOT EXISTS t_encrypt (
COLUMNS (
(
NAME=merchant_name, DATA_TYPE='varchar(20)',
PLAIN=merchant_name_plain,
CIPHER=merchant_name_cipher, CIPHER_DATA_TYPE='varchar(100)',
ASSISTED_QUERY=merchant_name_assisted, ASSISTED_QUERY_DATA_TYPE='varchar(100)',
LIKE_QUERY=merchant_name_like, LIKE_QUERY_DATA_TYPE='varchar(50)',
ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc'))),
ASSISTED_QUERY_ALGORITHM(TYPE(NAME='MD5',PROPERTIES('salt'='121212'))),
LIKE_QUERY_ALGORITHM(TYPE(NAME='CHAR_DIGEST_LIKE',PROPERTIES('delta'='2'))), QUERY_WITH_CIPHER_COLUMN=true
)
), QUERY_WITH_PLAIN=true
);
2. 修改加密规则 #
ALTEREncryptRule ::=
'ALTER' 'ENCRYPT' 'RULE' encryptDefinition (',' encryptDefinition)* (',' queryWithPlainOrCipher)?
encryptDefinition ::=
ruleName '(' 'COLUMNS' '(' columnDefinition (',' columnDefinition)* ')' (',' queryWithPlainOrCipher)? ')'
columnDefinition ::=
'(' 'NAME' '=' columnName (',' 'DATA_TYPE' '=' dataType)? (',' 'PLAIN' '=' plainColumnName)? ',' 'CIPHER' '=' cipherColumnName (',' 'CIPHER_DATA_TYPE' '=' dataType)? (',' 'ASSISTED_QUERY' '=' assistedQueryColumnName (',' 'ASSISTED_QUERY_DATA_TYPE' '=' dataType)?)? (',' 'LIKE_QUERY' '=' likeQueryColumnName (',' 'LIKE_QUERY_DATA_TYPE' '=' dataType)?)? ',' encryptAlgorithmDefinition (',' assistedQueryAlgorithmDefinition)? (',' likeQueryAlgorithmDefinition)? (',' queryWithPlainOrCipher)? ')'
encryptAlgorithmDefinition ::=
'ENCRYPT_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
assistedQueryAlgorithmDefinition ::=
'ASSISTED_QUERY_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
likeQueryAlgorithmDefinition ::=
'LIKE_QUERY_ALGORITHM' '(' 'TYPE' '(' 'NAME' '=' encryptAlgorithmType (',' propertiesDefinition)? ')'
propertiesDefinition ::=
'PROPERTIES' '(' key '=' value (',' key '=' value)* ')'
queryWithPlainOrCipher ::=
: ('QUERY_WITH_CIPHER_COLUMN' | 'QUERY_WITH_PLAIN') '=' ('TRUE' | 'FALSE')
;
tableName ::=
identifier
columnName ::=
identifier
dataType ::=
string
plainColumnName ::=
identifier
cipherColumnName ::=
identifier
assistedQueryColumnName ::=
identifier
likeQueryColumnName ::=
identifier
encryptAlgorithmType ::=
string
key ::=
string
value ::=
literal
参数说明
| 名称 | 数据类型 | 说明 |
|---|---|---|
| tableName | IDENTIFIER | 表名称 |
| columnName | IDENTIFIER | 逻辑列名称 |
| DATA_TYPE | IDENTIFIER | 逻辑列数据类型 |
| PLAIN | IDENTIFIER | 明文列名称 |
| CIPHER | IDENTIFIER | 加密列名称 |
| CIPHER_DATA_TYPE | IDENTIFIER | 加密列数据类型 |
| ASSISTED_QUERY_COLUMN | IDENTIFIER | 辅助查询列 1.5.0 前参数,已做兼容,目前可用,等同于 ASSISTED_QUERY |
| ASSISTED_QUERY | IDENTIFIER | 辅助查询列 1.5.0 后参数,推荐使用,等同于 ASSISTED_QUERY_COLUMN |
| ASSISTED_QUERY_DATA_TYPE | IDENTIFIER | 辅助查询列数据类型 |
| LIKE_QUERY_COLUMN | IDENTIFIER | 模糊查询列 1.5.0 前参数,已做兼容,目前可用,等同于 LIKE_QUERY |
| LIKE_QUERY | IDENTIFIER | 模糊查询列 1.5.0 后参数,推荐使用,等同于 LIKE_QUERY_COLUMN |
| LIKE_QUERY_DATA_TYPE | IDENTIFIER | 模糊查询列数据类型 |
| ENCRYPT_ALGORITHM | STRING | 加密算法名称 |
| ASSISTED_QUERY_ALGORITHM | STRING | 辅助查询算法 |
| LIKE_QUERY_ALGORITHM | STRING | 模糊查询算法 |
PLAIN指定明文数据列,CIPHER指定密文数据列,创建加密规则后,Proxy 将禁止对明文列、密文列进行除 ADD COLUMN 外的 DDL 操作encryptAlgorithmType指定加密算法类型,请参考 加密算法- 重复的
tableName将无法被创建 QUERY_WITH_CIPHER_COLUMN使用密文列查询:支持大写或小写的 true 或 false,支持表级别和列级别以及全局级别的设置,与QUERY_WITH_PLAIN互斥QUERY_WITH_PLAIN使用明文列查询:支持大写或小写的 true 或 false,支持表级别和列级别以及全局级别的设置,与QUERY_WITH_CIPHER_COLUMN互斥ASSISTED_QUERY辅助查询列:不能与逻辑列重名,在用户的 CIPHER (加密字段)以及对应的加密算法无法支持查询时,可以配置该字段用来辅助查询。例如用户配置的加密算法对于同一个值进行多次加密的结果不同,那么就无法使用 CIPHER (加密字段)进行查询,这时候就需要使用辅助查询列进行查询。辅助查询列对应的算法一般可以使用不可逆的算法,但是对于同一个值进行多次加密的结果需要相同LIKE_QUERY模糊查询列:不能与逻辑列重名,用于帮助用户进行 like 查询时使用的列。一般 CIPHER (加密字段) 配置的算法无法支持 like 查询,所以当用户需要使用 like查询时,需要配置模糊查询列以及对应的模糊查询算法ASSISTED_QUERY_ALGORITHM辅助查询算法:即辅助查询列对应的算法。一般是不可逆,并且多次加密结果一致的算法LIKE_QUERY_ALGORITHM模糊查询算法:即模糊查询列对应的算法,可以支持 like 查询的算法
示例
ALTER ENCRYPT RULE t_encrypt (
COLUMNS (
(
NAME=merchant_name, DATA_TYPE='varchar(20)',
PLAIN=merchant_name_plain,
CIPHER=merchant_name_cipher, CIPHER_DATA_TYPE='varchar(100)',
ASSISTED_QUERY=merchant_name_assisted, ASSISTED_QUERY_DATA_TYPE='varchar(100)',
LIKE_QUERY=merchant_name_like, LIKE_QUERY_DATA_TYPE='varchar(50)',
ENCRYPT_ALGORITHM(TYPE(NAME='AES',PROPERTIES('aes-key-value'='123456abc'))),
ASSISTED_QUERY_ALGORITHM(TYPE(NAME='MD5',PROPERTIES('salt'='121212'))),
LIKE_QUERY_ALGORITHM(TYPE(NAME='CHAR_DIGEST_LIKE',PROPERTIES('delta'='2'))), QUERY_WITH_CIPHER_COLUMN=true
)
), QUERY_WITH_PLAIN=true
);
3. 删除加密规则 #
示例
删除加密规则
DROP ENCRYPT RULE t_encrypt, t_encrypt_2;
使用 ifExists 删除加密规则
DROP ENCRYPT RULE IF EXISTS t_encrypt, t_encrypt_2;
4. 查看加密规则 #
SHOW ENCRYPT RULES [FROM databaseName]
示例
查询所有的数据加密规则
mysql> SHOW ENCRYPT RULES FROM encrypt_db;
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
| table | logic_column | logic_data_type | cipher_column | cipher_data_type | plain_column | plain_data_type | assisted_query_column | assisted_query_data_type | like_query_column | like_query_data_type | encryptor_type | encryptor_props | assisted_query_type | assisted_query_props | like_query_type | like_query_props | query_with_plain |
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
| t_merchant | merchant_name | varchar(20) | merchant_name_cipher | varchar(100) | merchant_name_plain | varchar(20) | merchant_name_assisted | varchar(100) | merchant_name_like | varchar(50) | AES | aes-key-value=123456abc | MD5 | salt=121212 | CHAR_DIGEST_LIKE | delta=2 | true |
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
1 rows in set (0.78 sec)
查询指定加密规则
示例
mysql> SHOW ENCRYPT TABLE RULE t_encrypt;
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
| table | logic_column | logic_data_type | cipher_column | cipher_data_type | plain_column | plain_data_type | assisted_query_column | assisted_query_data_type | like_query_column | like_query_data_type | encryptor_type | encryptor_props | assisted_query_type | assisted_query_props | like_query_type | like_query_props | query_with_plain |
| t_encrypt | merchant_name | varchar(20) | merchant_name_cipher | varchar(100) | merchant_name_plain | varchar(20) | merchant_name_assisted | varchar(100) | merchant_name_like | varchar(50) | AES | aes-key-value=123456abc | MD5 | salt=121212 | CHAR_DIGEST_LIKE | delta=2 | true |
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
2 rows in set (0.01 sec)
mysql> SHOW ENCRYPT TABLE RULE t_encrypt FROM encrypt_db;
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
| table | logic_column | logic_data_type | cipher_column | cipher_data_type | plain_column | plain_data_type | assisted_query_column | assisted_query_data_type | like_query_column | like_query_data_type | encryptor_type | encryptor_props | assisted_query_type | assisted_query_props | like_query_type | like_query_props | query_with_plain |
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
| t_encrypt | merchant_name | varchar(20) | merchant_name_cipher | varchar(100) | merchant_name_plain | varchar(20) | merchant_name_assisted | varchar(100) | merchant_name_like | varchar(50) | AES | aes-key-value=123456abc | MD5 | salt=121212 | CHAR_DIGEST_LIKE | delta=2 | true |
+------------+---------------+-----------------+----------------------+------------------+---------------------+-----------------+------------------------+--------------------------+--------------------+----------------------+----------------+-------------------------+---------------------+----------------------+------------------+------------------+--------------------------+
2 rows in set (0.01 sec))
输出说明
| 列 | 说明 |
|---|---|
| table | 逻辑表名 |
| logic_column | 逻辑列名 |
| logic_data_type | 逻辑列数据类型 |
| cipher_column | 密文列名 |
| cipher_data_type | 密文列数据类型 |
| plain_column | 明文列名 |
| plain_data_type | 明文列数据类型 |
| assisted_query_column | 辅助查询列名 |
| assisted_query_data_type | 辅助查询列数据类型 |
| assisted_query_type | 辅助查询算法类型 |
| assisted_query_props | 辅助查询算参数 |
| like_query_column | 模糊查询列 |
| like_query_data_type | 模糊查询列数据类型 |
| like_query_type | 模糊查询算法类型 |
| like_query_props | 模糊查询算参数 |
| encryptor_type | 加密算法类型 |
| encryptor_props | 加密算法参数 |
| query_with_plain | 是否使用明文列进行查询 |
5. 查询解密结果 #
select 用法一致,提供 decrypt() 函数,tableName 为需要解密的表,encryptColumn 为需要解密的列, encryptValue 为需要解密的真实值。使用时需要配置对应的加密规则。
select [,string] … [,] decrypt({tableName}, {encryptColumn}, {encryptValue}), [,string] …
示例
SELECT 'Lm04PRW+sp+mG/QuimAUew==', decrypt(t_user, pwd_cipher, 'Lm04PRW+sp+mG/QuimAUew==') UNION SELECT 'XXX', decrypt(t_user, pwd_cipher, 'XXX');