What are the benefits to using BIO_printf() instead of printf()?
我一直在审查使用OpenSSL的示例代码,在我找到的每个示例中,创建者都选择使用BIO_printf()将内容写到stdout而不是printf()。
我已经获取了他们的代码,删除了openssl / bio.h标头声明,并将对BIO_printf()的所有调用更改为常规的printf()语句。程序以相同的结果运行。
我要解决的问题是,为什么这些编码员在设置时要比使用printf()花费更多的时间来使用BIO_printf()。您必须包括另一个标头(这将增加程序大小),您需要将文件指针设置为要写入的流。然后,您可以将您的消息打印到stdout。似乎比使用printf()要复杂得多。
当我在BIO_printf()上进行搜索时,它会列出BIO_printf(3)的可能的手册页,但实际上这些页面均未包含任何信息!
我决定对这两种方法进行基准测试。我循环printf("Hey\
"); 1,000,000次。然后我做了BIO_printf(fp,"Hey\
");。我只给BIO_printf()语句计时,而不给文件指针设置时间(这会增加时间)。区别在于printf()比使用BIO_printf()快约4.7倍。
为什么要使用它?有什么好处?据我了解,在编程中您要么希望代码简单或高效,就BIO_printf()而言,两者都不是。
- 以我的经验,OpenSSL函数用于安全性和抽象性。 BIO_printf函数可以保护信息不被泄漏,或者简化BIO结构的使用,或者两者兼而有之。
-
由于OpenSSL的所有问题,因此有一个正在运行的项目极大地简化了OpenSSL,并且删除诸如BIO_printf()之类的内容是该列表中的第一件事。换句话说,有人认为BIO_printf是一个好主意,但事实并非如此。
-
我确实同意这种观点,即BIO超出了SSL库应该做的事情的范围。在我自己的代码中,我根本不使用它们,我使用自己的通信通道,而仅使用非BIO版本的OpenSSL函数。
-
@ gnasher729您有特定的产品在想什么吗?那里有很多SSL工具包。
-
从ssleay.txt的" bio.doc "部分中:" BIO库是IO抽象,最初是受使用Windows 3.1 DLL时需要回调执行从IO到FILE指针的启发。" It \\在不了解软件历史的情况下批评软件是愚蠢的。当时,我确定BIO抽象解决了各种可移植性问题。
通常,BIO可能不会写入stdout。
您可以拥有一个BIO,该BIO可以写入文件,为null,套接字,网络驱动器或其他BIO等。
通过使用BIO_printf系列,可以轻松地更改代码,以将其输出发送到其他位置或另一个BIO,后者可以进行进一步的过滤,然后将输出传递到其他任何地方。
正如其他人所指出的,
BIO可以与
FILE相反地堆叠。在C99中添加了
snprintf()和
vnsprintf()。 OpenSSL / SSLeay早于此。因此,SSLeay开发人员必须编写自己的实现。不幸的是,很少使用实现会导致OP或CVE-2016-0799所描述的性能问题。