gpt4 book ai didi

使用 OpenSSL 内存 BIO 写入和读取以空字符结尾的字符串的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:28 25 4
gpt4 key购买 nike

如果执行下面的例子(几乎完全基于官方https://www.openssl.org/docs/man1.0.2/crypto/BIO_s_mem.html#EXAMPLE):

#include <openssl/bio.h>
#include <openssl/buffer.h>

int main() {
BIO *mem = BIO_new(BIO_s_mem());
BIO_puts(mem, "Hello World\n");

BUF_MEM *bptr;
BIO_get_mem_ptr(mem, &bptr);
BIO_set_close(mem, BIO_NOCLOSE); /* So BIO_free() leaves BUF_MEM alone */
BIO_free(mem);

printf("%s", bptr->data);

BUF_MEM_free(bptr);
return 0;
}

它只是可能按预期工作,这取决于\n 之后底层内存缓冲区中未初始化的char 的可能性>\000 是偶然的,这可以通过 Valgrind 报告得到证实:

==17122== Conditional jump or move depends on uninitialised value(s)
==17122== at 0x52CCCC0: vfprintf (vfprintf.c:1632)
==17122== by 0x52D3898: printf (printf.c:33)
==17122== by 0x4008CC: main (test1.c:13)
==17122== Uninitialised value was created by a heap allocation
==17122== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17122== by 0x4E9CE77: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==17122== by 0x4F4A4B3: BUF_MEM_grow_clean (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==17122== by 0x4F4BBDD: mem_write (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==17122== by 0x4F4AC8E: BIO_puts (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==17122== by 0x40086E: main (test1.c:6)

无论如何,我已经看到发生这种情况是因为BIO_puts 没有将空终止字符串写入内存BIO,即使https://www.openssl.org/docs/man1.0.2/crypto/BIO_puts.html 也是如此。说:

BIO_puts() attempts to write a null terminated string buf to BIO b.

所以我的问题是使用 OpenSSL 内存 BIO 写入和读取以 null 结尾的字符串的正确方法是什么。

此外,“以这种方式使用此 API 不会泄露敏感数据?”。

注意我使用的是 OpenSSL 1.0.2g

最佳答案

BIO_puts 将所有数据写入一个字符串,直到 NUL 终止符 - 但它不包括 NUL 终止符本身。而是使用 BIO_write():

const char *mystr = "Hello World\n";

BIO_write(mem, mystr, strlen(mystr) + 1);

或者:

BIO_puts(mem, "Hello World\n");
BIO_write(mem, "", 1);

关于使用 OpenSSL 内存 BIO 写入和读取以空字符结尾的字符串的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com