ruby - 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 更新以恢复哈希过程。
解决方案
听起来您希望能够创建一个新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
inDigest::SHA2
的源代码,您会发现调用时没有设置初始状态的参数new
。
我可能错过了一些东西,因为它的源代码Digest
有点难以理解,因为Digest
它混合了 Ruby 和 C。例如,如果你看一下,ext/digest/sha2/lib/sha2.rb
你会发现它initialize
只是调用Digest::SHA256
. 但是sha256.rb
在ext/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。
我的所有研究表明,您必须重新计算哈希才能使对象达到所需状态。
推荐阅读
- python - pygame 显示在初始数组绘制后不更新
- java - iText7 读取交叉引用表时出错。表将被重建。此外部参照小节中的文件位置 {0} 交叉引用条目
- c# - 通过excel读取和更新数据库
- android - 在 Android Instrumented 测试中模拟无 Internet 连接/慢速 Internet 连接
- c++ - 有没有办法重写这个?
- delphi - Delphi 提供 F2613 Unit Not Found,但仅适用于 64 位构建
- javascript - 在本地使用 SQLite 和 Web 扩展原生消息 API
- c# - 在不同的控制器和视图之间传递数据
- go - 在golang中将参数传递给mux处理函数
- python - z3 - 意外输出/不确定输出是什么意思