关于所有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()
,当然是缺席...
答案 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
完成使用这些字节,然后清除它们。