数据库中加密的数据如何查询

常见数据库锁表查看与解决操作 中断任务:alter system disconnect session 90,2735;可以查看长时间或者相关人执行的SQL。Gbase 8a查看锁表操作gcadmin show lock;如果有表名就是有锁,使用kill id即可; 阅读详情

数据库中加密的数据如何查询

先思考

  • 数据库中加密的数据如何查询?
  • 如何做等值查询、模糊查询、范围查询?
  • 确定性加密、HMAC 哈希索引、分段/分桶存储、保序加密、N-gram 索引、布隆过滤器等设计有何特点?

—— 2025 年 10 月 8 号 乙巳蛇年八月十七 寒露
扫码关注微信公众号   了解最新最全文章

qrcode

1 数据加解密方式

  数据库数据加密的方式有加解密 API、透明加解密和应用层加解密等,其中前两种加密方式由数据库系统都会提供。

1.1 加解密 API

  加解密 API 是指数据库管理系统提供的可在 SQL 语句中调用的加解密 API,应用可以利用这些 API 对涉密数据进行加密保护。其特点是灵活性强,支持列级加密,但构建和管理复杂,且应用需要适配 API 或代理接口,可能引入额外的运维负担。适用于需要平衡安全性和性能的场景。

1.2 透明加解密

  透明加密是指数据库安全管理员为数据库敏感字段选择加密方式和密钥级别,应用访问受保护数据时只需要使用口令打开或关闭密钥表即可,对数据的加密和解密皆有数据库管理系统自动完成。其特点是管理方式简单、应用程序负担轻,但灵活性差;且由于其通常以数据库文件或表为单位进行加密,无法针对特点列进行细粒度加密,会导致索引优化失效。适用于需要基础存储安全防护的场景。

1.3 应用层加解密

  应用层加解密是指应用程序将数据写入数据库之前在应用程序中对涉密数据进行加密,然后将加密后的密文写入数据库,访问数据时将密文读取到内存中后再通过应用程序解密,是最常用的加解密方式。其特点是灵活性高,支持细粒度加密,可按表、列甚至按行选择加密字段,但需要修改应用代码,增加了开发和维护成本,且会影响数据查询性能(加密后的数据可能会是索引失效、无法直接模糊查询和范围查询等)。适用于数据及其敏感的场景,如金融数据。

  在了解了数据加解密方式后,我们再来看如何对加密后的数据进行等值、模糊和范围查询。

2 等值查询

2.1 确定性加密

  确定性加密是加密时指使用固定的密钥和IV,使得相同的明文总能生成相同的密文。

  例如使用 mysql 提供的基于 AES 算法的对称加密函数 AES_ENCRYPT API 加密:

insert into sys_user (id, username) 
values (1, AES_ENCRYPT('zed', 'key123'));

  查询时使用相同的加密函数和 IV 即可:

select * from sys_user 
where username = AES_ENCRYPT('zed', 'key123');

  同时也可以为加密字段添加索引,以提升查询性能。确定性加密虽然实现简单,但安全性较低,可能会泄漏数据模式,且易遭受频率分析攻击。

  同理,也可以在应用层通过编程式实现这些逻辑,因为对于加密函数、哈希函数和加密方式而言,应用层有着更多更灵活的选择。

2.2 HMAC 哈希索引

  HMAC 哈希索引是指基于基于加密函数与哈希函数结合密钥,生成两份数据:一份为加密值,也就是密文,主要用于显示;另一份为 HMAC 哈希值,主要用于查询。同时,这加密值和哈希值都需要存储。

  使用加解密 API 加解密示例如下:

-- 插入数据时同时生成密文和索引
insert into sys_user (id, username, username_index) 
values (2, AES_ENCRYPT('zed', 'key123'), SHA1('zed'));

  查询时使用 HMAC 索引即可:

select * from sys_user 
where username_index = SHA1('zed');

  同理,也可以在应用层通过编程式实现这些逻辑,因为对于加密函数、哈希函数和加密方式而言,应用层有着更多更灵活的选择。

3 范围查询

3.1 分段/分桶存储

  分桶存储是指将数值范围划分为多个区间,为每个区间设置标识/标签/桶名,插入数据时同时插入被加密数据所在的区间标识,查询先计算上下限所在区间,然后通过区间标识检索数据。

  例如,将用户年龄 age 分为 [0 ~ 18] [18 ~ 30] [30 ~ 40] [40 ~ 50] 等区间,各区间对应的标识 age_bucket 为 0 1 2 3 ,则:

-- 插入数据时同时插入密文和明文所在区间
insert into sys_user (id, age, age_bucket)
values (3, AES_ENCRYPT('27', 'key123'), 1);

  查询时先计算上下限所在区间标识,如查询条件为 22 ~ 35,则其区间标识分别为 1 和 2,然后对区间标识 age_bucket 进行范围查询:

select * from sys_user
where age_bucket >= 1 and age_buckt <= 2;

  接着在应用层对检索到的数据的加密字段进行解密,最后再进行精确过滤,即保留 22 <= age <= 35 的记录。

  分桶存储方案适用于大部分场景,但可能会泄漏数据分布,且需要在应用层进一步过滤。

3.2 保序加密

  保序加密是指依赖保序加密算法,使得加密后的密文顺序与明文顺序一致,如 a < b,则 enc(a) < enc(b)。

  如:

-- 插入数据时直接对涉密字段加密
insert into sys_user (id, username, age)
values (4, 'ahri', ENC('27', 'key123'));

-- 查询时
select * from sys_user
where age > ENC('22');

  注:大部分主流数据库并没有提供关于保序加密的 API,故建议在应用层实现。

  保序加密简单方便,但安全性较弱,会泄漏数据顺序信息,仅适用于对安全性要求不高的场景。

4 模糊查询

4.1 应用层处理

  有种流传的说法,将全量数据加载到内存,然后在应用层处理。如果,我是说如果,如果可以的话,那可以试试,但还是不建议。

4.2 N-gram 索引

  N-gram 索引是指将明文数据拆分成多个由 n 个连续字符组成的子串,然后对这些子串(或称为分词)进行哈希/加密存储。查询时,对查询条件进行同样的 N-gram 算法处理,并对处理后的多个分词进行哈希/加密,然后再进行检索。

  例如,对 username 值为 hello 的数据进行 2-gram 算法处理得到的分词为 he el ll lo,然后对这些分词进行哈希/加密处理并存储到 bigrams 字段:

-- bigrams 值为 [hash('he'), hash('el'), hash('ll'), hash('lo')]
insert into sys_user (id, username, bigrams)
values (5, ENC('hello'), '...');

  假如查询条件为 ell,则先对其进行 2-gram 处理得到分词组 el ll,然后在进行哈希/加密处理,最后在对 bigrams 字段进行检索:

-- 假设查询条件处理后的结果为 condition = [hash('el'), hash('ll')]
select * from sys_user
where bigrams like '%condition%';

  最后将得到的结果在内存中进行精确模糊过滤(即先解密后匹配)。

  N-gram 索引其优点是支持子串搜索,缺点是存储开销大,且安全性较低。对于其存储开销大的缺点,可通过限制子串长度(即 N)和数量来限制存储开销。N-gram 是目前较流行的一个方案。

4.3 布隆过滤器

  布隆过滤器是指使用布隆过滤器存储关键词,可快速判断关键词是否存在。存储流程为:

  • 1、首先从待加密文本中提取出关键词;
  • 2、其次通过关键词数组生成布隆过滤器对象(如果为 java 语言,则可使用 com.google.guava 依赖中的 BloomFilter 类);
  • 3、然后将布隆过滤器对象序列化得到其字节数组对象;
  • 4、最后将密文和字节数组对象写入数据库;

  查询流程为:

  • 1、从数据库中读取出所有布隆过滤器对应的字节对象数组;
  • 2、将其反序列化成布隆过滤器;
  • 3、通过遍历检查查询关键词是否存在于布隆过滤器;
  • 4、若存在则将密文解密并进行精确过滤(因为布隆过滤器存在误判,所以需要进行精确模糊过滤);

  布隆过滤器优点是空间效率高,查询速度快;缺点是可能存在误判(但不会漏判)。

总结

  安全性与性能是系统设计中最重要的非功能性需求之二,提升安全性必然会降低性能,提升性能必须得牺牲安全性,二者相互影响成为系统中的平衡点之一。故如何在安全性与性能之间取得平衡,需要根据具体需求和业务场景作出合理取舍。

qrcode

扫码关注微信公众号   了解最新最全文章
敏感数据加密后如何实现模糊查询 阅读详情

相关推荐

01-查看Navicat加密的数据库密码

目录 查看Navicat加密的数据库密码 1、打开运行窗口,输入regedit,点击确认按钮,打开注册表编辑器 2、在注册表中找到Navicat加密后的密码 3、打开PHP在线运行工具,粘贴解密代码 4. 修改倒数第三行NavicatPassword的版本值 5、更改倒数第二行decrypt()方法中的字符串为Navicat加密后的密码 6、点击执行,右侧得到解密后的密码 查看Navicat加密的数据库密码 背景:本机装的MySQL数据库密码忘记了,打开了Navicat连接过数据库,不过密

小白的博客 7833

数据库密码加密和查询

数据库

qq_54387381的博客 694

IAR编译相同工程生产hex文件checksum不一致问题

IAR Checksum

xqw19891201的博客 1383

Spring Boot + MyBatis:实现数据库字段级加密

/ 是否支持模糊查询@Encrypted // 这个字段会自动加密@Encrypted // 这个字段也会自动加密使用简单:只需要在字段上加个注解就行代码干净:业务代码不用关心加解密逻辑安全可靠:使用标准的加密算法容易维护:所有加密逻辑集中管理适用场景用户管理系统支付系统医疗信息系统任何需要保护敏感数据的系统不适用场景对性能要求极高的系统需要对加密字段进行复杂查询的场景数据量特别大的系统如果你也有保护敏感数据的需求,这个方案值得考虑。代码量不大,但效果很明显。

风象南的专栏 538

从零开始:Basler相机与pylon Viewer的工业视觉入门指南

本文详细介绍了Basler相机与pylon Viewer在工业视觉系统中的入门指南,涵盖硬件连接、软件安装、核心功能解析及实战案例。通过pylon Viewer的全面控制和参数调整功能,帮助新手快速掌握工业视觉检测技术,提升生产效率。

julia4scientist的博客 1135

Oracle EBS订单的流程(Order->AR)

基本流程创建订单路径:Order Management > Orders,Returns > Sales Orders填写订单头信息,客户,订单类型,销售人员填写订单体信息,输入物料,数量...然后Book Order,订单Book之后,你会发现订单头的Status的状态变成了“Booked”,订单行的状态为"Awaiting Shipping",记录下来你的订单号,后边的每一步都需要这个订单号。

田攀的日志 4万+

数据库表中的数据加密后怎么模糊查询

随着互联网的进一步发展,用户接触到数据的渠道越来越多,那么数据安全性就显得越来越重要。通常我们会将一些重要的信息在数据库中进行加密后存储,比如:用户手机号码、身份证号码等。数据库加密可以保障敏感数据的安全性,那么加密后的数据怎么做模糊查询呢?

冥胖胖9的博客 1136

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

被加密后的数据怎么进行模糊查询?

被加密后的数据怎么进行模糊查询

ZULJ131的博客 8272

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配)

本文详细解析了STM32驱动ADXL345传感器的全流程,包括IIC和SPI双模式适配、硬件连接、寄存器配置及数据采集处理。通过实战代码示例和常见问题排查指南,帮助开发者快速实现高精度加速度数据采集,适用于运动检测、姿态识别等多种嵌入式应用场景。

weixin_29171087的博客 313

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流

所有记忆都存在本地。

步子哥的博客 1063

MySql加密存储的数据,如何模糊搜索?

wx_fmt=png)]现在企业都已经数字化办公了,在提升效率的同时,数据安全也是重中之重,很多公司为了追求效率,却忽略安全这方面的工作。从上面的报告看,蔚来这次泄露的数据包含:用户身份证、地址,这些数据保密级别都是最高的,在数据库存储也应该要加密存储。在项目开发中,比如密码等少量的数据,不涉及显示和搜索的业务需求,可以采用不可逆加密,但大部分数据,我们还是需要采用可逆的加密方式。任何一种方案都有其优点,也有它的局限性,但有一点的是,数据安全是最重要的,任何企业切不可只为了业务发展,而忽略安全的重要性。

成长的足迹 3285

如何在飞腾平台上安装Ubuntu操作系统

注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。

技术联盟 2645

数据库加密数据模糊匹配查询技术方案

特别是在涉及加密数据的情况下,如何进行模糊查询变得更加复杂。在本文中,我们将探讨三种不同进阶方法:沙雕、常规和超神做法。

Lorin 洛林的后端技术小站 1109

DAF-Net:动态注意力红外-可见光图像融合

DAF-Net 红外-可见光融合链路:IR/VIS 双分支 (Conv+ResBlock → 64ch) → DynamicAttentionFusion (Cat→Sigmoid→加权) → 重建 (Conv→Sigmoid)。TNO 上 SSIM=0.782 (vs IR), 0.734 (vs VIS), 参数量仅 218K。核心贡献:轻量动态注意力门控, 无监督 SSIM+MSE 损失不需要配准 ground truth。

FJN110的博客 318

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据库加密数据模糊查询技术调研

以下是该方法的详细步骤:1. **获取待加密数据**:- 待加密数据包括待加密字段和对应的明文字段值。- 待加密字段中包含预设的模糊查询字段。2. **单字符摘要加密**:- 使用预设的单字符摘要加密算法,将各个模糊查询字段的明文字段值进行单字符加密,并进行拼接。- 得到模糊查询字段的单字符密文字段值。3. **生成扩展字段**:- 为每个模糊查询字段生成一个扩展字段。- 将单字符密文字段值存储至对应的扩展字段中。4. **获取目标查询语句**:

WangYouJin321的博客 867

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据库加密后怎么做模糊查询?

比如Hollis加密后的内容是363164846D8200899E314897E64A7420,那么当我想用Ho来做模糊查询时候,那么他的密文是71AAFD38484F3160708C6A6D2D5F736B,这两个密文可以说是没有任何关系的,所以,是无法直接做模糊查询的。这个需要加密的字符串,我们就可以把他拆成,l,li,liu,等这几个字符串,然后分别对他们进行加密,并保存到数据库中。一种比较常见的方法,就是把要查询的表中的所有符合条件的数据,都加载到应用内存中,在内存中逐个解密,然后再做模糊匹配。

weixin_56353201的博客 1041

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

加密数据库模糊查询

看了不少论文和贴子,论文的共性是完全脱离实际,比如cryptDB,现在数据动不动就几十亿,这种加密好几层的做法实在不合实际,但是基本的思路都差不多,都是基于分词加密。其实数据库加密和可查本身就是悖论,暂时没有很能支持这个方向的加密方案。

niujinya的博客 775

实现数据库中加密字段的模糊检索思路

如果输入01234 大于4位的号码,先将其分组,0123,1234,并将分组后的字符串分别加密,然后拼接在一起,做为sql语句的条件 like %smphone%不可以或不建议了,以目前4位分组来说,不能少于3位号码进行搜索了,分组太多,效率过低。诸如,把数据库数据先解密为明文在对比数据检索,或者把数据返给前端,让前端做数据对比与检索,都不是一个好的解决思路,结合具体业务细节上考虑的更多。可以的,如果输入3位号码,可以在后面+1位,分别为0-9,分为10组,进行检索。以此类推,实现对手机号的模糊检索。

AlbenXie的博客 793

加密后的数据如何进行模糊查询

我们知道加密后的数据对模糊查询不是很友好,今天我们就具体探讨一下加密以后数据怎么继续模糊查查询的问题。我们需要加密存储,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用时间换安全性),在检索时我们既不需要解密也不需要模糊查找,直接使用密文完全匹配但是手机号就不能这样做,因为手机号我们要查看原信息,并且对手机号还需要支持模糊查找,因此我们今天就针对可逆加解密的数据支持模糊查询来看看有哪些实现方式。

zhiyikeji的博客 5004

mysql数据库中针对敏感信息字段加密处理问题

最近有这样一个需求,针对系统中的敏感信息,如供应商的手机号码,银行账号等需要做加密处理。比较常见的加密方式如md5,但是公司架构组的给出的方案是:统一在数据库处理,使用mysql的加密函数AES_ENCRYPT(’‘明文,‘加密key’)和解密函数AES_DECRYPT(’'明文,‘加密key’),加密key可配置。 经过一天的更改测试完成,做个总结,记录下此过程中遇到的问题及解决方法。 在原表中...

努力努力再努力的小笼包 2万+

数据库加密数据的查看

--1 创建数据库主密钥use testGOCREATE MASTER KEYENCRYPTION BY PASSWORD='password123'GO --2创建存放加密数据的表CREATE TABLE dbo.SecTable( ID INT IDENTITY PRIMARY KEY, DATA NVARCHAR(100))GO --3 创建数字证书,数字证...

weixin_34060299的博客 1514
上一篇: 分类树设计(邻接表、路径枚举、嵌套集、闭包表、混合方案)
下一篇: 加密技术的爱恨情仇:当对称加密邂逅非对称加密
红衣女妖仙
博客等级 码龄9年 214粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红衣女妖仙

行行好,给点吃的吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值