OpenPGP.js 是一个密码学库,它实现了 OpenPGP 标准,该标准最常用于电子邮件加密。ProtonMail、Mailvelope 和 FlowCrypt 等都使用了 OpenPGP.js。这意味着 OpenPGP.js 库加密了数百万用户的消息。
OpenPGP 标准于 1990 年代首次发布,像几乎所有事物一样,需要进行维护和更新,以确保安全性和可用性。标准的“密码学更新” 正在进行中,它添加了现代加密算法并弃用了过时的算法。为了提高可用性,各种电子邮件应用程序现在允许用户无缝地加密他们的通信——而无需管理他们的密钥或其联系人的密钥。
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 模块。相反,它仅发布了一个通用模块定义 (UMD) 模块,该模块既可以在浏览器中运行,也可以在 Node.js 上运行。在版本 5 中,这种情况发生了变化,它为浏览器和 Node.js 发布了单独的模块(包括 ES6 和非 ES6),使用户可以更轻松地在所有平台上导入 OpenPGP.js,并且(在使用 ES6 模块时)仅导入他们需要的部分。这在很大程度上是通过将构建系统切换到 rollup 实现的。
3. 拒绝弱密码学
还有许多其他的安全改进。例如,1024 位 RSA 密钥、ElGamal 和 DSA 密钥被认为是不安全的,并且默认情况下会被拒绝。此外,虽然版本 4 已经默认使用 AES 加密,但版本 5 现在完全拒绝默认使用较弱的算法进行加密,即使公钥声称仅支持较弱的算法也是如此。相反,它假设所有 OpenPGP 实现都支持 AES(这种情况已经存在很长时间了)。
OpenPGP.js 的下一步是什么
展望未来,还有一些安全改进要做。用于标识公钥的密钥指纹仍然使用 SHA-1,尽管密码学更新中计划对此进行修复。与此同时,建议使用不同的方法来确定用于加密的任何公钥的真实性,例如使用提议的 Web 密钥目录 (WKD) 标准直接从接收者的域中获取整个密钥——该标准已被各种 电子邮件提供商 实现。WKD 支持已构建到 OpenPGP.js 版本 4 中,但在版本 5 中是一个单独的模块,以保持主库的精简。
类似地,当使用密码而不是公钥加密消息或文件时(当将 OpenPGP 用于电子邮件加密时并不常见,但在用于加密备份时更常见),密码将使用相对较弱的密钥派生函数 (KDF) 转换为对称密钥。因此,建议应用程序在将用户的密码传递给 OpenPGP.js 之前,先通过强 KDF(例如 Argon2 或 scrypt)进行处理。希望密码学更新将包含其中一种算法,以便在未来版本的 OpenPGP.js 中实现。
如何使用 OpenPGP.js 版本 5
目前,OpenPGP.js 版本 5 已发布到 npm 包注册表。如果您喜欢,请随时试用!欢迎在 GitHub 上的讨论选项卡中提供反馈。但是请注意,虽然 OpenPGP.js 是一个通用加密库,但其主要用例是在需要与 OpenPGP 规范兼容的情况下(例如,当发送或接收 PGP 加密的电子邮件时)。对于其他用例,不同的库可能是更合适或性能更高的选择。当然,总的来说,在进行任何密码学操作时都要小心。
感谢您的阅读,祝愿电子邮件的未来更加安全!
评论已关闭。