如果我放弃哈希计算,是否必须调用 SHA1_Final() ?

Do I have to call SHA1_Final() if I abandon hash calculation?

这是关于所有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() 应该没问题,如果需要 'clean up' ctx,应该有 SHA1_Destroy(),当然缺席了...

许多SHA_*方法被定义here,即通过预处理器"configured"成为SHA1、SHA256...

方法的文件

HASH_FINAL 方法是 SHA1_Final(和 SHA256_Final)。这里唯一"smells"的清理操作是一个

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 完成使用这些字节然后清除它们。