2025-11-15 · cryptography / security
全同态加密(FHE)技术详解
在数据为王的时代,数据隐私和安全变得至关重要。我们希望在利用数据带来价值的同时,保护其不被泄露。传统的数据加密技术(如 AES、RSA)可以有效地保护静态存储和传输中的数据,但一旦需要对数据进行计算或处理,就必须先解密。解密后的数据以明文形式暴露在内存中,极易受到攻击,这在云计算等第三方计算环境中构成了巨大的安全风险。
在传统的用户名 +
密码登录系统中,服务器通常要么直接保存口令派生值(如
salt + hash(password)),要么依赖
TLS+密码的组合来实现认证。一旦服务器数据库被攻破,攻击者就可以对这些口令派生值做离线暴力破解,且整个系统的安全性高度依赖
TLS 与密码派生方案的组合是否正确实现。OPAQUE(The OPAQUE
Augmented Password-Authenticated Key Exchange
Protocol,标准化为 RFC
9807)试图系统性地解决这一问题:在不改变“用户只记一个密码”这一习惯的前提下,让服务器永远看不到明文密码,即使数据库泄露也只能付出与在线猜密码同一个量级的代价。
本文从 RFC 9807 的细节出发,系统介绍 OPAQUE 的设计目标、密码学原理、协议流程、实现要点、密码存储模型以及在实际工程中的落地方式,并配以 SVG 示意图帮助理解。
RFC 9807 将 OPAQUE 定义为一种增强型密码认证密钥交换协议(Augmented PAKE, aPAKE),由 IRTF CFRG 标准化,核心目标是:
hash(password)。从结构上看,RFC 9807 定义了:
简单理解:OPAQUE = OPRF + 密码封装的长程密钥 + AKE(例如 3DH) 的组合,并在 RFC 中给出了强约束的 API 与状态机定义。
与“对称 PAKE”(如 SRP、EKE 等)不同,增强型 PAKE 的核心思想是:
pwd;OPAQUE 在这一思想下进一步强化:
OPRF(Oblivious Pseudorandom Function,不经意伪随机函数)是 OPAQUE 的基石。它允许客户端在不向服务器透露输入(密码)的情况下,获得服务器密钥对该输入的计算结果。
下图展示了 OPRF 的数学原理(基于 Diffie-Hellman 风格的乘法群):
在 OPAQUE 中:
这一步实现了两个关键效果:
有了 \(F_k(pwd)\) 之后,OPAQUE 会:
encryption_key(用于加密信封)、mac_key(用于验证信封完整性)和
export_key(用于应用层密钥导出)。encryption_key 加密后存储在服务器端。在在线认证阶段:
encryption_key,解密
envelope,取回自己的长程私钥;这一结构保证:
下面通过 SVG 图概览 OPAQUE 的注册和认证流程(略去底层数学细节)。
从图可以看到:
以 RFC 9807 的术语略化描述注册流程:
pwd,生成随机盲因子
r,计算
blind = Blind(pwd, r);blind 连同用户名 idU
发送给服务器。k(可全局或按用户区分);eval = OPRF_Evaluate(k, blind)
并返回给客户端,同时返回公共 OPAQUE
参数和自己的“身份材料”(如服务器公钥、配置版本号等)。r 对 eval 去盲得到
oprf_output = Finalize(pwd, r, eval);prk = KDF_extract(salt, oprf_output),okm = KDF_expand(prk, info);okm
派生:encryption_key、mac_key、export_key
等多个子密钥。(skU, pkU),可为签名密钥或 KEM 密钥;skU、用户元数据(如算法、版本)、可能还有服务器公钥绑定信息;encryption_key 通过 AEAD 加密,得到
envelope = AuthEnc(encryption_key, nonce, plaintext, aad);aad (Additional Authenticated Data)
通常包含 pkU
和服务器身份信息,防止重放或替换攻击。record = { idU, envelope, pkU, oprf_public_data, masking_key };masking_key
机制来保护 envelope 免受枚举攻击,即使是合法的 envelope
也需要通过额外的密钥解掩码才能尝试解密。至此,用户注册完成。后续登录将复用相同的 envelope 和 OPRF 参数,无需再次生成长程密钥。
在线登录阶段,OPAQUE 将 “恢复长程密钥” 和 “执行 AKE” 两步紧密耦合在一起:
pwd;r,计算
blind = Blind(pwd, r);{ idU, blind, client_ake_share }
给服务器(通常将 AKE 第一步合并发送)。idU 查表,取出
record;eval = OPRF_Evaluate(k, blind);server_ake_share;{ eval, envelope, server_ake_share, server_identity_proof }。eval 后去盲得到
oprf_output;encryption_key 等;encryption_key 解密
envelope,成功恢复
(skU, pkU);skU
和服务器的公钥进行认证密钥交换(Authenticated Key
Exchange)。session_key 和
session_auth_key。client_auth_mac
给服务器,证明自己成功解开了 envelope 并持有
skU。client_auth_mac;session_key
加密。若用户输入错误密码,则:
oprf_output,从而派生出错误的解密密钥;与传统 hash(password) 模型不同,OPAQUE
中服务器保存的是:
k:用于对盲化密码进行评估;这带来几方面安全优势:
pwd';k 评估 OPRF;oprf_output' 并派生
encryption_key';Argon2id / scrypt
等密码哈希;pwd_stretched = Argon2id(pwd, salt) 作为 OPRF
输入,进一步提高暴力破解难度;下图直观展示了传统“hash 存储”与 OPAQUE envelope 存储的差别:
虽然 OPAQUE 和传统的密码哈希算法(如 Bcrypt, Argon2, Scrypt)都旨在保护存储在服务器端的密码,但它们的安全模型和功能边界有着本质区别。
| 特性 | 传统哈希 (Bcrypt / Argon2) | OPAQUE (RFC 9807) |
|---|---|---|
| 服务器可见性 | 可见 (登录时服务器需接收明文密码或其哈希) | 不可见 (服务器只处理盲化数据,永远不知道密码) |
| 数据库泄露后果 | 离线暴力破解 (攻击者可在本地利用 GPU/ASIC 跑字典) | 无法离线破解 (必须通过 OPRF 密钥在线交互,或先破解 OPRF 密钥) |
| 抗预计算攻击 | 依赖 Salt (盐) | 天然免疫 (依赖 OPRF 密钥和随机数) |
| 认证产出 | 仅布尔值 (登录成功/失败) | 高熵会话密钥 (Session Key) + 认证状态 |
| 前向安全 (PFS) | 无 (除非依赖外部 TLS) | 天然支持 (基于 AKE 的临时密钥协商) |
| 性能开销 | 内存/CPU 密集 (故意变慢以抗破解) | 计算密集 (ECC 点乘) + 网络 (多轮往返) |
目前的最佳实践通常推荐使用 Argon2id,它通过内存困难 (Memory-Hard) 属性来抵御 GPU/FPGA 加速破解。然而,Argon2 仍然存在局限性:
salt 和
hash,他们就可以在自己的设备上无限次尝试猜测密码,唯一的限制是算力。而
OPAQUE 引入了 OPRF 密钥(通常由 HSM
或独立服务管理),攻击者如果没有这个密钥,连“尝试猜测”这一步都做不到(无法计算
F_k(guess))。一种改进传统哈希的方法是使用
Pepper(一个存储在应用代码或 HSM
中的全局密钥)对密码进行
HMAC,然后再哈希:Hash(HMAC(pepper, pwd), salt)。
在工程实践中,一般不建议自己手写底层 OPRF 和 AKE,实现时可以考虑:
opaque-ke、Go 的 bytemare/opaque
等;register,
login,
finish),避免自行拼装消息导致 subtle
bug;k,也可以按租户
/ 应用 / 用户分片;k 时要考虑如何迁移现有
envelope(例如在登录成功时透明迁移到新密钥)。把 OPAQUE 接入现有“账号中心 / IAM 平台”时,典型做法是:
opaque_record 字段,保存
envelope 及相关参数;hash(password) 成功认证;opaque_record;在业务层,你可以把“登录成功”这一事件抽象为:
session_key → 使用该 key 作为输入派生 access
token、refresh token、设备绑定 key 等。OPAQUE 的一个强大特性是除了会话密钥外,还能导出一个 Export Key。这个密钥具有以下特性: - 确定性:只要密码不变,每次登录导出的 Export Key 都是相同的。 - 独立性:与具体的会话无关,服务器无法获知。
应用场景: - 端到端加密存储:可以用 Export Key 加密用户的私有数据(如笔记、钱包私钥)。服务器只负责存储加密后的数据 blob。用户登录时,客户端自动计算出 Export Key 并解密数据。 - 无感数据迁移:即使用户更换了设备,只要密码正确,就能恢复出解密密钥,无需云端备份明文密钥。
OPAQUE(RFC 9807)通过 OPRF + envelope + AKE
的组合,把“记一个密码”这种低熵秘密,升级成了在数学上严谨建模的安全认证与密钥交换协议。它与传统
salt + hash(password)
相比,不仅大幅降低了数据库泄露后的离线攻击能力,而且天然提供高熵会话密钥,可平滑接入
TLS、JWT、API
认证等常见工程组件。对于正在建设或改造账号系统的团队来说,OPAQUE
提供了一个在不牺牲用户体验的前提下,大幅提升密码认证安全性的现代化选项。
把当前热点继续串成多页阅读,而不是停在单篇消费。
2025-11-15 · cryptography / security
在数据为王的时代,数据隐私和安全变得至关重要。我们希望在利用数据带来价值的同时,保护其不被泄露。传统的数据加密技术(如 AES、RSA)可以有效地保护静态存储和传输中的数据,但一旦需要对数据进行计算或处理,就必须先解密。解密后的数据以明文形式暴露在内存中,极易受到攻击,这在云计算等第三方计算环境中构成了巨大的安全风险。
2026-03-20 · cryptography / security
密码学最危险的不是算法被破解,而是正确的算法被错误地使用。本文梳理 7 个真实 CVE 中的密码学工程错误,附代码与修复方案。
2025-07-10 · cryptography / tls
不依赖 OpenSSL,用纯 C 从零实现 TLS 1.3 一次往返握手——X25519 密钥交换、HKDF 密钥派生、AES-128-GCM 加密,一个文件搞定。
2026-12-10 · cryptography / security
从开源库到硬件加速,从等保密评到 DTLS 国密,全面剖析国密生态的技术选型与合规落地路径。
在传统的用户名 +
密码登录系统中,服务器通常要么直接保存口令派生值(如
salt + hash(password)),要么依赖
TLS+密码的组合来实现认证。一旦服务器数据库被攻破,攻击者就可以对这些口令派生值做离线暴力破解,且整个系统的安全性高度依赖
TLS 与密码派生方案的组合是否正确实现。OPAQUE(The OPAQUE
Augmented Password-Authenticated Key Exchange
Protocol,标准化为 RFC
9807)试图系统性地解决这一问题:在不改变“用户只记一个密码”这一习惯的前提下,让服务器永远看不到明文密码,即使数据库泄露也只能付出与在线猜密码同一个量级的代价。
本文从 RFC 9807 的细节出发,系统介绍 OPAQUE 的设计目标、密码学原理、协议流程、实现要点、密码存储模型以及在实际工程中的落地方式,并配以 SVG 示意图帮助理解。
RFC 9807 将 OPAQUE 定义为一种增强型密码认证密钥交换协议(Augmented PAKE, aPAKE),由 IRTF CFRG 标准化,核心目标是:
hash(password)。从结构上看,RFC 9807 定义了:
简单理解:OPAQUE = OPRF + 密码封装的长程密钥 + AKE(例如 3DH) 的组合,并在 RFC 中给出了强约束的 API 与状态机定义。
与“对称 PAKE”(如 SRP、EKE 等)不同,增强型 PAKE 的核心思想是:
pwd;OPAQUE 在这一思想下进一步强化:
OPRF(Oblivious Pseudorandom Function,不经意伪随机函数)是 OPAQUE 的基石。它允许客户端在不向服务器透露输入(密码)的情况下,获得服务器密钥对该输入的计算结果。
下图展示了 OPRF 的数学原理(基于 Diffie-Hellman 风格的乘法群):
在 OPAQUE 中:
这一步实现了两个关键效果:
有了 \(F_k(pwd)\) 之后,OPAQUE 会:
encryption_key(用于加密信封)、mac_key(用于验证信封完整性)和
export_key(用于应用层密钥导出)。encryption_key 加密后存储在服务器端。在在线认证阶段:
encryption_key,解密
envelope,取回自己的长程私钥;这一结构保证:
下面通过 SVG 图概览 OPAQUE 的注册和认证流程(略去底层数学细节)。
从图可以看到:
以 RFC 9807 的术语略化描述注册流程:
pwd,生成随机盲因子
r,计算
blind = Blind(pwd, r);blind 连同用户名 idU
发送给服务器。k(可全局或按用户区分);eval = OPRF_Evaluate(k, blind)
并返回给客户端,同时返回公共 OPAQUE
参数和自己的“身份材料”(如服务器公钥、配置版本号等)。r 对 eval 去盲得到
oprf_output = Finalize(pwd, r, eval);prk = KDF_extract(salt, oprf_output),okm = KDF_expand(prk, info);okm
派生:encryption_key、mac_key、export_key
等多个子密钥。(skU, pkU),可为签名密钥或 KEM 密钥;skU、用户元数据(如算法、版本)、可能还有服务器公钥绑定信息;encryption_key 通过 AEAD 加密,得到
envelope = AuthEnc(encryption_key, nonce, plaintext, aad);aad (Additional Authenticated Data)
通常包含 pkU
和服务器身份信息,防止重放或替换攻击。record = { idU, envelope, pkU, oprf_public_data, masking_key };masking_key
机制来保护 envelope 免受枚举攻击,即使是合法的 envelope
也需要通过额外的密钥解掩码才能尝试解密。至此,用户注册完成。后续登录将复用相同的 envelope 和 OPRF 参数,无需再次生成长程密钥。
在线登录阶段,OPAQUE 将 “恢复长程密钥” 和 “执行 AKE” 两步紧密耦合在一起:
pwd;r,计算
blind = Blind(pwd, r);{ idU, blind, client_ake_share }
给服务器(通常将 AKE 第一步合并发送)。idU 查表,取出
record;eval = OPRF_Evaluate(k, blind);server_ake_share;{ eval, envelope, server_ake_share, server_identity_proof }。eval 后去盲得到
oprf_output;encryption_key 等;encryption_key 解密
envelope,成功恢复
(skU, pkU);skU
和服务器的公钥进行认证密钥交换(Authenticated Key
Exchange)。session_key 和
session_auth_key。client_auth_mac
给服务器,证明自己成功解开了 envelope 并持有
skU。client_auth_mac;session_key
加密。若用户输入错误密码,则:
oprf_output,从而派生出错误的解密密钥;与传统 hash(password) 模型不同,OPAQUE
中服务器保存的是:
k:用于对盲化密码进行评估;这带来几方面安全优势:
pwd';k 评估 OPRF;oprf_output' 并派生
encryption_key';Argon2id / scrypt
等密码哈希;pwd_stretched = Argon2id(pwd, salt) 作为 OPRF
输入,进一步提高暴力破解难度;下图直观展示了传统“hash 存储”与 OPAQUE envelope 存储的差别:
虽然 OPAQUE 和传统的密码哈希算法(如 Bcrypt, Argon2, Scrypt)都旨在保护存储在服务器端的密码,但它们的安全模型和功能边界有着本质区别。
| 特性 | 传统哈希 (Bcrypt / Argon2) | OPAQUE (RFC 9807) |
|---|---|---|
| 服务器可见性 | 可见 (登录时服务器需接收明文密码或其哈希) | 不可见 (服务器只处理盲化数据,永远不知道密码) |
| 数据库泄露后果 | 离线暴力破解 (攻击者可在本地利用 GPU/ASIC 跑字典) | 无法离线破解 (必须通过 OPRF 密钥在线交互,或先破解 OPRF 密钥) |
| 抗预计算攻击 | 依赖 Salt (盐) | 天然免疫 (依赖 OPRF 密钥和随机数) |
| 认证产出 | 仅布尔值 (登录成功/失败) | 高熵会话密钥 (Session Key) + 认证状态 |
| 前向安全 (PFS) | 无 (除非依赖外部 TLS) | 天然支持 (基于 AKE 的临时密钥协商) |
| 性能开销 | 内存/CPU 密集 (故意变慢以抗破解) | 计算密集 (ECC 点乘) + 网络 (多轮往返) |
目前的最佳实践通常推荐使用 Argon2id,它通过内存困难 (Memory-Hard) 属性来抵御 GPU/FPGA 加速破解。然而,Argon2 仍然存在局限性:
salt 和
hash,他们就可以在自己的设备上无限次尝试猜测密码,唯一的限制是算力。而
OPAQUE 引入了 OPRF 密钥(通常由 HSM
或独立服务管理),攻击者如果没有这个密钥,连“尝试猜测”这一步都做不到(无法计算
F_k(guess))。一种改进传统哈希的方法是使用
Pepper(一个存储在应用代码或 HSM
中的全局密钥)对密码进行
HMAC,然后再哈希:Hash(HMAC(pepper, pwd), salt)。
在工程实践中,一般不建议自己手写底层 OPRF 和 AKE,实现时可以考虑:
opaque-ke、Go 的 bytemare/opaque
等;register,
login,
finish),避免自行拼装消息导致 subtle
bug;k,也可以按租户
/ 应用 / 用户分片;k 时要考虑如何迁移现有
envelope(例如在登录成功时透明迁移到新密钥)。把 OPAQUE 接入现有“账号中心 / IAM 平台”时,典型做法是:
opaque_record 字段,保存
envelope 及相关参数;hash(password) 成功认证;opaque_record;在业务层,你可以把“登录成功”这一事件抽象为:
session_key → 使用该 key 作为输入派生 access
token、refresh token、设备绑定 key 等。OPAQUE 的一个强大特性是除了会话密钥外,还能导出一个 Export Key。这个密钥具有以下特性: - 确定性:只要密码不变,每次登录导出的 Export Key 都是相同的。 - 独立性:与具体的会话无关,服务器无法获知。
应用场景: - 端到端加密存储:可以用 Export Key 加密用户的私有数据(如笔记、钱包私钥)。服务器只负责存储加密后的数据 blob。用户登录时,客户端自动计算出 Export Key 并解密数据。 - 无感数据迁移:即使用户更换了设备,只要密码正确,就能恢复出解密密钥,无需云端备份明文密钥。
OPAQUE(RFC 9807)通过 OPRF + envelope + AKE
的组合,把“记一个密码”这种低熵秘密,升级成了在数学上严谨建模的安全认证与密钥交换协议。它与传统
salt + hash(password)
相比,不仅大幅降低了数据库泄露后的离线攻击能力,而且天然提供高熵会话密钥,可平滑接入
TLS、JWT、API
认证等常见工程组件。对于正在建设或改造账号系统的团队来说,OPAQUE
提供了一个在不牺牲用户体验的前提下,大幅提升密码认证安全性的现代化选项。
把当前热点继续串成多页阅读,而不是停在单篇消费。
2025-11-15 · cryptography / security
在数据为王的时代,数据隐私和安全变得至关重要。我们希望在利用数据带来价值的同时,保护其不被泄露。传统的数据加密技术(如 AES、RSA)可以有效地保护静态存储和传输中的数据,但一旦需要对数据进行计算或处理,就必须先解密。解密后的数据以明文形式暴露在内存中,极易受到攻击,这在云计算等第三方计算环境中构成了巨大的安全风险。
2026-03-20 · cryptography / security
密码学最危险的不是算法被破解,而是正确的算法被错误地使用。本文梳理 7 个真实 CVE 中的密码学工程错误,附代码与修复方案。
2025-07-10 · cryptography / tls
不依赖 OpenSSL,用纯 C 从零实现 TLS 1.3 一次往返握手——X25519 密钥交换、HKDF 密钥派生、AES-128-GCM 加密,一个文件搞定。
2026-12-10 · cryptography / security
从开源库到硬件加速,从等保密评到 DTLS 国密,全面剖析国密生态的技术选型与合规落地路径。