【问题标题】:openssl crypto library - base64 conversionopenssl 加密库 - base64 转换
【发布时间】:2010-04-01 12:11:17
【问题描述】:

我正在使用 openssl BIO 对象将二进制字符串转换为 base64 字符串。代码如下:

void ToBase64(std::string & s_in) {
    BIO * b_s = BIO_new( BIO_s_mem() );
    BIO * b64_f = BIO_new( BIO_f_base64() );

    b_s = BIO_push( b64_f , b_s);

    std::cout << "IN::" << s_in.length();
    BIO_write(b_s, s_in.c_str(), s_in.length());


    char * pp;
    int sz = BIO_get_mem_data(b_s, &pp);

    std::cout << "OUT::"  << sz << endl;

    s_in.assign(pp,sz);
    //std::cout << sz << " " << std::string(pp,sz) << std::endl;

    BIO_free (b64_f); // TODO ret error potential
    BIO_free (b_s);   // 
  }

长度为 64 或 72。但输出始终为 65,这是不正确的,它应该比这大得多。该文档不是世界上最好的,AFAIK bio_s_mem 对象应该动态增长。我究竟做错了什么 ?

我可能最好找到一个不提供流支持且支持 base64 转换的自包含 C++ 类。流媒体支持不适合我的应用程序。但是我只是想坚持使用 openSSL,因为我已经依赖于一些加密例程。无论如何,我会在分析后做出这样的决定。

【问题讨论】:

    标签: c++ c open-source openssl


    【解决方案1】:

    你有两个问题:

    • 您需要在 mem bio 上调用 BIO_get_mem_data() - 但您丢失了对它的引用(您使用来自 BIO_push 的返回值覆盖它,它等于 b64_f)。
    • 将所有数据写入base64 bio 后,您应该调用BIO_flush()

    【讨论】:

    • 谢谢,这两点都说得通(我怀疑同花顺就可以了)。针对覆盖点:我从此处显示的示例中复制了推送操作:openssl.org/docs/crypto/BIO_f_base64.html# 应用推送的目标生物对象被覆盖。
    • 是的,flush 确实起到了作用,对潜在的句柄泄漏有什么想法吗?我认为第 1 点没有实际意义。
    • 在那个例子中,他们失去对 fp bio 的引用并不重要,因为他们永远不需要直接访问它 - 它的输出进入文件。另一方面,您需要从 mem bio 中显式提取输出。我怀疑它可能只是“偶然”工作,因为BIO_get_mem_data() 正在使用base64 bio(也许它是建立在下面的mem bio 上?) - 如果你通过它推送更多数据,它可能会停止工作。
    • 关于泄漏你是对的。有人需要“正确”地记录 ssl 的内部结构(这不是刺拳,因为编写文档是无聊的工作)。 Valgrind 抓住了它:D
    • 您可以通过在 base64 bio 上使用 BIO_free_all() 来绕过泄漏(该 bio 是链的开始,BIO_free_all() 将遍历 bios 链释放每个)。但是您仍然需要参考 mem bio,因为那是您应该使用BIO_get_mem_data() 阅读的内容。
    【解决方案2】:

    我认为您想要做的是将 args 的顺序更改为 BIO_push。

    b_s = BIO_push(b_s, b64_f)

    【讨论】:

    • 感谢您的回复。推送在管道中较早地放置了一个过滤器,openSSL 文档中的示例显示了这一点:openssl.org/docs/crypto/BIO_f_base64.html#。因此我的函数中的顺序是正确的。
    • 有趣。根据 BIO_push 页面openssl.org/docs/crypto/BIO_push.html,BIO_push 调用返回第一个参数,并附加了第二个参数。这将使 base64 示例覆盖(并丢失)fp。其中一页一定是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2018-11-10
    • 2012-08-01
    • 2023-03-14
    • 2017-07-23
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多