△Hollis, 一个对Coding有着独特追求的人△

7c4e4fcff586b563c12c58b55c2080d4.jpeg

这是Hollis的第 444 篇原创分享

作者 l Hollis

来源 l Hollis(ID:hollischuang)

5d70de588ad2aebf2240753e965d84f3.png

数据库加密可以保障数据的安全,但是也会带来很多的问题,其中有一个比较关键的就是数据的模糊查询的问题。

当我们通过加密后把密文存到数据库中的时候,再通过明文进行模糊查询是不生效的。

比如Hollis加密后的内容是363164846D8200899E314897E64A7420,那么当我想用Ho来做模糊查询时候,那么他的密文是71AAFD38484F3160708C6A6D2D5F736B,这两个密文可以说是没有任何关系的,所以,是无法直接做模糊查询的。那么如何解决这个问题呢?

先解密再查询

一种比较常见的方法,就是把要查询的表中的所有符合条件的数据,都加载到应用内存中,在内存中逐个解密,然后再做模糊匹配。(本文内容来自于我出的《Java面试宝典》,平均一道题才1毛钱。

这个方案的优点就是实现简单,缺点也很明显,需要把所有数据都加载到内存中,容易导致OOM。不推荐!

明文映射表

还有人提出过说单独建一张表,其中保存明文和目标表之间的映射,需要模糊查询的时候先去明文映射表中查到主键,然后再去目标表查询数据。

但是这个方案基本上是属于自欺欺人,因为一旦数据被拖库,还是会丢。不推荐

数据库解密函数

加密的时候如果用了函数的话,解密的时候我们也可以借助函数来做解密,同时做模糊查询,比如加密时使用了AES_ENCRYPT算法:

-- 加密数据
INSERT INTO user_data (username, credit_card) VALUES ('Hollis', AES_ENCRYPT('1234-5678-9012-3456', 'hollis_secret_key'));

那么在做模糊查询的时候就可以这样做:

SELECT * FROM user_data WHERE AES_DECRYPT(credit_card, 'hollis_secret_key') like 'Hol%';

这样也就能实现一个模糊查询的效果了,但是这个方案有个缺点,就是无法用到索引,不是因为用like,而是因为我们在字段上用了函数,索引就会失效。(本文内容来自于我出的《Java面试宝典》,平均一道题才1毛钱。

这个方案适合于表中数据量不大,或者查询条件中还有其他查询字段可以走索引的情况。

明文分词

还有一个比较简单的做法,也是很多大厂在用的方案

e5be934f185b67bfffb5b692bbc41319.png

那就是对明文进行分词,然后分别加密后存储到数据库中,比如Hollis这个需要加密的字符串,我们就可以把他拆成Ho 、Holl、llis等这几个字符串,然后分别对他们进行加密,并保存到数据库中。(本文内容来自于我出的《Java面试宝典》,平均一道题才1毛钱。

这样当我们使用Ho 、Holl、llis 进行查询的时候,就可以对明文加密后去数据库中匹配了。

这个方案的缺点也比较明显,第一个就是需要冗余很多字段,第二个就是不够灵活,如果我按照Holli来查询的话就不支持了。

这个方案本质就是一种比较典型的用空间换时间的做法,理论上只要你愿意,可以把所有的可能的查询都做冗余。


本文内容节选自我最近出的Java面试宝典,类似的干货及面试题+答案还有1000多道题。从工作0年到工作10年以内,看了都一定满满收获。

我们会持续更新内容,争取做到全网最新、最全、最准确的Java后端面试宝典。

之前已经推出有一段时间了,大家评价都很好,基本没有差评。我在抖音上的店铺评分是满分的,可以说品质是嘎嘎有保障的。

a53e47e7fcfcc6f1d36dda2b9eab49c9.png

大家都知道程序员有多难伺候,这侧面证明了这个内容的价值了!

cd4ea0df9e41efa6369df7490205ae70.jpeg

(长按扫码去下单)

很多人也通过这份宝典上岸了(目前已知最高的拿到年包80的Offer,很多人上岸阿里、美团、快手、华为、滴滴、携程、小红书等中大厂),趁现在还未涨价(原价199,现在有优惠,到手只需要119,平均一道题才1毛钱,后续会不断涨价。。。),有需要的抓紧上车吧。

在线课程,文字形式,永久更新。

八股文面试宝典详细介绍:Java面试宝典介绍

下单后,不满意3天内可以无条件退款!只要你觉得它是任何一个市面上可以看到的面试题库可以比拟的,不管别人卖多少钱,只要你有这种感觉了,都直接来退款!就是这么自信!!

(下单后按照短信提示申请权限并联系客服审批即可)

55a03bd2fc79c2ae6ba77447ad7e2a48.jpeg

(长按扫码去下单)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐