it编程 > 编程语言 > Delphi

End Of Live OpenSSL 1.1 vs Slow OpenSSL 3.0

190人参与 2024-05-27 Delphi

end of live openssl 1.1 vs slow openssl 3.0

【英文原文】
你可能已经注意到,openssl 1.1.1 系列将于下周一(2024 年 5 月 27 日)达到寿命终止(eol)……
最明智的选择是尽快切换到 3.0 或 3.1 版本。

当然,我们的 mormot 2 openssl 单元在 1.1 和 3.x 分支上运行,并在运行时自适应每个分支之间存在的各种 api 不兼容性。
但我们也发现,切换到 openssl 3.0 可能会导致性能大幅下降……那么你需要使用哪个版本呢?
openssl 1.1 将寿命终止

众所周知,广泛使用的 openssl 1.1.1 系列将于 2023 年 9 月 11 日(下周一)达到寿命终止(eol)。:(
openssl 1.1.1 的用户应该考虑他们的选择,并计划他们可能需要采取的任何行动。

请注意,indy 用户仍然停留在 openssl 1.0 分支,甚至 1.1 还没有正式支持。一些替代的 io 处理程序能够在一定程度上使用最新版本。
indy 用户应该转而使用支持更好的库,比如我们的小 mormot。

还要注意的是,1.1 和 3.x 之间存在一些 api 不兼容性。函数被重命名,甚至被删除;出现了新的上下文构造函数;一些参数类型甚至发生了变化!
我们的单元试图在运行时解决所有这些问题,并针对 openssl 库的多个版本进行了测试,以确保您不必担心这些低级问题。

openssl 3.x 的好处

随着 openssl 3.0 的发布,开发人员对库的内部进行了大规模的重构。
公平地说,openssl 的 1.x 源代码有点混乱,难以维护。最大的 it 公司甚至创建了自己的分支或切换到其他库。最著名的是 boringssl,由 google 维护,并在 chrome 和 android 等中使用。
因此,进行重构是时候了,特别是对于像 openssl 这样对许多项目至关重要的库。

在新的 3.x 分支中,许多低级 api 函数已被弃用。
实际上,您不再直接访问库的内部结构,现在应该始终使用高级 api 来访问上下文属性或执行处理方法。例如,低级的 aes_encrypt 函数不再可用:从现在开始,您需要使用高级的 evp_encrypt* api。
官方的迁移指南页面显然非常庞大,如果您想为未来几年使用 openssl 做好准备,值得一读。

openssl 3.0 性能回归

3.0 分支的新代码可能看起来更漂亮,更易于维护,但它也有缺点。新的并不总是更好的。
这个新版本的大多数用户在从 1.x 切换到 3.0 时观察到了巨大的性能回归。它影响了许多项目,来自各种语言,甚至是在性能方面本来就不突出的脚本语言。据报道,时间回归从 3 倍到 10 倍不等。在我们这边,x509 证书操作确实比以前慢得多——最糟糕的是关于 x509 存储。

一些减速是预期的并记录在案(例如 rsa 密钥生成,现在使用 64 轮)。但回归要严重得多。
罪魁祸首似乎不是核心加密代码,如 aes 缓冲区编码(asm 声称在 3.x 分支上进一步优化),而是 openssl 上下文结构本身。它们是为了未来的可维护性而重写的,但没有关注它们的实际性能。

openssl 3.1 的数字

3.1 分支声称已经解决了这些问题中的大部分。

可以肯定的是,我们使用多个版本的 openssl 运行 mormot 加密回归测试。实际上,openssl 3.1 比 openssl 3.0 快得多,但仍落后于 openssl 1.1。

以下是在 win32 上执行整个 ttestcorecrypto 方法时观察到的数字:

openssl 1.1 = 15 秒
openssl 3.0 = 33 秒
openssl 3.1 = 18 秒

有几个方面需要强调:

这些测试还运行了 mormot 引擎加密,因此您不仅仅是在测试 openssl:在上述数字中,“纯 mormot”测试大约需要 4.5 秒;

任何严肃的项目都应该考虑在 win64 上编译,并在 x86_64 linux 上运行服务器 - 在这个平台上,回归确实存在,但只是稍微好一点;

与 ttestcorecrypto.catalog(即证书处理)相比,ttestcorecrypto.benchmark(即原始缓冲区加密)受到的减速影响较小;

我们的测试是单线程的,并且在重度线程化的进程中报告了更严重的减速(高达 x10)。

在 mormot openssl 包装器中,我们尝试尽可能多地缓存上下文。例如,我们不会为每个调用按名称查找 openssl 算法,而是在运行时缓存它以避免任何减速。

但对于 openssl 3.0 来说,这似乎还不够,这可能会影响您的应用程序性能。

支持还是不支持

因此,openssl 3.1 似乎是前进的方向。

在 linux(或其他 posix 系统)上,您可能会使用系统附带的库。

因此,您不必担心使用哪个版本。而且,可悲的是,您的发行版很可能提供 openssl 3.0 而不是 openssl 3.1。

在 windows(或 mac)上,您可以(应该?)使用您“自己的”dll/so 文件,因此您必须考虑库的支持级别。

openssl 3.0 是一个长期支持(lts)版本,将维护到 2026 年 9 月 7 日。

openssl 3.1 将仅支持到 2025 年 3 月 14 日。

这些支持结束日期可能看起来违反直觉,但这是开源项目中的常见方式,最著名的可能是 ubuntu lts 版本。

有关 openssl 支持生命周期的更多信息,请查看官方 openssl 下载页面。

因此,对于大多数项目,特别是在 windows 上,您可能会发布带有自己可执行文件的 openssl dll,切换到 openssl 3.1 可能是前进的方向。

如果您需要为您的产品收集一些安全认证,您可以考虑使用 openssl 3.0 lts 版本,这可能有助于您的认证在更长时间内保持有效。

一如既往,欢迎在我们的论坛上提供任何反馈!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Three Locks To Rule Them All(三把锁统治一切)

05-27

IDocList/IDocDict JSON for Delphi and FPC

05-23

Modern Pascal is Still in the Race (Modern Pascal 仍在竞赛中)

06-01

Safe locks for multi-thread applications(多线程应用程序的安全锁)

06-01

解决升级到 Delphi 12 后遇到 SQLite 不兼容的问题

05-16

delphi JSON序列化(四)

05-16

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论