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

news2024/11/24 8:32:20

背景

蔚来被勒索 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框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dpdk编译

ubuntu网卡信息配置 虚拟机中除去最开始的一块网卡,再另外添加两块网卡,如下图所示 修改Ubuntu20_x64.vmx里面的配置信息 将ethernet0.virtualDev "e1000"里面的e1000更改成vmxnet3,因为e1000只支持网卡单队列,vmxnet3支持网卡对…

5G无线技术基础自学系列 | 5G移动性KPI

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G移动类KPI用来评估NR网络的移动性能&…

29. 如何通过 ABAP 代码给 SAP OData 元数据增添注解

笔者的这篇 SAP UI5 开发教程文章,* SAP UI5 应用开发教程之一百二十九 - 如何给 SAP UI5 SmartField 添加 Value Help 功能,有朋友留言: 你好,请教一个问题,请问如何在odata里面通过annotations添加一个自定义注解&am…

2022年哪些工具适合设计企业产品手册?

产品手册是什么? 产品手册是因特网发展的成果,是一种以移动端为基础进行在线营销的新内容,其中包含了对原有的纸质商品、小册子、促销软文、邀请函等现有促销资料进行数字化的更新。 产品手册是从传统的纸质公司样本书中升级而来的&#xf…

Git 入门

文章目录0. 前言学习目标参考教程链接1. Git概念1.1 什么是Git1.2 Git 的下载1.3 Git三大区域1.4 远程仓库2. Git的使用2.1 图形化操作2.1.1 IDEA图形化操作2.1.2 GitKraken(可选)2.2 命令行操作2.2.1 Git 配置2.2.2 分支命令2.2.3 拉取与推送3. 总结0. 前言 学习目标 了解 G…

面试官:你来说一下Spring IOC容器的创建过程

这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程,相对来说比较简单。 不 BB,上文章目录。 1. 基础知识 1.1 什么是 Spring IOC ? IOC 不是一种技术,只是…

数据结构抽象数据类型的表示和实现

抽象数据类型(Abstract Data Type,ADT)是指一个数学模型以及定义在此数学模型上的一组操作。例如,“整数”是一个抽象数据类型,其数学特性和具体的计算机或语言无关。“抽象”的意义在于强调数据类型的数学特性。抽象数据类型和数据类型实质上…

Halcon常用算子(库函数)整理

目录一. 常规操作类1.1 tuple_length()1.2 tuple_find_first()1.3 tuple_gen_const()二. 机器视觉操作类2.1 read_image()2.2 get_image_size()2.3 intensity()2.4 zoom_image_factor()2.5 median_image()2.6 Gauss_filter()2.7 fft_generic()2.8 convol_fft()2.9 sub_image()2…

大白话给你讲明白数据仓库

数据仓库的本质就是完成从面向业务过程数据的组织管理到面向业务分析数据的组织和管理的转变过程。 数据仓库类比粮食仓库 业务过程数据的组织管理实际上就是由各种业务系统来完成的,比如ERP、CRM、OA等各类业务系统,解决的是基本的业务流程管理。通过…

PS的安装、背景、背景练习、雪碧图、线性渐变、径向渐变、电影卡片练习——06fontbackground

目录 一、PS的安装 二、背景(background-color、background-image、 background-repeat、background-position、background-clip、background-origin、background-size、background-attachment) 三、背景练习(背景重复—导航条的背景颜色是渐变的) 四、背景练习&#xff08…

【数据结构】深度讲解栈、栈的应用举例、栈和递归的实现教你全面认识栈

目录一.栈1.栈的概念及结构2.栈的实现stack.hStack.c二.栈的应用举例1.数制转换2.有效的括号3.迷宫求解三.栈与递归的实现1.栈和递归2.迷宫问题递归实现3.汉诺塔栈实现一.栈 入栈出栈展示: 1.栈的概念及结构 栈:一种特殊的线性表,其只允许…

【Web开发】Python实现Web服务器(Ubuntu下安装Flask)

🍺基于Python的Web服务器系列相关文章编写如下🍺: 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)&a…

【ESP32+freeRTOS学习笔记-(三)任务】

目录1、任务相关基本概念1.1 任务函数原型1.2 任务句柄TaskHandle_t 及任务控制块TCB_t1.3 任务状态1.4 优先级(Task Priorities)2 创建任务2.1 xTaskCreate2.2 xTaskCreateStatic()3 延迟函数使任务进入阻塞状态vTaskDelay()函数vTaskDelayUntil()函数4…

【C++初阶】vector的模拟实现

文章目录vector的介绍vector的模拟实现成员变量Member functionsconstructor(构造函数)destructor(析构函数)operatorIteratorsbeginendCapacitysizecapacityreserveresizeElement accessoperator[]Modifierspush_backpop_backins…

手办商城系统|Springboot+vue+ElementUI手办商城系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

C语言重点解剖预处理要点速记

1.宏定义字符串的时候一定要带上双引号。 2.程序的翻译,就是把文本代码翻译成二进制代码。分为4个阶段,即预处理,编译,汇编,链接。 3.预处理:头文件展开,去注释,宏替换&#xff0c…

基于Spring cloud + vue 的前后端分离的社团管理系统,数据库采用MYSQL,前端使用 VUE + element

背景 因学校没有成熟的社团管理系统,一为满足学校需求, 其次开源的社团管理项目,多为mvc ssm框架 很少有前后端分离的微服务框架,为了科技的发展, 更好学习解决高并发问题,也为了更好地掌握锤炼新技术&…

Web前端:广州蓝景实训

0基础也能学,5个月的课程时间,从小白到就业课程内容紧贴市场就业要求。广州蓝景前端实训课程,6年时间培养出过千名工程师,成功就业。今天就跟大家分享,蓝景学员的学习体验流程: 一、前端技术学习 1、授课…

3.Kafka

1.定义 1.1传统定义 Kafka是一个分布式的基于发布订阅模式的消息队列,主要应用于大数据的实时处理领域发布订阅:消息发布者不会直接将消息发送给订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息 1.2最新定义 …

计算机网络期末重点考点总复习

第三章数据链路层 CRC检验问题 知识点 例题 要发送的数据为1101011011。采用CRC的生成多项式是 P(X)X^4 X 1试求应添加在数据后面的余数。数据在传输过程中最后一个1变成了0,问接收端能否发现? 若数据在传输过程中最后两个1都变成了0,问接…