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

时间:2018-05-30 14:11:19

标签: c++ openssl sha1

关于所有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(),当然是缺席...

1 个答案:

答案 0 :(得分:1)

定义了许多SHA_*个方法here,这是一个通过预处理器配置的文件&#34;是SHA1,SHA256 ...

的方法

HASH_FINAL方法是SHA1_Final(和SHA256_Final)。在这里唯一的操作是&#34;闻起来&#34;清洁是一个

OPENSSL_cleanse(p, HASH_CBLOCK);

其中OPENSSL_cleanse

  

OPENSSL_cleanse()使用字符串0&#39填充大小为len的ptr

(取自here)。

但是OPENSSL_cleanse的大小是HASH_CBLOCK,所以我说它正在清理用于保存必须散列的部分源数据的内部缓冲区。说明:SHA1一次处理512位(64字节)数据。如果您尝试使用SHA1_Update散列70个字节的数据,则会对64个字节进行哈希处理,并为下一个SHA1_Update保存6个字节。 SHA1_Final完成使用这些字节,然后清除它们。