2. 可搜索加密基本概念:对称与非对称、安全性模型
欢迎来到第二章。上一章我们聊了密文检索的整个大图景,现在必须把地基夯实。说白了,可搜索加密就是让你能在加密的数据上做搜索,而不需要先解密。听着像魔法?其实背后是密码学里一个非常精巧的“妥协”——用可控的信息泄露,换取可用的检索性能。
本章我们会聚焦两个核心流派:对称可搜索加密(SSE)和非对称可搜索加密(ASE/PEKS)。我会结合实战中的坑,解释它们各自的适用场景和安全边界。至于安全性模型,嗯,这个是最容易被忽视但出大问题的地方。
2.1 对称可搜索加密(SSE)
SSE 是目前工业界最常用的方案。为什么?因为快。它用对称加密(比如 AES)配合一些巧妙的索引结构,让服务器能在不解密的情况下筛选出匹配的密文。
2.1.1 核心工作流程
我把 SSE 的流程拆成三步,你大致感受一下:
- 密钥生成: 数据拥有者生成一个对称密钥
K。这个密钥只有你持有。 - 构建索引: 对每个文档提取关键词,然后对每个关键词
w计算一个伪随机函数的输出F(K, w),再把文档标识符映射到这个输出后面。比如F(K, "苹果")映射到[doc1, doc3]。 - 搜索与匹配: 你想搜“苹果”,就用同样的密钥
K计算F(K, "苹果"),得到令牌t。服务器拿着这个t在加密索引里一找,返回匹配的密文。
这个过程里,服务器看到的全是伪随机串,压根不知道你搜的是什么词。
核心要点: SSE 的搜索过程是确定性的——同样的关键词,每次生成的令牌都一样。这是它的性能优势,也是安全弱点的来源。
个人经验: 我在做一个企业邮件归档系统时,一开始直接拿 SSE 硬上。结果发现每封邮件提取 50 个关键词,插入一条记录要计算 50 次伪随机函数,CPU 直接拉满。
2.1.2 对称方案的性能特征
我整理了一个简单的对比表,方便你理解 SSE 和后面的非对称方案在性能上的差距有多大。
| 特性 | SSE(对称方案) | ASE/PEKS(非对称方案) |
|---|---|---|
| 加解密速度 | 纳秒级(AES-NI 指令集) | 毫秒级(双线性对运算) |
| 索引构建 | 线性扫描 + 哈希计算 | 大量模幂运算 |
| 令牌生成 | 一次伪随机函数调用 | 双线性配对计算 |
| 搜索延迟 | 亚毫秒级(内存检索) | 10ms ~ 100ms 级别 |
| 适用场景 | 单用户、数据持有者即是搜索者 | 多用户、多方共场景 |
看到了吧?SSE 的性能高出非对称几个数量级。所以只要场景允许,我个人习惯优先选 SSE。
2.2 非对称可搜索加密(PEKS/ASE)
非对称方案解决了一个 SSE 做不到的事——让别人帮你搜,但你不需要把密钥给他。典型应用场景是邮件网关:你收到加密邮件,网关需要在不解密的情况下判断要不要拦截垃圾邮件。
2.2.1 PEKS 的工作方式
我说一个简化版的流程:
- 密钥对: 用户生成一对公私钥
(PK, SK)。公钥公开,私钥自己保管。 - 加密与陷门: 发送方用公钥对邮件加密,同时为每个关键词生成一个“密文标签”。接收方给服务器一个“陷门”(相当于搜索凭证),服务器用陷门配合双线性配对,判断密文中是否包含该词。
- 配对验证: 服务器执行
e(trapdoor, tag) == e(H(w), PK_receiver),如果等式成立,说明匹配。
整个过程所有参与者都不会泄露关键词的明文,包括服务器。
避坑指南: 我曾经在做一个加密健康档案共享平台时,坚持用 PEKS。结果每次搜索要算三次双线性对,一次 15 毫秒,搜索 100 万条记录得等三天。后来我不得不换成对称方案 + 代理重加密的混合架构。
2.3 安全性模型:你必须面对的 Trade-off
可搜索加密不是安全的。它有一个“信息泄露预算”——泄露多少信息,换取多少性能。理解安全性模型,是区分一个方案靠不靠谱的关键。
2.3.1 三个主流安全模型
我把它们按“安全性由高到低”排了个序:
- IND-CKA(选择关键词攻击下的不可区分性): 最基础的模型。要求攻击者(服务器)无法区分两个关键词对应的密文。但有个漏洞——如果攻击者知道某个文档里包含某类关键词,他可以通过统计频率反向推断。
- IND-CKA2(自适应的选择关键词攻击): 比 CKA 更强。允许攻击者在看到之前的搜索结果后,再选择下一轮要攻破的关键词。这个模型更贴近现实——服务器是持续运行的,不是一次性查询。
- IND-CCA(选择密文攻击下的不可区分性): 最高安全等级。要求攻击者即使能让他解密任意密文,也无法获得任何关键词信息。但说实话,在可搜索加密领域,达到 CCA 级别的方案性能都惨不忍睹。
实战建议: 我一般把 IND-CKA2 作为工业界最低门槛。对标标准文档的话,NIST 最近也开始关注 SSE 的安全模型标准化,虽然还没出正式草案。
2.3.2 泄露函数与延迟的平衡
这里有一个关键概念叫“泄露函数” L。每个方案都会明确定义:搜索过程会暴露哪些信息。例如:
L = (搜索模式, 访问模式, 搜索的密文数量)
搜索模式: 服务器知道你重复搜了同一个词,但不知道词本身。
访问模式: 服务器知道哪些文档被搜到了,且每次搜索都会暴露文档 ID 的集合。
你想想看,如果攻击者先搜“password”,再搜“root”,然后发现这两次搜索的文档集合高度重叠,他就能推理出这两个词大概率是同义的——这就是所谓的“推理攻击”。
我常用的缓解方法: 在索引里引入“填充”——给每个关键词的匹配结果列表里混入假文档标识符,掩盖真实的文档数量分布。
2.4 知识体系全景图
下面这张图帮你把本章的核心逻辑串起来。你可以看到从底层的密码学原语,到上层的安全模型,再到性能取舍,是一条完整的技术栈。
总结本章核心认知: 对称可搜索加密(SSE)是性能之王,但受限于单用户/信任模型;非对称可搜索加密(PEKS)能解决多用户委托场景,但双线性对运算让延迟高了几个量级;安全性模型是一切取舍的基础——选择 IND-CKA2 作为安全基线,并通过泄露函数来定量评估信息暴露的风险。