土法炼钢兴趣小组的算法知识备份

OPRF (RFC 9497) 详解:遗忘伪随机函数

目录

引言

在现代隐私保护协议中,我们经常遇到这样一个需求:客户端拥有一个输入 \(x\),服务器拥有一个密钥 \(k\),双方希望计算 \(y = F(k, x)\),但有两个严格的隐私限制: 1. 服务器不能知道客户端的输入 \(x\),也不能知道计算结果 \(y\)。 2. 客户端不能知道服务器的密钥 \(k\)

这种原语被称为遗忘伪随机函数(Oblivious Pseudorandom Function, OPRF)。IETF 最近发布的 RFC 9497 标准化了基于素数阶群(Prime-Order Groups)的 OPRF 协议,为隐私计算、无密码认证(如 OPAQUE)和隐私凭证(如 Privacy Pass)提供了坚实的密码学基础。

本文将深入解读 RFC 9497,介绍 OPRF 的核心概念、变体(VOPRF, POPRF)以及其工作原理。

什么是 OPRF?

OPRF 是一个两方协议,参与者为客户端(Client)和服务器(Server)。

这就好比客户端把数据装在一个“信封”里交给服务器,服务器在信封上盖了一个章(用密钥处理),然后把信封还给客户端。客户端打开信封,看到了盖章后的结果,而服务器既没看到信封里的内容,也不知道盖章后的样子。

RFC 9497 定义的三种模式

RFC 9497 不仅定义了基础的 OPRF,还扩展了两种更强大的变体:

  1. Base Mode (OPRF): 最基础的模式,提供上述的隐私功能。适用于服务器是半诚实(Semi-honest)模型的场景。

  2. Verifiable Mode (VOPRF): 可验证的 OPRF。服务器除了计算结果外,还提供一个零知识证明(Zero-Knowledge Proof),证明它确实是使用公钥 \(PK\) 对应的私钥 \(k\) 进行的计算。

    • 用途:防止恶意服务器欺骗客户端(例如,针对不同的用户输入使用不同的密钥,或者返回随机垃圾数据)。客户端可以验证结果的正确性。
  3. Partially Oblivious Mode (POPRF): 部分遗忘的 PRF。允许在计算中包含公开的元数据(public metadata, \(info\))。

    • 计算公式变为:\(y = F(k, x, info)\)
    • 用途:在 Privacy Pass 等应用中,用于绑定特定的上下文信息(如时间戳、域名等),防止令牌被滥用到其他场景。

协议原理 (基于椭圆曲线)

RFC 9497 使用素数阶群(通常是椭圆曲线群,如 P-256, P-384, P-521, ristretto255, decaf448)来实现。其核心思想是盲化(Blinding)

以下是 Base Mode 的简化流程:

  1. Setup: 服务器拥有私钥 \(k\) (标量),公钥 \(Y = k \cdot G\) (虽然 Base Mode 不一定需要公钥,但在 VOPRF 中需要)。

  2. Blind (客户端): 客户端想要计算输入 \(x\) 的 OPRF 值。

    • 将输入 \(x\) 映射到群上的一个点 \(H(x)\)
    • 生成一个随机标量 \(r\) (盲化因子)。
    • 计算盲化后的点 \(M = r \cdot H(x)\)
    • 发送 \(M\) 给服务器。
  3. Evaluate (服务器): 服务器收到 \(M\)

    • 使用私钥 \(k\) 进行计算:\(Z = k \cdot M\)
    • 发送 \(Z\) 给客户端。 注:由于 \(M\) 是盲化的,服务器无法从 \(M\) 推导出 \(H(x)\)\(x\)
  4. Unblind (客户端): 客户端收到 \(Z\)

    • 注意到 \(Z = k \cdot (r \cdot H(x)) = r \cdot (k \cdot H(x))\)
    • 客户端计算 \(N = r^{-1} \cdot Z\)
    • 展开来看:\(N = r^{-1} \cdot r \cdot k \cdot H(x) = k \cdot H(x)\)
    • 最终输出 \(y = \text{Hash}(x, N)\)

通过这个过程,客户端得到了 \(k \cdot H(x)\),即 PRF 的核心部分,而服务器只看到了随机点 \(M\)

OPRF Protocol Flow

VOPRF 的增强

在 VOPRF 中,服务器在 Evaluate 阶段不仅返回 \(Z\),还返回一个 DLEQ (Discrete Logarithm Equivalence) 证明。 该证明向客户端保证:\(Z\) 相对于 \(M\) 的离散对数,等于公钥 \(Y\) 相对于基点 \(G\) 的离散对数。即证明服务器确实用了私钥 \(k\)

应用场景

1. OPAQUE 协议 (RFC 9807)

OPAQUE 是目前最先进的非对称 PAKE 协议。它利用 OPRF 来确保存储在服务器上的“加密后的密码文件”只能被拥有正确密码的用户解密。 - 用户输入密码 \(pwd\),通过 OPRF 得到 \(K_{rw} = F(k, pwd)\)。 - 这个 \(K_{rw}\) 作为解密密钥,用来解密用户的私钥和其他资料。 - 服务器因为不知道 \(pwd\),所以无法计算 \(K_{rw}\),也就无法解密用户数据。 - 即使数据库泄露,攻击者没有 \(k\) 也无法进行离线字典攻击。

2. Privacy Pass (隐私通行证)

用于减少验证码(CAPTCHA)的频率。 - 用户在一个网站通过验证后,获得一组盲化的令牌(Tokens)。 - 网站(服务器)对令牌签名(OPRF Evaluate)。 - 用户去盲(Unblind)后获得签名过的令牌。 - 将来用户访问其他网站时,出示这个令牌。验证者可以验证令牌是合法的,但无法追踪这个令牌是何时、由谁获取的(因为服务器签名时看到的是盲化数据)。

3. 隐私集合求交 (PSI)

两个公司想要找出共同的用户 ID,但不想泄露各自的非共同用户。 - 公司 A 持有密钥 \(k\),作为 OPRF 服务器。 - 公司 B 持有用户列表,作为 OPRF 客户端。 - B 将所有用户 ID 盲化后发给 A。 - A 计算 OPRF 结果发回给 B。 - B 去盲得到 \(F(k, ID)\) 集合。 - A 自己也计算本地用户的 \(F(k, ID)\) 集合并发给 B(或者 A、B 交换角色再做一次)。 - 双方比较 \(F(k, ID)\) 即可找到交集,且不会泄露其他信息。

总结

RFC 9497 标准化的 OPRF 是现代应用密码学中的一块重要拼图。它巧妙地平衡了计算能力与数据隐私,使得“利用服务器的密钥处理数据”与“不让服务器看见数据”这两个看似矛盾的目标得以同时实现。随着 Web 隐私需求的提升,我们将会看到越来越多基于 OPRF 的应用落地。


参考资料: - RFC 9497: Oblivious Pseudorandom Functions (OPRFs) using Prime-Order Groups - RFC 9807: The OPAQUE Augmented Password-Authenticated Key Exchange Protocol


By .