OpenPGP在Rust:Sequoia项目中被重写



加利福尼亚州奥尔德克里克的红杉斯塔格(Sequoia Stagg)



2018年,三名前GnuPG开发人员开始从事红杉项目的工作,该项目是Rust中OpenPGP的实现。如您所知,OpenPGP是一种开放数据加密标准,通常用于安全电子邮件。GnuPG是该标准的参考实现。



开发人员自己说明了创建新的OpenPGP库动机:



  • GnuPG很难修改。代码和API已经累积了21年以上。没有单元测试。这些组件彼此紧密相关。该架构还有很多不足之处,简单的重构无济于事。

  • 许多开发人员对GnuPG API不满意。GnuPG命令行工具和相应的编程库具有不同的功能,其中某些命令仅可从命令行使用。

  • Rust是一种内存安全的语言,可以自动消除所有类型的错误。

  • 由于GPL限制,无法在iOS上使用GnuPG。


尽管仍有许多问题需要解决,但 GPLv2许可的红杉图书馆现在正在接近1.0版



GnuPG批评



新的库应该没有GnuPG的缺点。尽管应注意,除了OpenPGP的“参考”实现外,还有其他一些实现,包括OpenKeychainOpenPGP.jsRNP



GnuPG已受到批评多年。它以其荒唐的复杂性,通用的瑞士刀设计而受到批评:GnuPG所做的一切,但都做得不好,包括数字签名,密码保护,公钥加密,安全文件传输,数据包签名,备份保护,聊天消息等。 .d。人们认为,在现代时代,需要专用工具:用于安全消息传递的单独的库,用于签名程序包的单独的库,用于加密文件的单独的(作为实用程序)用Rust写的愤怒)等等。并非所有这些实用程序都需要完全符合PGP。



有人批评OpenPGP努力向后兼容90年代的密码,这意味着默认设置不符合现代的最佳实践,因为强密码和安全性始终可以通过协商协议来实现。问题在于不可能同时保持向后兼容性并遵守现代安全密码技术。



我们已经提到了垃圾代码:“事实上的标准PGP实现是GnuPG。这个程序不是很整齐。有一个广泛的C代码库-一种具有重复功能的语言(例如,最近对SKS解析的拒绝服务攻击说它具有多个密钥解析器),并且CVE记录很长,从内存损坏到加密攻击通过侧面通道。有时,可以在不通知GnuPG的情况下从消息中删除身份验证。您可能没有正确的指纹就给他喂了钥匙。Latacora写道:“在2018年,Efail漏洞是由GnuPG根据要求提供未经身份验证的纯文本导致的。”



另一个问题是可用性。



几年前,进行了一项PGP可用性研究,其中一组技术人员被放置在装有计算机的房间中,并要求配置PGP。两个小时后,他们都还没有出来。-泰德Unangst,OpenBSD和LibreSSL开发


其他抱怨包括长期保存同一密钥,不安全的MDC密文身份验证系统,缺乏前向保密性以及笨拙的巨型密钥。



红杉项目



LWN写道,红杉是一种现代的OpenPGP工具包,可以解决许多此类问题。红杉已经被其他几个项目采用,包括keys.openpgp.orgOpenPGP CAkovertoPijulKIPA



该项目由p≡p(pep)和Wau Holland基金会资助,所有开发都是开源的。



新库专注于安全性和正确性,同时使用最可靠的现代加密技术。开发人员承诺提供强大的工具,包括命令行程序和Git风格的子命令。



$ echo hi | sq encrypt --recipient neal
-----BEGIN PGP MESSAGE-----
wcBMA8K4GQVsZSWYAQgAllrQ+9490eoFdB/jLrVvGl+IVtGJWPFDg9uhcl0D8k05
AWz8ZU2sd6GzoCH1nRpwASJWHxloNbPgvxhNRRVReg3GgfFwMkcoNJ2Xb4zocvx+
niH7ZlP9Py6kseuqtjhQZEyvtIfWc58TK9DRdPp5suzS3Y9Zbew9vC2N2u+8YsKL
BbbminTZqLYbt/00ZT/ZuDbtHhoDUxlnCK2Y2R6NZvuvwS1ujI0EOfdOagZO0z5k
hs8U9Xgk1/BWpQtKn3ygMDO0401nBBbwNgialcu/8yFS+wXoifRaj60Cbxhjv2/G
aTcl9loYpN93BL0a7EbKmcwDl14HwosKdkMj4Px25dI0AZjLxI7TBX18e+hBu5vr
q83G7aEwllpiDU3z+rFXBjsWDOwP2UBf05D/Bl05eSYx4x7UnQ==
=qAvC
-----END PGP MESSAGE----- 


已经实现了用于解析器和数据包检查的清晰界面,以及十六进制转储,现在可以在在线演示中查看这些界面



$ sq packet dump --hex message.pgp
New CTB, 13 bytes: One-Pass Signature Packet
Version: 3
Type: Binary
Pk algo: EdDSA Edwards-curve Digital Signature Algorithm
Hash algo: SHA512
Issuer: 83F8 2E4F E9A5 E098
Last: true

00000000 c4 0d frame
00000002 03 version
00000003 00 sigtype
00000004 0a hash_algo
00000005 16 pk_algo
00000006 83 f8 2e 4f e9 a5 e0 98 issuer
0000000e 01 last 


与GnuPG不同,后者的gpg命令行工具比库更强大,而Sequoia主要是一个库。它的所有功能都可以通过开放的API获得。该项目计划提供两个API“层”:OpenPGP规范的低级实现和具有合理默认值的高级别API,以使用户可以更轻松地执行诸如签名包和验证签名之类的常见任务:



$ sqv --trace --keyring tails-signing.key \
tails-amd64-3.11.iso.sig tails-amd64-3.11.iso
Will check signature allegedly issued by A8B0 F4E4 5B1B 50E2.
Found key A8B0 F4E4 5B1B 50E2.
Checking signature allegedly issued by A8B0 F4E4 5B1B 50E2.
Signature by A8B0 F4E4 5B1B 50E2 is good.
A490 D0F4 D311 A415 3E2B B7CA DBB8 02B2 58AC D84F
1 of 1 signatures are valid (threshold is: 1).
$ echo "Just check the exit status: $?"
Just check the exit status: 0 


尽管OpenPGP规范的执行水平较低,但是开发人员已经消除了一些过时且危险的标准,例如MD5哈希。



甚至在该计划开始之前,该项目的创始人就已经与OpenPGP社区的知名成员和最终用户会面,讨论该项目的计划,并确保他们的方法确实合理。现在正在积极发展。从存储库跟踪器中的条目来看,大约有30位参与者,并且自2020年4月宣布准备1.0版以来已经发布了三个版本。最新版本0.19.0于2020年8月发布-最显着的改进是集成了Windows密码API:下一代作为后端(CNG)而不是Nettle,它在非POSIX环境中存在问题。



为了增加安全性,红杉计划在公钥和私钥服务之间使用流程分隔(如在gpg-agent中一样)。在这里,对于进程间通信,引入了Cap'n Proto序列化协议-这类似于协议缓冲区,只是速度更快。



在演示中,开发人员指出,例如在iOS环境中,进程的分离并非总是可能的。当不可用时,作为一种共置,红杉计划使用共享的SQLite数据库在流程中的服务之间进行通信。



红杉在公共钥匙串上采用了概念上不同的方法:它们被设计为“更像是通讯录,而不是PGP钥匙串”。密钥由用户标识符(petname存储,并具有绑定任意结构化数据的功能,这些数据可用于实现信任模型。开发人员说,这种方法更符合用户实际表示键的方式:它们与名称关联,而不是一组抽象标识符。这是红杉与其他OpenPGP实现不同的地方。



此外,所有键均分配有一个“领域”,以指示该键的预期用途。当前支持两个领域:“联系人”和“软件更新密钥”。



密钥 链会从远程服务器(类似于parcimonie自动更新,以及时跟踪更改,新的子密钥和密钥撤销。该文档指出,除更常见的TLS加密方法外,还可以使用匿名服务(例如Tor)来完成此操作。



红杉的私人钥匙串实施将支持向前保密通过OpenPGP规范,在许多其他库中未实现。这些规范可以区分“静止”数据(加密存储)和“活动”数据(加密传输)。从安全的角度来看,最好定期“更改”数据的密钥,但保留“静止”解密数据的能力。开发商之一Justus Winter演讲将红杉的前向保密功能与其他OpenPGP实现进行了比较。



防锈优点



红杉利用了Rust所有内存安全优势迈克尔·希克斯 Michael Hicks)



在一篇文章中普遍解释了什么是内存安全性简单来说,这意味着程序在任何状态下都不能访问无效的内存。这些是以下错误:



  • 缓冲区溢出;

  • 解引用空指针;

  • 释放内存后保存指针(释放后使用);

  • 使用未初始化的内存;

  • 程序尝试释放同一单元两次(两次释放)。


违反内存安全性会导致漏洞,例如数据泄漏和远程代码执行。虽然某些语言已经以内存安全的名义对性能下降表示屈服,但Rust的所有权概念可确保安全性并最大程度地减少开销。



基于Sequoia的当前发展,正在付出巨大的努力来编写单元测试以防止回归并提高代码质量。



红杉的目标是“现代平台”,包括Linux,Windows,macOS,Android和iOS,充分利用现有的加密工具。该项目的目标是与特定平台的加密服务紧密集成。例如,在iOS设备上,计划使用Secure Enclave协处理器有空的时候。红杉还提供了一个外部功能接口(FFI),用于将项目与其他语言编写的程序集成在一起。当前提供了与Python和C的绑定(绑定),但是,应注意的是,具有这些绑定的程序被剥夺了Rust内置的内存安全性,因此已经发布了正确处理内存使用的特殊规则





红杉成分



对未来的计划



版本1.0的发布可能会在不久的将来进行,尽管最初仅会发布低级API,即sequoia-openpgp包及其依赖项。这意味着Sequoia尚未替代所有用户使用的GnuPG之类的工具:第一个主要版本将重点放在开发人员库上。红杉开发人员需要完成sq1.0版中不会包含的命令行工具。此外,密钥存储服务仍在开发中-与命令行工具一起,这是1.0版发布后项目的主要优先事项之一。



总体而言,很高兴看到一个项目试图使OpenPGP易于使用和访问。可以看出,三年多来,开发商取得了长足的进步。该文档允许您在应用程序中使用此库。但是,红杉成为可靠的加密工具之前还有很长的路要走。最重要的是,需要对代码进行审核。该项目页面说它尚未经过审计,但是“一旦我们释放了主要的红杉木箱,它将被第三方审计。” 尚未宣布1.0版的发布日期,但看起来即将发布。






广告



为程序员提供的VDS具有最新的硬件,攻击防护和多种操作系统。最大配置为128个CPU内核,512 GB RAM,4000 GB NVMe。






All Articles