【问题标题】:Do I have to call SHA1_Final() if I abandon hash calculation?如果我放弃哈希计算,是否必须调用 SHA1_Final()?
【发布时间】:2018-05-30 14:11:18
【问题描述】:

它是关于所有 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_CTX 上下文。如果在方法结束时将其丢弃,则没有问题。如果不使用SHA1_Final,不确定是否可以重复使用SHA1_CTX
  • 我找不到SHA1_Final...Still the code for SHA512_Final 的代码,应该足够相似,没有清理/释放任何东西。
  • @xanatos - 我只担心这会进行逆向工程,并且取决于实现,这在未来可能会改变。 SHA1_CTX 可以在调用SHA1_Init() 时重复使用。感谢您的努力!
  • @gregorz 文档中没有提到使用_Final 的必要性,类似的实现不需要它,这将违反上下文作为临时容器的逻辑数据来做...

标签: c++ openssl sha1


【解决方案1】:

许多SHA_* 方法定义为here,即通过预处理器“配置”为SHA1、SHA256 的方法的文件...

HASH_FINAL 方法是SHA1_Final(和SHA256_Final)。在这里,唯一有“气味”清洁的操作是

OPENSSL_cleanse(p, HASH_CBLOCK);

OPENSSL_cleanse 在哪里

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

(取自here)。

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

【讨论】:

  • 有道理。感谢您查找此内容。我怀疑 OpenSSL 知道他们在做什么 :)
  • @Grzegorz 请注意,做你正在做的事情可能会将一段源数据保留在内存中。例如,密码通常短于 64 字节,因此它将保留在等待_Final 的上下文中。如果数据是超级机密,并且应该尽可能短地保留在内存中以减轻某些服务器攻击,那么您就是在制造漏洞。甚至请注意,SHA1_Init 作为第一条指令执行memset(c, 0, sizeof(*c));,因此它会将上下文归零(以非安全方式),清除此状态。
猜你喜欢
  • 1970-01-01
  • 2018-02-05
  • 2014-11-23
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2021-12-30
  • 2011-12-02
相关资源
最近更新 更多