一、密文检索概述

谈起密文检索,我得先跟你讲个故事。我刚工作时,参与过一个医疗数据共享项目。数据存在云端,但医院要求:数据必须加密存储,还得支持医生按关键词搜索病历。传统的做法是啥?要么拿数据下来解密再查,要么直接明文索引。前者效率低得让人抓狂,后者安全上又埋了个大雷。

这正是密文检索要解决的问题——数据全程加密,但检索功能不丢。说白了,就是让服务器在一堆密文里,精准找出你要的那条,而它自己都不知道搜的是什么内容。

1.1 什么是密文检索

用一个场景来理解:

你有一个加密的数据库,里面存着客户的合同。现在你想查所有含“特斯拉”关键字的合同。普通的检索,得把数据库解密成明文,然后跑 LIKE 查询。云服务商这时候就能看到你的商业机密了。

密文检索的做法不同:

  • 数据入库前,先加密,同时在密文上构建一个可检索的索引结构。
  • 查询时,把关键词也做加密处理,生成一个“查询令牌”。
  • 服务器拿着令牌去搜索引,找到匹配的结果。

整个过程,服务器看到的全是密文和令牌,没法知道明文内容。我自己在项目中遇到过好几回,客户最关心的就是这个点:“凭什么我存在你云上的数据,你还能让我精准检索?”——凭的就是这套加密和索引的技术。

1.2 基本原理

它的核心框架,我习惯用三个模块来拆解:

  1. 加密模块:用密钥把原始数据转换成密文。
  2. 索引模块:从明文中提取关键词,构建一个既能保护隐私、又能高效检索的结构。
  3. 查询模块:用同样的密钥,把查询词转成可匹配的令牌,去索引里做比对。

你想想看,这不就是“用密码学给数据库加了一层搜索加速器”吗?

一个关键原则:
密文检索的安全性和效率是跷跷板。安全做得越死(比如全同态加密),检索就越慢;追求效率(比如某些对称可搜索加密方案),就可能泄露搜索模式。选哪个,取决于你的业务场景。

1.3 常见加密方案

1.3.1 对称加密

对称加密是基础中的基础。加密和解密用同一把密钥。最常见的是 AES,速度快,适合海量数据。

但在密文检索场景里,直接用对称加密会有个问题:无法直接对密文做比较或匹配。比如 AES 加密同一段文本两次,每次得到的密文都不同(因为有 IV 参与)。那你拿什么去索引?

所以单纯用对称加密,做不了密文检索。它更多是用来加密“数据本体”的。

我的一点经验:
大多数密文检索系统,底层用 AES 加密原始数据,上层再用“可搜索加密”建立索引。两个结合着用,既保安全,又保功能。

1.3.2 可搜索加密

这才是密文检索的核心技术。可搜索加密(Searchable Encryption, SE)允许在密文上做关键词搜索。

主流分两类:

类型 原理 典型方案 适用场景
对称可搜索加密(SSE) 双方共享密钥,构建加密的倒排索引 Song-Wagner-Perrig 方案、Curtmola 方案 单用户、小规模系统,性能最好
公钥可搜索加密(PEKS) 用接收方公钥加密关键词,生成搜索令牌 Boneh et al. 方案 多发送方场景,比如邮件过滤、IoT采集

我自己在实际的接口测试中,踩过一个坑:选择方案时只看了安全性,没管性能。结果索引构建慢得像蜗牛,几万条数据就得跑几分钟。做自动化测试时,超时配置都改了好几轮。

注意:
可搜索加密的“搜索”,不一定精确。某些方案只做“存在性判断”——判断某个关键词是否在密文里,但不知道具体在哪几行。如果你的场景需要精确匹配行号,得选那些支持“结果保序”的方案。

再讲一个细节:密文检索的安全级别。学术界一般分为几个层次:

  • CKA1:只隐藏关键词本身,不隐藏搜索模式。
  • CKA2:更强的安全性,能抵抗选择关键词攻击。
  • IND-CKA:抗自适应敌手,安全性更高。

我做自动化测试时,会把每个安全级别的差异做成一个配置参数。为什么这么弄?因为在不同客户现场,安全等级要求不同。接口测试用例得跟着变——这才是自动化测试的灵活之处。

1.4 知识体系总览

下面这张图,能帮你快速建立起密文检索的知识骨架。我画的是密文检索的信息流架构:

密文检索核心架构 原始明文数据 客户合同、病历等 加密模块 AES / 可搜索加密 密文库 存储加密后的数据 索引模块 倒排索引构建 索引库 密文索引结构 用户查询 输入关键词 查询令牌生成 加密关键词 匹配检索 索引库比对 结果 密文ID 说明: 数据全程保持加密状态,服务器无法看到明文内容。索引和查询均使用加密后的令牌进行匹配。 这是自动化测试的核心对象——接口需验证 加密 → 索引 → 令牌生成 → 检索 的完整链路。

怎么用这张图做自动化测试?
记住四个测试入口:加密模块输出(验证密文格式)、索引模块输出(验证索引结构)、查询令牌生成(验证令牌一致性)、匹配检索结果(验证命中率与排序)。每个入口,都对应一份单独的接口测试用例集合。