Asjdf

一只在杭电摸鱼的小火鸡

浅谈 OPAQUE 安全远程密码

2023-11-06 大约1847字 预计阅读4分钟

继前一篇谈 SAP 协议之后,我们来浅了解一下 OPAQUE。(一个已经被WhatsAPP用于生产的新兴协议)

和 SAP 的建立于“反复打磨”上的安全性不同,OPAQUE 在设计过程中就能证明其安全性——这是经过数学证明的。

OPAQUE 被称为强 aPAKE,它通过在服务器上使用秘密加盐哈希来抵抗预计算攻击。OPAQUE 由 Stanislaw Jarecki、Hugo Krawcyzk 和 Jiayu Xu 于 2018 年提出并正式分析。OPAQUE 名称是两个加密协议名称的组合:OPRF 和 PAKE。从前一篇文章中我们已经知道 PAKE,但什么是 OPRF?OPRF 代表 Oblivious Pseudo-Random Function(遗忘伪随机函数),与盲签名有相似之处:一方对另一方提供的数据做运算,却不知道对方输入的具体内容。可以类比为将文件放入信封,对方在信封外做运算,而不知道信封内的具体内容。

OPRF 与非对称加密有何不同?

两者容易混淆,但解决的问题不一样:

  • 非对称加密(公钥密码):有一对公钥/私钥。任何人用公钥加密数据,只有私钥持有者能解密;或者私钥持有者用私钥签名,任何人用公钥验证。核心是「编解码」:一方知道明文并产生密文,另一方用私钥恢复明文。加密方(或验证方)是知道明文的。

  • OPRF:是一个两方协议,不是简单的加密或解密。一方(服务端)持有密钥 (k),另一方(客户端)持有输入 (x)(例如密码)。双方交互后,只有客户端得到输出 (F(k, x)),服务端既不知道 (x),也不知道最终的 (F(k, x))。也就是说,没有任何一方同时知道「输入 + 输出」——服务端只知道 (k),客户端只知道 (x) 和 (F(k, x))。核心是「在隐藏输入的前提下,让客户端得到与密钥绑定的伪随机结果」。

因此:非对称加密用来保密传输身份认证;OPRF 用来在不把密码交给服务端的前提下,让客户端得到一个由服务端密钥与密码共同决定的秘密(常用于 PAKE 里从密码派生密钥)。OPAQUE 正是先用 OPRF 从密码安全地导出密钥,再结合非对称密钥做认证与密钥交换。

OPAQUE 如何运作?

您可以在这里查看 OPAQUE 的最新草案以及进展。

OPAQUE 由两个阶段组成,即凭证注册和通过密钥交换登录。

注册

在注册之前,用户首先注册服务并选择用户名和密码。注册从我们刚刚描述的 OPRF 流程开始:Atom(客户端)和 服务端进行 OPRF 交换。交换的结果是客户端获得了一个随机密钥rwd,该密钥源自 OPRF 输出F(key, pwd),其中 key 是服务端专为 Atom 生成的 OPRF 密钥,pwd是 Atom 的密码。

在服务端发出的 OPRF 消息中,服务端发送他的 OPAQUE 身份的公钥。然后,Atom(客户端) 生成一个新的私钥/公钥对,这将是 Atom 为服务端提供的持久不透明身份,并使用rwd加密 Atom 的私钥和服务端的公钥(我们将结果称为加密信封)。然后Atom(客户端)将此加密信封连同他的公钥(未加密)发送给服务端,服务端将他提供的数据以及 Atom 的特定 OPRF 密钥秘密存储在按他的用户名(或是其他如邮箱、uid之类)索引的数据库中。

登录

登录和注册非常相似。它的启动方式与注册相同——使用 OPRF 流。然而,在服务器端没有生成新的 OPRF 密钥,而是查找服务端在 Atom 注册期间创建的密钥。通过查找 Atom 的用户名(或是其他唯一ID)并检索她的记录来做到这一点。该记录包含她的公钥、她的加密信封以及服务端给 Atom 的 OPRF 密钥。

除此之外,服务端还发送了加密的信封,Atom 可以使用 OPRF 流的输出来解密该信封。(如果解密失败,Atom(客户端)会中止协议——这可能表明她输入的密码不正确,或者服务端并非其所声称的服务器)。如果解密成功,Atom(客户端)现在就拥有了自己的密钥和服务端的公钥。客户端将这些信息输入到与服务端的 AKE 协议中,而服务端又输入自己的私钥和 Atom 的公钥,从而为双方建立一个共享密钥。

资源

OPAQUE 非对称 PAKE 协议的 IETF 草案 https://datatracker.ietf.org/doc/draft-irtf-cfrg-opaque/

OPAQUE paper https://eprint.iacr.org/2018/163.pdf

OPAQUE 协议的实现

Rust 实现 https://github.com/facebook/opaque-ke 带有 python、php、ruby、lua、zig、java、erlang、golang、js 和 SASL 绑定的 c 实现 https://github.com/stef/libopaque

Go实现 https://github.com/bytemare/opaque/

博客文章

“让我们来谈谈 PAKE”,作者 Matthew Green https://blog.cryptographyengineering.com/2018/10/19/lets-talk-about-pake/

Stefan Marsiske 的“OPAQUE” https://www.ctrlc.hu/~stef/blog/posts/opaque.html

“为什么以及如何使用 OPAQUE 进行用户身份验证”,作者:Stefan Marsiske https://www.ctrlc.hu/~stef/blog/posts/Why_and_how_to_use_OPAQUE_for_user_authentication.html

“如何使用 OPAQUE 设置安全通道”,作者:Stefan Marsiske https://www.ctrlc.hu/~stef/blog/posts/How_to_use_OPAQUE_for_setting_up_a_secure_channel.html

“如何使用 OPAQUE 恢复静态机密”作者:Stefan Marsiske https://www.ctrlc.hu/~stef/blog/posts/How_to_recover_static_secrets_using_OPAQUE.html

Stefan Marsiske 的“遗忘伪随机函数” https://www.ctrlc.hu/~stef/blog/posts/oprf.html

“关于 OPAQUE、SASL、Google、浏览器扩展、隐私和安全”,作者:Stefan Marsiske https://ctrlc.hu/~stef/blog/posts/On_OPAQUE,_SASL,_Google,_browser-extensions,_privacy_and_security.html

Stefan Marsiske 的“宣布 SPHINX” https://www.ctrlc.hu/~stef/blog/posts/sphinx.html

Stefan Marsiske 的“宣布 Klutshnik 项目” https://ctrlc.hu/~stef/blog/posts/Announcing_Project_Klutshnik.html

视频

“通过 OPAQUE 和握手后身份验证进行密码身份验证的 TLS”,作者:EuroCrypt 的 Julia Hesse https://www.youtube.com/watch?v=GL4m7StDsPg

“神奇的 OPRF 以及在哪里可以找到它们”,由 Stefan Marsiske 在 CCC 营 https://media.ccc.de/v/camp2023-57085-fantastic_oprfs_and_where_to_find_them

“OPRF 的力量”,作者:Stefan Marsiske,Camp++ 0x7e7 https://www.youtube.com/watch?v=6-8EVxFGh9M

闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme