---
author: Daniel Huigens
category: 技术
comments_data: []
count:
  commentnum: 0
  favtimes: 0
  likes: 0
  sharetimes: 0
  viewnum: 3073
date: '2021-10-16 11:57:31'
editorchoice: false
excerpt: OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库，最常用于电子邮件加密。
fromurl: https://opensource.com/article/21/10/openpgpjs
id: 13888
islctt: true
largepic: /images/p/202110/16/115721k1vi1ekzip1kpqkg.jpg
permalink: /article-13888-1.html
pic: /images/p/202110/16/115721k1vi1ekzip1kpqkg.jpg.thumb.jpg
related: []
reviewer: wxy
selector: lujun9972
summary: OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库，最常用于电子邮件加密。
tags:
- OpenPGP
- 邮件
thumb: false
title: 最新 OpenPGP.js 版本的 3 个新功能
titlepic: true
translator: geekpi
updated: '2021-10-16 11:57:31'
---


> 
> OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库，最常用于电子邮件加密。
> 
> 
> 


![](/images/p/202110/16/115721k1vi1ekzip1kpqkg.jpg "email or newsletters via inbox and browser")


[OpenPGP.js](https://github.com/openpgpjs/openpgpjs) 是一个实现了 [OpenPGP 标准](https://tools.ietf.org/html/rfc4880) 的密码学库，最常用于电子邮件加密。ProtonMail、Mailvelope 和 FlowCrypt 都使用 OpenPGP.js，这还仅仅是其中一些。也就是说 OpenPGP.js 库对数百万用户的信息进行了加密。


OpenPGP 标准首次发布于 20 世纪 90 年代，像几乎任何东西一样，需要维护和更新，以保证安全和可用性。该标准的“加密刷新” [正在进行中](https://datatracker.ietf.org/doc/charter-ietf-openpgp/)，它增加了现代的加密算法并废除了过时的算法。为了提高可用性，各种电子邮件应用程序现在允许用户无缝加密他们的通信，用户无需管理他们的密钥或他们的联系人的密钥。


OpenPGP.js 于 2014 年首次发布，开始基于一个名为 GPG4Browsers 的早期原型，该原型基于 Herbert Hanewinkel（以及其他贡献者）的几个脚本。OpenPGP.js 的第二个版本于 2016 年发布，完全重新设计，使用 Uint8Arrays 而不是字符串（这大大增加了其性能），并在内部使用现代 ES6 模块而不是 CommonJS 模块。第 3 和第 4 版都是在 2018 年发布的，分别增加了对椭圆曲线加密法（ECC）和流的支持。


我和我的团队继续在 OpenPGP.js 上工作，以确保其发展为一个易于使用的强加密库。


### 1、默认的椭圆曲线加密


在 OpenPGP.js 第 4 版中，生成新密钥时默认使用 RSA。虽然 ECC 更快、更安全，但 Curve25519 还没有在 OpenPGP 规范中得到标准化。加密刷新草案包括了 Curve25519，并且预计它将“按原样”包含在下一版本的 OpenPGP 规范中，因此 OpenPGP.js 第 5 版现在默认使用 ECC 生成密钥。


### 2、只导入你需要的模块


同样，虽然 OpenPGP.js 内部使用 ES6 模块多年，但第 4 版仍然没有发布一个合适的 ES6 模块。相反，它只发布了一个<ruby> 通用模块定义 <rt>  Univeral Module Definition </rt></ruby>（UMD）模块，可以在浏览器和 Node.js 上运行。在第 5 版中，这种情况有所改变，为浏览器和 Node.js 发布了单独的模块（包括 ES6 和非 ES6），使库用户更容易在所有平台上导入 OpenPGP.js ，且（当使用 ES6 模块时）只导入他们需要的部分。这在很大程度上是通过将构建系统切换到 [rollup](https://rollupjs.org/) 来实现的。


### 3、拒绝弱加密技术


还有许多其他的安全改进。例如，1024 位 RSA 密钥、ElGamal 和 DSA 密钥被认为是不安全的，并被默认拒绝。此外，第 4 版已经默认使用 AES 加密，第 5 版现在完全默认拒绝使用较弱的算法进行加密，即使公钥声称只支持较弱的算法。相反，它假定所有的 OpenPGP 实现都支持 AES（这种情况已经存在很长时间了）。


### OpenPGP.js 的下一步是什么？


展望未来，有一些安全方面的改进要做。用于识别公钥的密钥指纹仍然使用 SHA-1，尽管在加密技术更新中计划对此进行修复。同时，建议使用不同的方法来确定用于加密的任何公钥的真实性，例如使用提议的 <ruby> <a href="https://datatracker.ietf.org/doc/html/draft-koch-openpgp-webkey-service">  网络密钥目录 </a> <rt>  Web Key Directory </rt></ruby>（WKD）标准直接从收件人的域中获取整个密钥，这已经由各种 [电子邮件提供商](https://wiki.gnupg.org/WKD#Mail_Service_Providers_offering_WKD) 实现。WKD 支持内置于 OpenPGP.js 第 4 版，但在第 5 版中是一个单独的模块，以保持主库的精简。


同样，当用密码而不是公钥加密信息或文件时（例如：在使用 OpenPGP 进行电子邮件加密时不常见，但在用于加密备份时更常见），密码会使用相对较弱的<ruby> 密钥衍生函数 <rt>  Key Derivation Function </rt></ruby>（KDF）转换为对称密钥。因此，建议应用在将用户的密码传递给 OpenPGP.js 之前，先通过一个强大的 KDF，如 [Argon2](https://en.wikipedia.org/wiki/Argon2) 或 [scrypt](https://en.wikipedia.org/wiki/Scrypt)。希望加密刷新草案会包括这些算法中的一种，以便在未来的 OpenPGP.js 版本中实现。


### 如何使用 OpenPGP.js 第 5 版


不过现在，OpenPGP.js 第 5 版已经 [发布](https://www.npmjs.com/package/openpgp) 到 npm 仓库。如果你喜欢，可以随时试用！欢迎在 GitHub 的 [讨论版](https://github.com/openpgpjs/openpgpjs/discussions) 中进行反馈。然而，请注意，虽然 OpenPGP.js 是一个通用的加密库，但它的主要使用情况是在需要与 OpenPGP 规范兼容的情况下（例如，在发送或接收 PGP 加密的电子邮件时）。对于其他的使用情况，不同的库可能是一个更合适或性能更好的选择。当然，总的来说，在尝试使用任何加密技术时都要小心。


感谢阅读，这里是保护电子邮件的未来！




---


via: <https://opensource.com/article/21/10/openpgpjs>


作者：[Daniel Huigens](https://opensource.com/users/twiss) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出