当前位置:首页 > 谈天说地

数据库加密字段进行模糊查询详解

34资源网2022-09-06389

需求

对于一些敏感字段,比如手机号码、身份证、地址、银行卡号等,我们在存放进数据库前,可能需要对其进行加密。

大部分情况下,我们只需要支持等值查询。但是如果需要支持模糊查询,那么整段内容整体加密就不具备这个能力。

下面是几种解决办法,场景是我们需要根据手机号码的前缀进行匹配。

服务器端解密

因为服务器肯定是具备解密密文的能力的,因此最简单的方式就是把整个表的密文字段数据拉下来,在服务器端进行解密,然后再在服务器端进行匹配。

findrecords(prefix)  {
    records = getallrecords()
    finds = []
    for (record : records) {
        phone = decrypt(record.phone)
        if (phone.hasprefix(prefix)) {
            finds.push(record)
        }
    }
    return finds
}

如果数据量很小,那么这种做法也许还能够接受。但是只要数据量上去,那么效率就会很低,而且还需要通过网络io把整个表的数据传输到服务器端。

数据库端解密

上面的做法需要把整个表的数据传输到服务器端,那么我们只需要能够在数据库进行匹配,就不需要传输整个表了。因此我们也可以在数据库实现解密算法,在匹配的时候用解密算法解密密文,就能够进行模糊匹配了。

findrecords(prefix) {
    return query("select * from table where decrypt(phone) like '?%'", prefix)
}

这个做法也是需要遍历整个数据库,因此只适合数据量比较小的情况下;而且需要把密钥传给数据库,增加了密钥泄露的风险。

字符串分片

上面的做法我们都没有用到数据库的索引能力,正常情况下,前缀匹配我们是可以使用到索引的,比如where phone like 'prefix%'。如果加密后的密文,也能够走索引,那么我们就不需要遍历整个数据表了。

比如我们可以根据4位作为一个检索条件,将手机号码拆分位多个分片:比如手机号012345678901,我们可以拆分并对分片进行加密:

分片 密文
0123 /egpar5g9smquuwwz+3clg
1234 ehcmzqxnslx/b37koarx/w
2345 9w1pv8ik2h41s1korlfpha
3456 vcfffvi0mwagijdsqjcmsw
4567 tr/wayfvysymjhcz78rfla
5678 2wfec6sgdxx7wmo0ycyy/q
6789 ffo9qd9xpx/lnjjutftfaa
7890 wufth7zobley2lmepg5taw
8901 1xr5mhrmlqoac5x6cmn3ka

这些密文拼接起来的串为:

/egpar5g9smquuwwz+3clgehcmzqxnslx/b37koarx/w9w1pv8ik2h41s1korlfphavcfffvi0mwagijdsqjcmswtr/wayfvysymjhcz78rfla2wfec6sgdxx7wmo0ycyy/qffo9qd9xpx/lnjjutftfaawufth7zobley2lmepg5taw1xr5mhrmlqoac5x6cmn3ka

然后就可以支持前缀查询了(最少4位),比如前缀01234,我们可以按照上面的分片方式先分片,再拼接为查询串:

分片 密文
0123 /egpar5g9smquuwwz+3clg
1234 ehcmzqxnslx/b37koarx/w

查询串:

/egpar5g9smquuwwz+3clgehcmzqxnslx/b37koarx/w

可以看到查询串为上面的前缀,因此可以进行前缀查询!

代价

这种方式也是会有一定的代价的:

密文长度较长

比如手机号码是明文长度是11,但是按照4位分片的密文长度是198

分片长度不能太短

分片太短有安全问题,因此没办法支持过短的查询。

主要是因为切片过短,会很容易被猜出来每一位对应的密文。比如0-9的密文切片长度1切分:

分片 密文
0 hhjjxa0e+haw/+wz1mfita
1 y7qhn2nn3ne/6wnriwl/lg
2 h0dmfko5suolfflp8j2y5a
3 ma/xrjjpv2mxsxe7y4xs8w
4 q9v4pxxpjjgdr7uchumy1g
5 wo57z24uxlobdq7qzxloqa
6 fc+zrf4ga5tcb5zu36kvrq
7 z+xqhawmlascnip6nnd3lg
8 olm8cpymlhced1jegauiww
9 hjs77tlmd2ol5su4dibbpw

只有10种分片类型,如果对应的是手机号码字段,很容易根据统计每个数字的概率分布猜出每个数字对应的密文。

可能有多余结果

可能有两个不同分片对应相同密文,这时候就需要在服务器再过滤一遍。

参考

密文字段检索方案

实现

golang实现基于aes+cbc+pkcs5padding的可模糊查询加密

以上就是数据库加密字段进行模糊查询详解的详细内容,更多关于数据库加密字段模糊查询的资料请关注萬仟网其它相关文章!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/21726.html

分享给朋友:

相关文章

网友分享:自媒体写作100天的得出的4条经验,希望对你有用

网友分享:自媒体写作100天的得出的4条经验,希望对你有用

要说到自媒体写作,那对于很多人来说还是相当难的,虽然说很难,不过总是会有人写的。这不,今天小编就摘录了一位网友自媒体写作100天的4条经验,希望对你有用。…

低成本创业好项目,这个可日赚几千元

低成本创业好项目,这个可日赚几千元

这几年创业项目也变得越来越多了,大家都知道,现在靠打工是挣不了什么钱的,所以,很多人宁愿自己创业不想打工。那么,低成本创业项目有哪些呢?下面小编马上为大家推荐一个低成本创业项目,如果你有资源的话,也可以免费去推广操作,做好了日赚几千也是很容…

联合国秘书长:新冠疫苗必须要成为全球公共产品

联合国秘书长:新冠疫苗必须要成为全球公共产品

当地时间3月11日,联合国启动“必须团结一致”(Only Together)公共宣传活动,呼吁新冠疫苗能够在联合国疫苗计划主导下,成为全球公共产品,向全球各地有需要的人提供。…

打工人是什么梗出自哪里?打工人的梗为什么这么火?

打工人是什么梗出自哪里?打工人的梗为什么这么火?

近日,看到打工人这词很火,很多小伙伴肯定和我一样,都想知道“打工人”这个词为什么这么火吧?那么,接下来我就跟大家说说打工人是什么梗出自哪里?这词出自哪里无从考证,不过肯定是某些有头脑的网友发明的,至于出自哪位网友?我们一起来了解相关情况吧。…

卡斯数据是干什么的(免费大数据查询平台)

卡斯数据是干什么的(免费大数据查询平台)

短视频/直播电商不负众望,成为2020年品牌营销最热关键词。G2格局下两大顶流——抖音和快手,也自然吸引了各方关注。相较抖音而言,快手独特的老铁氛围像自带结界,不懂“规矩”的内容创作者和品牌方在这里寸步难行。 究竟快手直播电商现状如何?什么…

微信开放外链,社交想象力有限

微信开放外链,社交想象力有限

编者按:本文来自新熵,创业邦经授权发布,封面图来自摄图网。 作者|古廿 编辑|伊页 网易云音乐上市,丁磊在现场讲了很多的未来,比如元宇宙。但未来是摸不着看不见的,所以愿意放眼未来的人,多半还要立足脚下。 脚下的立足往往来自两个方面:一…