MySQL字段内容加解密使用性能验证
背景:
近期工作中遇到对MySQL表中内容安全要求,需要通过字段内容加密存储的方式来实现。
为真实测试,如有疑问,欢迎解惑。
有多种解决办法,可以通过中间件来实现、数据库层来实现,最终选择了AES对称加密的方式:Java加密数据进行保存,MySQL中解密进行范围查询的方式。
环境:MySQL 8.3版本
连接工具:DBeaver 22.3
测试方式:insert语句一个个新增;几个数据量节点进行单条新增、等于查询、大于小于范围查询
准备工作:
-- 建表语句
CREATE TABLE test_encryption (
id INT PRIMARY KEY,
data1 VARCHAR(255),
data2 VARCHAR(255)
);
-- 新增数据
INSERT INTO test_encryption (id,data) VALUES (1, AES_ENCRYPT('num000001', 'your_secret_key'),AES_ENCRYPT('code000001', 'your_secret_key'));
INSERT INTO test_encryption (id,data) VALUES (1, AES_ENCRYPT('num000002', 'your_secret_key'),AES_ENCRYPT('code000002', 'your_secret_key'));
....
INSERT INTO test_encryption (id,data) VALUES (1, AES_ENCRYPT('num400001', 'your_secret_key'),AES_ENCRYPT('code400001', 'your_secret_key'));
-- 查询单条语句
select * from test_encryption where AES_DECRYPT(data1, 'your_secret_key') = 'num000022' and AES_DECRYPT(data2, 'your_secret_key') = 'code000022'
-- 范围查询语句(大于号、小于号)
select * from test_encryption where
AES_DECRYPT(data1, 'your_secret_key') > 'num000022' and
AES_DECRYPT(data1, 'your_secret_key') < 'num020022' and
AES_DECRYPT(data2, 'your_secret_key') > 'code000022' and
AES_DECRYPT(data2, 'your_secret_key') < 'code020022'
共新增40w条数据,中间有部分时间DBeaver工具崩了,导致虽然新增但是无法查看具体时间,所以中间有17.3w~20w和34.6w~40w的新增数据过程。
“加密新增全部速度”:前面数据量一列展示的从多少数据到多少数据新增的时间;
“加密新增一条速度”:到达“数据量”一栏对应的最高值时单独新增一条数据的用时;
“解密查询一条数据速度”:到达“数据量”一栏对应的最高值时等于查询的速度;
“解密范围查速度”:到达“数据量”一栏对应的最高值时使用范围查询的速度;
测试结果如下:
数据量 | 加密新增全部速度(ms) | 加密新增一条速度(ms) | 解密查询一条数据速度(ms) | 解密范围查速度(ms) |
0~2w | 58600 | 3~4 | 31~41 | 31~41 |
2w~3w | 29713 | 3~4 | 42~52 | 31~41 |
3w~10w | 216508 | 3~4 | 111~145 | 31~41 |
17.3w~20w | 79599 | 3~4 | 225~245 | 45~56 |
34.6w~40w | 160911 | 4 | 445~465 | 90~105 |
我对结果有些疑惑,是因为我范围查限制的条件问题?还是mysql对加密函数的范围查有优化?总感觉查询一条应该比查询范围效率应该会高。