首页 > 解决方案 > Ruby Sha256 哈希延续

问题描述

我有兴趣获取现有的哈希并从那时起恢复 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 摘要对象。我想开始一个新的会话......让我们通过分配与我将 String1 传递给 sha2 时创建的相同的原始哈希来调用它如上所述。

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

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

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

标签: rubysha256

解决方案


听起来您希望能够创建一个新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]

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

我可能错过了一些东西,因为它的源代码Digest有点难以理解,因为Digest它混合了 Ruby 和 C。例如,如果你看一下,ext/digest/sha2/lib/sha2.rb你会发现它initialize只是调用Digest::SHA256. 但是sha256.rbext/digest/sha2/lib. 那是因为它是由 , 定义的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 摘要的可能解决方案,您可能可以对其进行调整,但该 gist 已有 9 年历史,当时的 Ruby 版本为 1.9.3 ,因此它可能不适用于 Ruby 2.7。

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


推荐阅读