【问题标题】:Ruby Sha256 hash continuationRuby Sha256 哈希延续
【发布时间】:2020-08-29 08:22:49
【问题描述】:

我有兴趣获取现有哈希并从那时起恢复 SHA256 加密。在 C++ 中似乎可行:

这是我尝试过的:

irb(main):007:0> sha2 = Digest::SHA2.new                                        => #<Digest::SHA2:256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
irb(main):008:0> sha2 << "string1"
=> #<Digest::SHA2:256 93fedde43203e0a76172135221b8636313635d7afff96a490ae9066330505d47>
irb(main):009:0> sha2 << "string2"
=> #<Digest::SHA2:256 bac09aa72e632e76c36e6c1c4e502b73c3da7fca68c475273dc5517815587cc4>
irb(main):010:0> 

以上代码在会话中更新 SHA2 摘要对象。我想开始一个新会话...让我们将其称为 newshaw2,方法是分配与我将 String1 传递给 sha2 时创建的相同的原始哈希,如上所述。

我想“制作”newshaw2 作为对象 93fedde43203e0a76172135221b8636313635d7afff96a490ae9066330505d47。

将其设置为相等:newshaw2 = '93fedde43203e0a76172135221b8636313635d7afff96a490ae9066330505d47' 只是使它成为字符串对象,而不是摘要。

曾经,我已经成功地为 newsha2 分配了哈希值,然后我将使用 string2 更新以恢复哈希过程。

【问题讨论】:

  • 我根据 cmets 编辑了上面的作品。

标签: ruby sha256


【解决方案1】:

听起来您希望能够创建一个新的Digest::SHA2 对象并将其初始值设置为现有哈希,而无需重新计算该哈希。

例如,如果您使用 Digest::SHA2 计算 10 GB 文件的哈希值,那么有没有办法使用该哈希值创建一个新的 Digest::SHA2 而无需重新哈希所有 10 GB?

答案是否定的,Digest 没有这个能力。您可以通过以下几种方式之一进行确认。首先,查看对象上可用的公共方法,看看是否没有执行此操作的选项:

Digest::SHA256.new.public_methods - Object.public_methods
=> [:update, :digest_length, :block_length, :<<, :reset, :digest, :file, :base64digest, :base64digest!, :hexdigest!, :length, :digest!, :size, :hexdigest]

然后查看initialize in Digest::SHA2 的源代码,您会发现调用new 时没有设置初始状态的参数。

我可能错过了一些东西,因为Digest 的源代码有点难以理解,因为Digest 是 Ruby 和 C 的混合体。例如,如果您查看 ext/digest/sha2/lib/sha2.rb,您会看到initialize 只是打电话给Digest::SHA256。但是在ext/digest/sha2/lib 上找不到sha256.rb 文件。那是因为它是由ext/digest/sha2/sha2init.c 定义的,其方法在ext/digest/sha2/sha2.c 中定义。

另一种可能的解决方案是将数据编组为字节流,但这对于 Digest::SHA2 对象是不可能的:

Marshal.dump(Digest::SHA2.new)
TypeError: no _dump_data is defined for class Digest::SHA256

其他人在Can I serialize a ruby Digest::SHA1 instance object? 提出了类似的问题,但没有得到回答。 https://gist.github.com/parameme/2280705 列出了 SHA1 摘要的可能解决方案,您可能可以对其进行调整,但该要点已有 9 年历史,当时的 Ruby 版本是 1.9.3,因此它可能无法正常工作红宝石 2.7。

我的所有研究表明,您必须重新计算哈希才能使对象达到所需状态。

【讨论】:

  • 感谢您对此的关注。我会看看我是否可以根据您的一些建议自己写一些东西。祝你有美好的一天。
  • @rpthhomps 链接的要点会在 Ruby 2.7.1 中导致分段错误,但在 2.6.6 中不会,因此只要您灵活,可能无需大量工作即可适应 SHA256在 Ruby 版本上。
  • 再次感谢您的持续研究。
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2011-01-15
  • 2019-08-09
  • 2020-06-26
相关资源
最近更新 更多