大家好,今天给各位分享mysql模糊搜索优化的一些知识,其中也会对MySql加密存储的数据进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。
根据网络上流传的截图显示,黑客似乎掌握着蔚来内部员工数据22800条、车主用户身份证数据399000条、用户地址数据6500000条、注册用户数据4850000条、企业及企业代表联系人数据10000条、订单数据490000条、退单数据90000条,出售的金额以0.1-0.25比特币不等。
蔚来公司和蔚来创始人李斌也都出来道歉,并承诺对因本次事件给用户造成的损失承担责任。
现在企业都已经数字化办公了,在提升效率的同时,数据安全也是重中之重,很多公司为了追求效率,却忽略安全这方面的工作。从上面的报告看,蔚来这次泄露的数据包含:用户身份证、地址,这些数据保密级别都是最高的,在数据库存储也应该要加密存储。
而加密存储就涉及以下几个问题:
今天就给大家分享下,MySql数据加密的解决方案、以及如何解决以上的问题。
Mysql本身自带的加密方法,分为2种:
1、不可逆加密算法:
2、可逆的加密算法:
AES_ENCRYPT、AES_DECRYPT和ENCODE、DECODE。
以上两组分别为可逆的加解密函数,都是返回一个二进制字符串,要以BLOB类型存储。不过ENCODE与DECODE,在MySql5.7后已经取消,并且安全性比较低,建议不要采用。
在项目开发中,比如密码等少量的数据,不涉及显示和搜索的业务需求,可以采用不可逆加密,但大部分数据,我们还是需要采用可逆的加密方式。
下面我们以AES_ENCRYPT、AES_DECRYPT为例子,来介绍下如何解决,数据加密存储与查询。
首先先创建一张表,只有一个字段data,用来存储解密后的数据,sql语句如下:
CREATETABLE`tab_aes`(`data`VARCHAR(250)NULLDEFAULTNULLCOLLATE'utf8_general_ci')COMMENT='数据加密存储表'COLLATE='utf8_general_ci'ENGINE=InnoDB;
2、插入数据
通过Sql语句插入加密的数据,1ql语句如下:
INSERTINTOtab_aes\nVALUES(TO_BASE64(AES_ENCRYPT('要加密的内容','秘钥')));
TO_BASE64函数把加密的二进制转换为Base64,方便我们查看。
3、查询返回解密数据
SELECTCAST(AES_DECRYPT(FROM_BASE64(tab_aes.data),'秘钥')ASCHARCHARACTERSETutf8)\nFROMtab_aes
解密后,要用CAST把字符串编码转为UTF8,否则返回是乱码。
数据加密存储与解密数据,这些都没有太大问题,加密存储产生最大的问题,就是模糊搜索,关于模糊搜索有以下方案:
1、数据预加载至内存数据库
此方案是程序启动的时候,预先把数据库的数据解密,并加载至内存中,比如采用MongoDB,此方案存在的优缺点如下:
内存数据与数据库要实时保存一致,需要额外工作量。
2、程序实时加载数据,并解密处理
此方案是,用户触发请求的时候,程序实时加载并解密,保存至内存,虽然此方案解决了与数据库同步的问题,但也存在其他问题,此方案优缺点如下:
数据安全,查询性能速度快、数据处理灵活。
服务器内存不可控,瞬间内存容易飙升,可能导致服务器不稳定;
3、在Sql语句处理模糊搜索
如果数据量比较少,以上两种方案可能不会产生太大的影响,但对于大多数项目以上两种方案还是不靠谱的。
在Sql语句处理模糊搜索,也有以下几种方案:
3.1、实时解密搜索
直接在数据库端,把加密的数据解密。
SELECTCAST(AES_DECRYPT(FROM_BASE64(tab_aes.data),'秘钥')ASCHARCHARACTERSETUTF8)\nFROMtab_aes\nWHERE\nCAST(AES_DECRYPT(FROM_BASE64(tab_aes.data),'秘钥')ASCHARCHARACTERSETUTF8)LIKE'要加密%'
优点
3.2、字段冗余存储
我们都知道MySql模糊搜索,只有当匹配开头、或者匹配结尾的时候,索引才会生效。所以我们可以扩展一个字段,用来存储开头和结尾加密后的数据。
创建表sql语句如下,新增一个字段data_ext,并建立索引:
CREATETABLE`tab_aes`(\n`data`VARCHAR(250)NULLDEFAULTNULLCOLLATE'utf8_general_ci',\n`data_ext`VARCHAR(250)NULLDEFAULTNULLCOLLATE'utf8_general_ci',\nINDEX`data_ext`(`data_ext`)USINGBTREE\n)\nCOMMENT='数据加密存储表'\nCOLLATE='utf8_general_ci'\nENGINE=InnoDB\n;
比如,要加密的内容为:123456789,字段data_ext取字段data,开头和结尾3个字符存储,储存格式为:AES(123),AES(789),插入数据的sql语句如下:
INSERTINTOtab_aesVALUES(TO_BASE64(AES_ENCRYPT('要加密的内容','秘钥')),\nCONCAT(TO_BASE64(AES_ENCRYPT('要加密','秘钥')),',',TO_BASE64(AES_ENCRYPT('内容','秘钥')))\n);
存储结果如下:
SELECTCAST(AES_DECRYPT(FROM_BASE64(tab_aes.data),'秘钥')ASCHARCHARACTERSETUTF8)FROMtab_aesWHEREtab_aes.data_extLIKECONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘钥')),'%')ANDtab_aes.data_extLIKECONCAT('%',TO_BASE64(AES_ENCRYPT(('内容'),'秘钥')))ANDtab_aes.data_extLIKECONCAT(TO_BASE64(AES_ENCRYPT(('要加密'),'秘钥')),'%',TO_BASE64(AES_ENCRYPT('内容','秘钥')));
通过Explain分析结果,该查询sql语句索引是生效的。
此方案也有以下缺点:
1、匹配字符数是固定,如果业务有变,需要重新更新数据库;
3、冗余数据,需要额外的存储空间。
任何一种方案都有其优点,也有它的局限性,但有一点的是,数据安全是最重要的,任何企业切不可只为了业务发展,而忽略安全的重要性。
好了,今天就分享到这边了,如果对您有帮助,欢迎点赞分享,谢谢!
我是编程乐趣,一个10年.Net开发经验老程序员,专注开源项目和编程知识分享。
私信回复:【888】,领取.Net视频教程。
基于.Net+SWEBUI开发的开源WMS仓库管理系统
.NetCore+Mysql+Vue+MVC+SqlSugar开源WMS仓库管理系统
一个Windows远程工具,小巧但实用,支持RDP、SSH、FTP等多种协议
关于mysql模糊搜索优化,MySql加密存储的数据的介绍到此结束,希望对大家有所帮助。