Digest Init-Update-Final 机制是否复制输入数据?

Does Digest Init-Update-Final mechanism make a copy of input data?

我使用 init-update-final 机制计算哈希,即初始化哈希上下文,然后使用各种大小的输入数据进行哈希更新,最后进行摘要计算。这可以使用 the EVP_DigestInit, EVP_DigestUpdate and EVP_DigestFinal_Ex functions of OpenSSL or the Update and Final methods of Crypto++.

来完成

根据我从 OpenSSLCrypto++ 的源代码中挖掘出来的内容,似乎输入数据实际上被复制了并且存储。谁能证实这一点?这是散列过程的限制还是标准程序?这是否因使用的摘要算法而异?

我的印象是散列算法会根据输入数据块计算一些内部状态,最终摘要将根据在所有各种更新调用中收集的内部状态来计算。情况似乎并非如此。显然我对哈希算法的机制了解不够。

From what I can dig up from the source code of OpenSSL and Crypto++, it seems like the input data actually get copied and stored. Can anyone confirm this?

是也不是。通常不存储输入。缓冲部分输入,直到可以处理完整的块。

缓冲是哈希状态的一部分。一旦被消耗,如果遇到额外的部分块,则可以使用部分块的存储。当散列对象被销毁时,部分块中的数据将被擦除或归零。

可以存储多少数据取决于哈希的内部结构和块大小。对于像 MD5、SHA1 和 SHA512 这样的迭代散列,这种说法通常是正确的。但是我不知道像SHA3这样的递归哈希函数。

该策略适用于 OpenSSL 和 Crypto++。

对于 Crypto++,如果不存在 AttachedTransformation,哈希的输出将在内部进行缓冲。


另请参阅 Crypto++ wiki 上的 Init-Update-Final。它是最近添加的,于 2016 年 1 月添加。