LWN:使用Rust实现OpenPGP,这就是Sequoia项目!

关注了就能看到更多这么棒的文章哦~

OpenPGP in Rust: the Sequoia project

By John Coggeshall
September 11, 2020
原文来自:https://lwn.net/Articles/830902/
DeepL assisted translation

2018 年,三位 GnuPG 开发者开始着手开发 Sequoia,这是 OpenPGP 在 Rust 中的实现版本。OpenPGP 是一个数据加密的公开标准,通常用于确保电子邮件安全可信。GnuPG 是该标准的一个实现。目前,这个基于 GPLv2 license 的 Sequoia 项目正在向 1.0 版本迈进,只是还有一些问题需要解决。Sequoia 的创始人认为,尽管 GnuPG 是当时 OpenPGP 事实上的标准实现,但是还有许多需要改进的地方。他们希望通过使用一种有助于避免一些常见的内存 bug 的语言来重新实现这个 OpenPGP 规范,从而来解决这些问题。

虽然 GnuPG 是最流行的 OpenPGP 实现——尤其是针对 Linux 来说是这样。但还是有其他的实现的,包括 OpenKeychain、OpenPGP.js 和 RNP。多年来,OpenPGP 一直受到批评(如 2014 年的这篇博文https://blog.cryptographyengineering.com/2014/08/13/whats-matter-with-pgp/ ,以及 2019 年的另一篇博文https://latacora.micro.blog/2019/07/16/the-pgp-problem.html )。Sequoia 项目正在努力构建更现代化的 OpenPGP 工具,以解决许多抱怨。Sequoia 已经被其他几个项目采用了,包括 keys.openpgp.org、OpenPGP CA、koverto、Pijul 和 KIPA。

Sequoia 是由 Neal H. Walfield、Justus Winter 和 Kai Michaelis 发起的。他们每个人都在 GnuPG 上工作了大约两年。在 2018 年的一次演讲中(幻灯片 https://sequoia-pgp.org/talks/2018-08-introduction/sequoia-introduction-deltax.pdf ),Walfield 讨论了他们创建新项目的动机。在他看来,GnuPG 是 "hard to modify,即难以修改的 ",这主要是因为它几十年来的不断增长。Walfield 指出,GnuPG 中各组件之间的紧密耦合和缺乏单元测试是一些具体的问题。他举例指出,GnuPG 命令行工具和相应的应用库的功能并不相同,有些事情只能用命令行工具来完成。

正如 Walfield 在演讲中解释的那样,社区是 Sequoia 项目的重要组成部分。该项目得到了 p≡p(佩普)和 Wau Holland 基金会的资金支持,"所有的开发都是公开进行的"。在代码编写之前,项目创始人就与 OpenPGP 社区的知名成员以及最终用户会面,讨论项目的计划,并确保他们的方法是合理的。项目目前的状态、Git 仓库和问题跟踪系统都可以使用。仓库日志显示,该项目大约有 30 个贡献者,自从宣布 2020 年 4 月即将发布 1.0 版本以来,已经发布了三个版本。最新的版本 0.19.0 是在 2020 年 8 月发布的,最显著的改进是加入了 Windows Cryptography API: Next Generation(CNG)作为后端,取代了在非 POSIX 环境下存在问题的 Nettle。

因为它是用 Rust 编写的,所以 Sequoia 受益于该语言提供的内存安全的优点。从仓库里的代码可以看出,为了避免功能回退以及提高质量,开发者们在编写单元测试方面做出了很大的努力。与 GnuPG 不同,GnuPG 中命令行的 gpg 工具比 library 功能更强大;而 Sequoia 首先是一个 OpenPGP 库,它的所有功能都可以通过所暴露出来的 API 获得。该项目计划提供两层 API,一个是对 OpenPGP 规范的底层、无意见的实现,另一个则是具有合理默认值的高级 API,以使用户更容易完成签名和签名验证等常见任务。Walfield 的演讲中明确指出,虽然该项目在低级 API 实现上努力做到不偏不倚,但它确实避免了规范中过时的部分,比如 MD5 哈希的使用。

Sequoia 的目标是 "modern platform,即现代平台",包括 Linux、Windows、macOS、Android 和 iOS。在可能的情况下,这包括使用现有的加密工具。项目的目标之一就是能与各个平台上的加密服务紧密集成。例如,Sequoia 计划在有 Secure Enclave 协处理器的 iOS 设备上尽量利用 Secure Enclave。它还提供了一个外部函数接口(FFI,foreign function interface),用于将 Sequoia 与其他语言编写的程序能集成起来。目前,Sequoia 提供了 C 和 Python 的 FFI 绑定。读者们应该注意,使用这些绑定的程序缺乏内存安全保护,因此必须遵循 Sequoia 项目的规则才能确保正确使用。

Walfield 在 Sequoia 开发邮件列表上回复了我的问题,并提供了关于项目当前状态和即将发布的 1.0 版本的信息。

首先,对于我们即将发布的 1.0 版本(随时都可以发布,虽然 API 和功能集已经稳定了好几个月,我们现在只是在对各个地方增加文档,以及仔细 review 这些 API 和代码),我们先只打算发布低级 API,即 sequoia-openpgp crate 及其依赖的内容。

这意味着读者们暂时还不能指望 Sequoia 成为 GnuPG 等工具的最终用户替代品。第一个主要版本将专注于为开发者们提供一个 library。要想让该项目可以供最终用户使用的话,它至少需要一个类似 GnuPG 中 gpg 的命令。对于 Sequoia 来说,这就是 1.0 版本中没能包含的 sq 命令行工具。Walfield 将 sq 描述为 "还缺少许多功能",并解释说在公开发布之前 "我们还很可能需要改变它的交互界面"。

sq 工具并不是 1.0 版本中所唯一缺失的东西。密钥存储服务也仍在开发过程中。根据 Walfield 的说法,这是 1.0 版本发布后项目的最高优先级任务之一。

与其他 OpenPGP 实现相比,密钥存储是 Sequoia 有独特设计的地方之一。为了增加安全性,该项目计划在处理公钥和私钥的服务之间使用进程隔离。使用 Cap'n Proto 来进行进程间通信。Walfield 在演讲中指出,进程隔离并不是在任何情况下都可以实现的,比如在 iOS 环境中就不能做到。当无法实现进程隔离时,Sequoia 计划使用共享的 SQLite 数据库在两个服务之间进行通信,这个过程被 Walfield 描述为 "colocation"。

概念来说上,Sequoia 对其 public keyring 采取了一种基于身份(identity-based)的方法,keyring 被设计成更像是一个按 domain 分类的地址簿,而不是一个 PGP keyring。密钥被设计成根据给用户分配的 Petname 来进行存储和访问,并能够关联任意结构化数据,这些数据将在信任模型(trust model)的实现中发挥作用。Walfield 还认为,这种方法更符合用户对密钥的实际思考方式:是与名称相关联,而不是抽象的 ID 集合。此外,所有的密钥在 Sequoia 中都被分配了一个 "realm, 领域",表示密钥的预期目的。目前的 realm 包括 "contacts, 联系人 "和 "software update key, 软件更新密钥 "等。完全开发完成后,Sequoia 的 keyring 服务将自动根据远程服务器(类似于 parcimonie)来更新 public key,确保及时发现新的子密钥(sub-keys)和密钥撤销等变化。API 文档显示,除了更常见的 TLS 加密方法外,还可以使用 Tor 等匿名服务来实现。

private keyring 服务则计划提供一个可选的单密码解决方案来解锁本地密钥。该库将使用 Walfield 所描述的 "类似智能卡 "的 API 提供对 private keyring 的访问。目前 Sequoia 并不支持智能卡,但根据这个 ticket(https://gitlab.com/sequoia-pgp/sequoia/-/issues/114 ),社区希望未来能看到这个功能。Sequoia 的 private keyring service 在编写时将会考虑到 forward secrecy,这是通过使用 OpenPGP 规范来支持 "at rest"(加密存储)和 "in motion"(加密传输)的数据之间的区别,这在许多其他的 OpenPGP 实现中是没有的。经常更换 "in motion"的密钥是一种比较稳妥的安全实践,但这需要以一种仍然允许已经归档的加密数据仍旧能够正常解密出来的方式来实现。Winter 的演讲(幻灯片https://sequoia-pgp.org/talks/2018-08-moving-forward/moving-forward.pdf )比较了该项目的 forward secrecy 功能和其他 OpenPGP 中的实现。

Wrapping up

有兴趣参与该项目的人应该知道,它要求贡献者将自己的版权转让给 p≡p 基金会。该项目进一步指出,代码最终可能会以多种许可证的形式发布,但 "所有软件也都以 GNU 许可证作为自由软件发布,没有例外"。

总的来说,很高兴看到有一个项目专注于让 OpenPGP 成为一种更容易使用的技术,而且看起来这个项目自近三年前开始以来已经取得了稳步的进展。项目的文档也为在应用程序中使用这个 library 提供了一个合适的上手步骤。尽管如此,Sequoia 在成为一个值得信赖的加密工具之前还有一段路要走。首先,代码仍然需要接受 audit。该项目的状态页面表示,它 "还没有被审计(audited),但只要我们发布了 Sequoia 核心 crate,就会有第三方来 audit。" 读者们可能会有兴趣查看项目的贡献者页面,该页面提供了他们的邮件列表和 IRC 频道的详细信息。正如 Walfield 所说,Sequoia1.0 版本何时落地还没有时间表,但听起来确实很快了。不过,OpenPGP 的终端用户还需要再等一段时间,才能让 Sequoia 成为一个切实可行的替代品。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值