MySql加密存储的数据,如何模糊搜索?

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySql加密存储的数据,如何模糊搜索?

背景

蔚来被勒索 225 万美元,大量数据遭泄露!


根据网络上流传的截图显示,黑客似乎掌握着蔚来内部员工数据 22800 条、车主用户身份证数据 399000 条、用户地址数据 6500000 条、注册用户数据 4850000 条、企业及企业代表联系人数据 10000 条、订单数据 490000 条、退单数据 90000 条,出售的金额以 0.1-0.25 比特币不等。


蔚来公司和蔚来创始人李斌也都出来道歉,并承诺对因本次事件给用户造成的损失承担责任。

数据安全


现在企业都已经数字化办公了,在提升效率的同时,数据安全也是重中之重,很多公司为了追求效率,却忽略安全这方面的工作。从上面的报告看,蔚来这次泄露的数据包含:用户身份证、地址,这些数据保密级别都是最高的,在数据库存储也应该要加密存储。


而加密存储就涉及以下几个问题:


1、加密存储的方式;


2、加密存储后,数据如何展示;


3、加密存储如何模糊搜索。


今天就给大家分享下,MySql数据加密的解决方案、以及如何解决以上的问题。

Mysql加密方案

Mysql本身自带的加密方法,分为2种:

1、不可逆加密算法:

PASSWORD,ENCRYPT,MD5,SHA。

2、可逆的加密算法:


AES_ENCRYPT、AES_DECRYPT 和 ENCODE、DECODE。


以上两组分别为可逆的加解密函数,都是返回一个二进制字符串,要以BLOB类型存储。不过ENCODE与DECODE,在MySql 5.7后已经取消,并且安全性比较低,建议不要采用。


在项目开发中,比如密码等少量的数据,不涉及显示和搜索的业务需求,可以采用不可逆加密,但大部分数据,我们还是需要采用可逆的加密方式。

Mysql 加密存储

下面我们以AES_ENCRYPT、AES_DECRYPT 为例子,来介绍下如何解决,数据加密存储与查询。

1、创建表

首先先创建一张表,只有一个字段data,用来存储解密后的数据,sql语句如下:

CREATE TABLE `tab_aes` (`data` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci')COMMENT='数据加密存储表'COLLATE='utf8_general_ci'ENGINE=InnoDB;

2、插入数据

通过Sql语句插入加密的数据,1ql语句如下:

INSERT INTO tab_aes 
VALUES( TO_BASE64( AES_ENCRYPT('要加密的内容','秘钥') ) );


TO_BASE64函数把加密的二进制转换为Base64,方便我们查看。


插入的结果如下:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cydETQM-1671712236301)(https://mmbiz.qpic.cn/sz_mmbiz_png/tJJDa2wmJiapJMlo01Tr0vjlrj8G49MZHrtkCQ0YJNicvPBPZqQqU6whxA1r1UWjZoeXVZ2I9knWNvXeyHxJSVdQ/640?wx_fmt=png)]

3、查询返回解密数据

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘钥') AS CHAR CHARACTER SET utf8 ) 
FROM  tab_aes

解密后,要用CAST把字符串编码转为UTF8,否则返回是乱码。

模糊搜索

数据加密存储与解密数据,这些都没有太大问题,加密存储产生最大的问题,就是模糊搜索,关于模糊搜索有以下方案:


1、数据预加载至内存数据库

此方案是程序启动的时候,预先把数据库的数据解密,并加载至内存中,比如采用MongoDB,此方案存在的优缺点如下:

优点:


数据安全,查询性能速度快


缺点:


服务器占用内存大;


数据表无法关联查询;


内存数据与数据库要实时保存一致,需要额外工作量。


2、程序实时加载数据,并解密处理


此方案是,用户触发请求的时候,程序实时加载并解密,保存至内存,虽然此方案解决了与数据库同步的问题,但也存在其他问题,此方案优缺点如下:


优点:


数据安全,查询性能速度快、数据处理灵活。


缺点:


服务器内存不可控,瞬间内存容易飙升,可能导致服务器不稳定;


数据表无法关联查询。


3、在Sql语句处理模糊搜索


如果数据量比较少,以上两种方案可能不会产生太大的影响,但对于大多数项目以上两种方案还是不靠谱的。


在Sql语句处理模糊搜索,也有以下几种方案:3.1、实时解密搜索

直接在数据库端,把加密的数据解密。

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘钥') AS CHAR CHARACTER SET UTF8 ) 
FROM  tab_aes
WHERE
CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘钥') AS CHAR CHARACTER SET UTF8 ) LIKE '要加密%'

优点

搜索灵活

缺点:

无法利用索引,搜索性能慢;

数据需要先解密,导致性能慢。

3.2、字段冗余存储

我们都知道MySql模糊搜索,只有当匹配开头、或者匹配结尾的时候,索引才会生效。所以我们可以扩展一个字段,用来存储开头和结尾加密后的数据。


创建表sql语句如下,新增一个字段data_ext,并建立索引:

CREATE TABLE `tab_aes` (
`data` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`data_ext` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
INDEX `data_ext` (`data_ext`) USING BTREE
)
COMMENT='数据加密存储表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


比如,要加密的内容为:123456789,字段data_ext取字段data,开头和结尾3个字符存储,储存格式为:AES(123) , AES(789),插入数据的sql语句如下:

INSERT INTO tab_aes  VALUES( TO_BASE64( AES_ENCRYPT('要加密的内容','秘钥')), 
CONCAT(TO_BASE64( AES_ENCRYPT('要加密','秘钥')), ',', TO_BASE64( AES_ENCRYPT('内容','秘钥')))
);

存储结果如下:


相应的模糊搜索sql语句如下:

SELECT CAST( AES_DECRYPT( FROM_BASE64(tab_aes.data), '秘钥') AS CHAR CHARACTER SET UTF8 )  FROM tab_aesWHEREtab_aes.data_ext LIKE CONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘钥')),'%')AND tab_aes.data_ext LIKE CONCAT('%',TO_BASE64(AES_ENCRYPT(('内容'),'秘钥')))AND tab_aes.data_ext LIKE CONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘钥')),'%', TO_BASE64(AES_ENCRYPT('内容','秘钥')));


通过Explain分析结果,该查询sql语句索引是生效的。


此方案优点:

搜索性能高;

支持表关联搜索。

此方案也有以下缺点:

1、匹配字符数是固定,如果业务有变,需要重新更新数据库;

2、数据存储需要额外工作量;

3、冗余数据,需要额外的存储空间。

写在最后

任何一种方案都有其优点,也有它的局限性,但有一点的是,数据安全是最重要的,任何企业切不可只为了业务发展,而忽略安全的重要性。

好了,今天就分享到这边了,如果对您有帮助,欢迎点赞分享,谢谢!

- End -

推荐阅读

用C#自己动手写个操作系统,爽!

盘点5个C#实用的Word、PPT、Excel、Mail第三方库

一个C#开发的Windows远程桌面工具

盘点10个Web开发人员必备的最佳开发工具推荐

盘点10个.Net比较流行的开源的ORM框架


相关文章
|
14天前
|
SQL 关系型数据库 MySQL
MySQL 修改数据
MySQL 修改数据
|
2天前
|
分布式计算 DataWorks 关系型数据库
MaxCompute产品使用合集之可以使用什么方法将MySQL的数据实时同步到MaxCompute
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
7天前
|
SQL 关系型数据库 MySQL
Spring_jdbc数据连接池(mysql实现增、删、改、查)
Spring_jdbc数据连接池(mysql实现增、删、改、查)
16 0
|
7天前
|
关系型数据库 MySQL
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
10 0
|
2天前
|
缓存 关系型数据库 MySQL
mysql用in查询大量数据的方法
在MySQL中使用 IN 子句来查询大量数据时,性能可能会成为一个问题
|
2天前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据
|
2天前
|
SQL Java 关系型数据库
JDBC批量插入mysql数据
JDBC批量插入mysql数据
|
2天前
|
安全 算法 网络安全
网络安全与信息安全:保护数据,从了解漏洞到强化加密
【4月更文挑战第30天】在数字化时代,数据成为了新的货币。然而,随之而来的是不断增长的网络安全威胁。本文深入探讨了网络安全漏洞的本质、加密技术的最新进展以及如何培养强大的安全意识,旨在为读者提供一个全面的网络安全知识框架。通过分析常见的网络攻击手段和案例,文章强调了持续教育和技术创新在防御策略中的重要性。
|
2天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
15 2
|
2天前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之在DataWorks中,查看ODPS表的OSS对象如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
13 1