服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - 数据库技术 - 数据库加密字段进行模糊查询详解

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

2023-07-30 12:27未知服务器之家 数据库技术

需求 对于一些敏感字段,比如手机号码、身份证、地址、银行卡号等,我们在存放进数据库前,可能需要对其进行加密。 大部分情况下,我们只需要支持等值查询。但是如果需要支持模糊查询,那么整段内容整体加密就不具备这

需求

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

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

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

服务器端解密

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

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
1234eHCMZqxNSLx/B37koArx/w
23459w1Pv8ik2H41s1KORLfPHA
3456vcFFFvi0mwAgIjdSQjcmSw
4567Tr/WaYfVySyMJhcZ78RFlA
56782wFeC6sgdXX7wmo0YcYY/Q
6789FfO9qD9XPx/lnJJuTfTfaA
7890Wufth7zOBLEy2LmepG5Taw
89011xR5MHRmlqOac5X6Cmn3kA

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

/egpaR5G9sMQUUWWz+3CLgeHCMZqxNSLx/B37koArx/w9w1Pv8ik2H41s1KORLfPHAvcFFFvi0mwAgIjdSQjcmSwTr/WaYfVySyMJhcZ78RFlA2wFeC6sgdXX7wmo0YcYY/QFfO9qD9XPx/lnJJuTfTfaAWufth7zOBLEy2LmepG5Taw1xR5MHRmlqOac5X6Cmn3kA

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

分片密文
0123/egpaR5G9sMQUUWWz+3CLg
1234eHCMZqxNSLx/B37koArx/w

查询串:

/egpaR5G9sMQUUWWz+3CLgeHCMZqxNSLx/B37koArx/w

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

代价

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

密文长度较长

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

分片长度不能太短

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

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

分片密文
0hHjJXA0e+haw/+WZ1mFITA
1y7qHn2nn3Ne/6wNRiwl/Lg
2h0dmfkO5SUolFFLp8J2Y5A
3ma/XrJjPv2MXSXE7Y4xs8w
4Q9V4PXXPjJgdR7UChUMY1g
5Wo57z24UXLoBdQ7QzxlOqA
6fC+zrF4ga5TCb5Zu36KVrQ
7z+XqHaWmlAsCnIP6NnD3lg
8olm8cPYmLHCeD1jegauiWw
9hJS77tLMd2Ol5SU4dIbbpw

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

可能有多余结果

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

参考

密文字段检索方案

实现

Golang实现基于AES+CBC+PKCS5Padding的可模糊查询加密

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

免费资源网 - http://www.zzvips.com/uploads/allimg/k2hlvrc5pn5

延伸 · 阅读

精彩推荐
  • 数据库技术MySQL中数据安全保障技巧

    MySQL中数据安全保障技巧

    随着信息化时代的到来,数据库已经成为企业发展中不可缺少的重要组成部分。MySQL作为一款开源的关系型数据库管理系统,广泛应用于各种企业应用程序...

    未知1282023-06-15
  • 数据库技术阿里云服务器怎么清除数据库

    阿里云服务器怎么清除数据库

    阿里 云服务器 是 云计算服务商 阿里云 公司提供的一种云端服务,具有高可靠性、高扩展性、高安全性等优势,因此在企业和个人中得到了广泛的应用。...

    未知1572023-05-18
  • 数据库技术买了云服务器有必要买云数据库

    买了云服务器有必要买云数据库

    买了 云服务器 有必要买云数据库 随着信息技术的迅速发展和互联网的普及,越来越多的企业和个人选择将数据存储和处理工作转移到云服务器上。云服务...

    未知1692023-07-27
  • 数据库技术SQL注入篇学习之盲注/宽字节注入

    SQL注入篇学习之盲注/宽字节注入

    盲注 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注。 时间盲注其实和布尔盲...

    未知1722023-07-30
  • 数据库技术华为云服务器还要买数据库吗

    华为云服务器还要买数据库吗

    随着云计算技术的不断发展, 云服务器 已经成为了企业中广受欢迎的选择。作为云服务器中的一员, 华为云服务器 也越来越受到了企业和个人用户的喜爱...

    未知1202023-05-24
  • 数据库技术sql left join 命令详解

    sql left join 命令详解

    左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集...

    数据库技术网12172021-10-08
  • 数据库技术虚拟主机升级云空间-虚拟主机/数据库问题

    虚拟主机升级云空间-虚拟主机/数据库问题

    问:您好,我这个网站www.dkwiw.com 都做好了,也有备案,要做百度推广用的,要升级为:弹性云-通用-商务型:vCPU:4核内存:4G系统盘:30G数据盘:20G公网...

    未知1412023-05-09
  • 数据库技术MySQL中的数据表分散实践技巧

    MySQL中的数据表分散实践技巧

    MySQL是一种普遍使用的关系型数据库管理系统,它是Internet上最流行的数据库之一,为许多应用程序提供了强大的数据存储和管理功能。在MySQL中,数据表是...

    未知862023-06-15