它是关于所有 SHA 家族的。
我看https://www.openssl.org/docs/man1.1.0/crypto/SHA1.html页面,我没有看到任何阻止我不调用 SHA1_Final()
的东西,以防我想放弃哈希计算。
换句话说,如果我这样做可以吗:
try {
SHA1_Init(&ctx);
while (!finish) {
const Data& data = getData();
SHA1_Update(&ctx, data.data(), data.len());
}
SHA1_Final(&md, &ctx);
}
catch(const std::exception& e) {
std::cerr << "Ooops, exception while reading data. " << e.what() << std::endl;
std::cerr << "Not calling SHA1_Final!" << std::endl;
throw;
}
我的直觉告诉我不调用 SHA1_Final()
应该没问题,如果需要“清理”ctx,应该有 SHA1_Destroy()
,当然没有...
最佳答案
定义了许多SHA_*
方法here ,这是一个通过预处理器“配置”为 SHA1、SHA256 方法的文件...
HASH_FINAL
方法是 SHA1_Final
(和 SHA256_Final
)。在这里,唯一“闻到”清洁的操作是
OPENSSL_cleanse(p, HASH_CBLOCK);
OPENSSL_cleanse
在哪里
OPENSSL_cleanse() fills ptr of size len with a string of 0's
(取自 here )。
但是 OPENSSL_cleanse
的大小是 HASH_CBLOCK
,所以我会说它正在清理用于保存部分源数据的内部缓冲区,这些缓冲区必须是散列。解释:SHA1 一次处理 512 位(64 字节)的数据。如果您尝试使用 SHA1_Update
对 70 个字节的数据进行哈希处理,则会对 64 个字节进行哈希处理,并为下一个 SHA1_Update
保存 6 个字节。 SHA1_Final
完成使用这些字节,然后清除它们。
关于c++ - 如果我放弃哈希计算,是否必须调用 SHA1_Final()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50606890/