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

标签 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() ,当然没有...

最佳答案

定义了许多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/

相关文章:

c++ - 为什么编译器在定义类似的模板特化时不会报错?

c++ - std::thread 创建抛出异常

ssl - 它是如何工作的 : Found one SSL certificate two different chains and two different root CAs

hash - 哈希 : doesn't it reduces entropy? 上的多次迭代

python - python加密的基础知识w/hashlib sha1

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 在 sqlite3pp 中捕获异常

c - 在 Linux 上连接硬件安全模块

char * 到 ASN1_INTEGER

delphi - 寻求 FOSS SHA1