MySQL 系列面试题
提示:本章属于场景相关的面试题,想获取更多请点击相关类型的链接。
前言
在日常工作中,我们经常会有一些模糊查询的条件,比如说按照手机号模糊查询,或者是身份证号码。正常情况下我们可以使用以下方式来模糊查询,
select * from user where mobile like %123%
但是这种方式是在手机号码没有加密的前提下,但是对于一些用户私密数据,我们在数据库都会加密保存。那能不能查询时将条件也加密来获取想要的结果,事实真是这样么,看下边的例子,我们将手机号进行加密,这时候我们要搜索手机前缀为136的手机号,这时候将条件进行加密,然后查询,你会发现,加密出来的是两个完全不一样的字符串,所以这种方式是不可行的。

以下提供了几种常见的解决方案,以供参考。
一、内存解密(数据量少可用,数据量多不推荐)
这种方案就是我们可以将所有数据都查询出来,然后在内存中将所有的手机号进行解密,然后在做一个匹配,这种方式优缺点如下:
优点:
- 简单方便,没有复杂的实现逻辑
缺点:
- 每次查询都需要将整张表的数据都查询出来,然后将所有的手机号进行解密
- 如果数据量过大,就会导致 OOM 的异常
二、加密函数
在数据库中实现与程序一致的加密算法,修改模糊查询的条件,使用数据库加密函数先解密再模糊查找,这样做的优点是实现成本低,开发使用成本低,只需要将以往查询稍微修改一下就可以实现,但是缺点也很明显,这样做无法利用数据库的索引来优化查询,甚至有一些数据库可能无法保证和程序一致的加密算法,但是对于常规的加解密算法都可以保证一致。
如果对于查询性能要求不是很高,对数据安全性要求一般,可以使用常见的加解密算法,例如AES、DES之类的也是一种不错的选择。
三、分片加密(推荐)
密文检索的功能实现是根据4位英文字符(半角),2个中文字符(全角)为一个检索条件。将一个字段拆分为多个。
比如: taobao 123
使用 4 个字符为一组加密方式。
第一组 taob,第二组aoba,第三组 obao,第四组 bao1 … 依此类推。如果需要检索所有包含 4个字符的数据,比如: aoba,加密后通过 key like “%partial%” 查库。
我们的手机号码是 11 位数,我们每4位作为一个分片
public static void main(String[] args) {

最低0.47元/天 解锁文章
245

被折叠的 条评论
为什么被折叠?



