代码之家  ›  专栏  ›  技术社区  ›  Hassan Syed

openssl-hmac函数的偶然复杂性

  •  2
  • Hassan Syed  · 技术社区  · 14 年前

    ssl文档分析

    这个问题是关于在openssl中使用hmac例程的。

    由于openssl文档在某些方面有点薄弱,分析显示使用:

     unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
                   int key_len, const unsigned char *d, int n,
                   unsigned char *md, unsigned int *md_len);
    

    here ,展示 我的库运行时的40% 致力于创造和毁灭 HMACK-CTX 在幕后。

    还有两个额外的函数来创建和销毁 HMACK-CTX 明晰地:

    hmac_ctx_init()初始化hmac_ctx 首次使用前。必须叫它。

    hmac_ctx_cleanup()清除密钥并 来自HMAC CTX和 释放所有关联的资源。它 必须在hmac_ctx为否时调用 需要更长时间。

    这两个函数调用的前缀是:

    如果 消息未完全存储 在记忆中

    我的数据完全适合内存,所以我选择了hmac函数——上面显示了其签名的函数。

    如手册页所述,通过使用以下两个函数来使用上下文:

    可以重复调用hmac_update() 有大量的信息 已验证(数据长度字节)。

    hmac_final()放置消息 MD中的身份验证代码,必须 为哈希函数留出空间 输出。


    适用范围

    我的应用程序生成一个可信的(hmac,也使用nonce)cbc-bf加密协议缓冲区字符串。该代码将与各种Web服务器和框架Windows /Linux作为OS、NGINX、Apache和IIS作为Web服务器和Python/.NET和C++Web服务器过滤器进行接口。

    上面的描述应该说明库需要是线程安全的,并且 潜在地 具有可恢复的处理状态——即,共享OS线程的轻量级线程(这可能会使线程本地内存不在图片中)。


    问题

    我该如何摆脱 每次调用40%的开销 以(1)线程安全/(2)可恢复状态的方式?(2)是可选的,因为我一次性拥有所有源数据,并且可以确保在不放弃对线程中间摘要创建的控制的情况下就地创建摘要。所以,

    (1)可能可以使用线程本地内存来完成——但是我如何恢复CTX?做 HMACIM-最后() 呼叫使CTX可重复使用?.

    (2)可选:在这种情况下,我必须创建一个ctx池。

    (3)HMAC功能是如何做到这一点的?它是否在函数调用的范围内创建并销毁ctx?

    psuedocode和注释将很有用。

    2 回复  |  直到 14 年前
        1
  •  2
  •   caf    14 年前

    的文档 HMAC_Init_ex() openssl 0.9.8g中的函数表示:

    hmac_init_ex() 初始化 或重用 HMAC_CTX 使用函数的结构 evp_md 关键 key . 两者都可以 NULL ,在这种情况下,现有的 将被重用。

    (强调我的)。所以这意味着你可以初始化 HMACK-CTX 具有 HMAC_CTX_Init() 一次,然后保留它来创建多个HMAC,只要您不调用 HMAC_CTX_cleanup() 在它上面,你用 hmac_init_ex() .

    所以是的,你应该可以做你想做的 HMACK-CTX 在线程本地内存中。

        2
  •  0
  •   Hassan Syed    14 年前

    如果不试图限制依赖关系,可以选择自包含的hmac实现,并要求用户显式地控制openssl在其文档中含糊不清的所有方面。许多这样简单的C/C++替代方案都存在,但由您来选择和评估这种替代方案。