计算多个HMAC时是否需重复释放重建EVP_MAC_CTX上下文
EVP_MAC 多轮MAC计算的上下文使用规范
结论先行:两种调用方式均符合接口设计要求,连续多轮同算法MAC计算优先选择复用上下文的方案,性能更优。
接口行为的核心规则
EVP_MAC_CTX_new仅负责创建绑定了指定MAC算法的空上下文,创建后上下文不携带任何计算状态,本身是可复用的资源。EVP_MAC_init本身就具备上下文重置能力:无论上下文之前是否执行过update/final操作,调用该函数时传入对应密钥、参数后,会直接清空上一轮计算残留的所有中间状态,将上下文恢复到新一轮计算的初始状态,不需要销毁重建。
两种调用流程的适用场景
流程1:单次创建上下文,多轮init-update-final后统一释放
标准调用示例:// 仅创建一次上下文 EVP_MAC_CTX *ctx = EVP_MAC_CTX_new(hmac_mac); // 第一轮HMAC计算 EVP_MAC_init(ctx, key_1, key1_len, NULL); EVP_MAC_update(ctx, data_1, data1_len); EVP_MAC_final(ctx, res_1, &res_len, MAX_MAC_LEN); // 第二轮HMAC计算,直接init重置即可 EVP_MAC_init(ctx, key_2, key2_len, NULL); EVP_MAC_update(ctx, data_2, data2_len); EVP_MAC_final(ctx, res_2, &res_len, MAX_MAC_LEN); // 所有计算完成后统一释放 EVP_MAC_CTX_free(ctx);这是官方推荐的标准用法,省去了反复申请、释放上下文的内存开销,适合连续执行多轮同算法MAC计算的场景。如果多轮计算使用的密钥、算法参数不变,后续调用
EVP_MAC_init时密钥参数传NULL即可直接沿用之前的配置,进一步减少参数拷贝开销。流程2:每轮计算完整执行new-init-update-final-free
该流程不存在逻辑错误,计算结果完全正确,但每轮新建、销毁上下文会带来额外的内存管理开销,仅适合单次MAC计算、或不同轮次使用的MAC算法完全不同的场景。
注意:禁止在未调用
EVP_MAC_init重置的情况下,直接对上一轮执行过final的上下文调用update,此时上下文保留的是上一轮计算的结束状态,会直接导致MAC计算结果错误。
内容的提问来源于stack exchange,提问作者tstone
相关产品推荐
相关产品推荐

