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++.
来完成
根据我从 OpenSSL 和 Crypto++ 的源代码中挖掘出来的内容,似乎输入数据实际上被复制了并且存储。谁能证实这一点?这是散列过程的限制还是标准程序?这是否因使用的摘要算法而异?
我的印象是散列算法会根据输入数据块计算一些内部状态,最终摘要将根据在所有各种更新调用中收集的内部状态来计算。情况似乎并非如此。显然我对哈希算法的机制了解不够。
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 月添加。
我使用 init-update-final 机制计算哈希,即初始化哈希上下文,然后使用各种大小的输入数据进行哈希更新,最后进行摘要计算。这可以使用 the EVP_DigestInit, EVP_DigestUpdate and EVP_DigestFinal_Ex functions of OpenSSL or the Update and Final methods of Crypto++.
来完成根据我从 OpenSSL 和 Crypto++ 的源代码中挖掘出来的内容,似乎输入数据实际上被复制了并且存储。谁能证实这一点?这是散列过程的限制还是标准程序?这是否因使用的摘要算法而异?
我的印象是散列算法会根据输入数据块计算一些内部状态,最终摘要将根据在所有各种更新调用中收集的内部状态来计算。情况似乎并非如此。显然我对哈希算法的机制了解不够。
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 月添加。