2. 密文检索的密码学基础
密文检索平台并不是把明文数据库简单“加密后存起来”,而是在密文之上继续完成索引、匹配、排序与结果解密。要做到这一点,必须先把四类密码学原语的角色分清:对称加密负责高效保护数据本体,非对称加密负责密钥分发与身份绑定,哈希函数负责确定性映射与完整性校验,伪随机函数(PRF)负责把关键词变成可检索、可比较的“陷门令牌”。安全模型则回答一个更根本的问题:攻击者在看到密文、索引和查询令牌后,究竟能推断出什么。
一、对称加密:数据本体的高效保护层
对称加密使用同一把密钥完成加密与解密,典型算法有 AES-128、AES-256,工作模式常用 GCM、CBC。在密文检索中,文档正文、文件块、字段值通常用对称加密保护,因为它的吞吐量远高于非对称加密。以 AES-256-GCM 为例,加密时输入为 256 位密钥、96 位随机 nonce、明文和附加认证数据(AAD),输出为密文与 128 位认证标签。AAD 可以绑定文档 ID、版本号或租户标识,防止密文被跨文档拼接。
需要特别注意的是:对称加密本身不提供可检索性。AES 的密文是伪随机的,同一个关键词在不同文档中加密后完全不同,无法直接比较。因此,密文检索必须额外构造“可比较的密文形式”,这正是哈希函数与 PRF 的用武之地。对称加密在平台中的定位是:保护数据内容,而不是承担检索匹配。
二、非对称加密:密钥分发与身份绑定
非对称加密使用公钥加密、私钥解密,或私钥签名、公钥验签。RSA-OAEP、ECC(如 secp256r1)是常见选择。在密文检索平台中,非对称加密很少用于加密海量文档,而是用于三类场景:其一,加密对称密钥(即信封加密),例如用用户公钥加密文档的 DEK;其二,对查询令牌或审计日志签名,保证请求来源可信;其三,在多方检索场景中,让数据拥有者用检索方公钥加密陷门,使只有检索方能解开令牌。
这里有一个关键区别:非对称加密解决的是“谁能解密/谁能验证”,而不是“如何高效匹配”。如果把每个关键词都用 RSA 加密,密文长度和计算开销都会迅速膨胀,因此实际系统通常采用“非对称保护密钥、对称保护数据、PRF 构造索引”的分层结构。
三、哈希函数:确定性映射与完整性
哈希函数把任意长度输入映射为固定长度输出,具备单向性、抗第二原像和抗碰撞性。SHA-256 输出 256 位,SHA-3 同样常用。在密文检索中,哈希函数有两种典型用法:一是对文档内容做完整性校验,例如存储 SHA-256(文档明文) 用于下载后比对;二是作为构造确定性关键词标识的基础,例如 H(keyword) 可以作为关键词的稳定标识。
但直接使用 H(keyword) 存在严重风险:攻击者可以枚举常见关键词,预先计算哈希表,从而反推关键词。因此,实际系统不会裸用哈希,而是把哈希与密钥结合,形成带密钥的伪随机函数,或使用 HMAC。哈希函数提供的是“确定性”,而安全性必须由密钥引入。
四、伪随机函数:可检索性的核心引擎
伪随机函数(PRF)是一类带密钥的函数,给定密钥 K 和输入 x,输出 F(K, x) 在计算上不可与真随机函数区分。HMAC-SHA256 就是常用的 PRF 实现。在密文检索中,PRF 承担了最核心的角色:把关键词映射为固定长度的检索令牌。例如,数据拥有者计算 token = HMAC(K, "医疗"),检索方用同一密钥计算相同 token,服务器在索引中查找该 token 对应的文档 ID 列表,而服务器始终不知道“医疗”这个明文关键词。
PRF 的关键性质是:同一密钥、同一输入必然得到同一输出,因此可以匹配;没有密钥则无法计算输出,因此无法枚举。这正是“可检索”与“保密”之间的平衡点。实际系统中,PRF 还常与计数器结合,生成多个令牌以支持模糊匹配或分片索引。
五、安全模型:攻击者能看到什么
密文检索的安全模型通常从“攻击者能力”和“泄露函数”两个维度描述。最基础的是选择明文攻击(CPA)下的不可区分性:攻击者即使能选择明文并获得对应密文,也无法区分挑战密文对应哪个明文。对称加密方案若使用随机 nonce,通常可达到 CPA 安全。更强的是选择密文攻击(CCA)安全,要求攻击者在获得解密预言机访问权的情况下仍不能区分,AES-GCM 这类带认证的加密可提供 CCA 级别的保护。
对密文检索而言,仅有 CPA/CCA 还不够,因为检索本身会泄露访问模式(哪些文档被命中)和搜索模式(两次查询是否相同关键词)。因此,可搜索加密的安全模型通常定义泄露函数 L = (L_search, L_access),并证明方案除了泄露函数所允许的信息外,不泄露其他内容。常见的泄露包括:查询令牌长度、命中文档数量、命中文档 ID 集合、查询重复性。理解这一点非常关键:密文检索不是“零泄露”,而是“可控泄露”。平台设计者必须评估这些泄露是否可被接受,并通过填充、批量查询、缓存或差分隐私等手段降低风险。
六、四类原语在平台中的协作关系
把上述内容串起来,一个典型的密文检索流程如下:数据拥有者用 AES-256-GCM 加密文档正文,得到密文 C;用 HMAC-SHA256 对每个关键词计算令牌 t = HMAC(K, w),构建“令牌 → 文档 ID”的倒排索引;用 SHA-256 计算文档指纹用于完整性校验;用检索方公钥加密 DEK 或对查询令牌签名,完成密钥分发与身份绑定。检索方输入关键词 w,本地计算 HMAC(K, w),把令牌提交给服务器;服务器在索引中查找匹配的文档 ID,返回加密文档;检索方用私钥解出 DEK,再解密正文,并用哈希指纹验证内容未被篡改。
K 必须与对称加密密钥 DEK 分离,避免一个密钥同时承担加密与索引生成职责。推荐使用 HKDF 从主密钥派生不同用途的子密钥,例如 K_index = HKDF(master, "index")、K_enc = HKDF(master, "enc")。这样即使索引密钥泄露,也不会直接危及文档机密性。
SHA-256(keyword) 作为检索令牌。由于关键词空间通常很小,攻击者可以枚举所有可能关键词并预计算哈希,从而恢复明文关键词。必须使用带密钥的 PRF(如 HMAC)或加盐哈希,且盐/密钥不能公开存储。
七、安全模型选择建议
| 安全目标 | 推荐原语 | 典型参数 | 说明 |
|---|---|---|---|
| 文档机密性 | AES-256-GCM | 256 位密钥,96 位 nonce | 提供 CPA/CCA 安全与完整性认证 |
| 关键词可检索 | HMAC-SHA256 | 256 位 PRF 密钥 | 同密钥同关键词产生相同令牌 |
| 密钥分发 | RSA-OAEP / ECIES | RSA-3072 或 P-256 | 保护 DEK,不直接加密文档 |
| 完整性校验 | SHA-256 | 256 位摘要 | 下载后比对文档指纹 |
| 抗枚举 | HMAC + 随机盐 | 盐长 ≥ 128 位 | 防止关键词字典攻击 |
总结来看,对称加密、非对称加密、哈希函数和 PRF 在密文检索中各有明确分工:对称加密保护数据本体,非对称加密保护密钥与身份,哈希函数提供确定性与完整性,PRF 提供可检索的令牌映射。安全模型则界定了这些原语组合后允许泄露的边界。只有把四者的职责、参数和泄露关系同时纳入设计,才能构建出既可用又可审计的密文检索平台。