如何解决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 。
我要“制作” 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
in Digest::SHA2
的来源,您会发现调用new
时没有参数可以设置初始状态。
我可能遗漏了一些东西,因为Digest
的源代码有点难以理解,因为Digest
是Ruby和C的混合。例如,如果您查看{{3} },您会看到initialize
只是在呼叫Digest::SHA256
。但是在ext/digest/sha2/lib/sha2.rb
上找不到sha256.rb
文件。这是因为它是由ext/digest/sha2/lib
定义的,并具有ext/digest/sha2/sha2init.c
中定义的方法。
另一种可能的解决方案是将数据封送至字节流,但这对于Digest::SHA2
对象是不可能的:
Marshal.dump(Digest::SHA2.new)
TypeError: no _dump_data is defined for class Digest::SHA256
有人在ext/digest/sha2/sha2.c
提出了类似的问题,但未得到回答。 Can I serialize a ruby Digest::SHA1 instance object?中列出了SHA1摘要的可能解决方案,您可以对其进行调整,但是要点是9岁,而当时的Ruby版本是1.9.3,因此可能不会在Ruby 2.7上工作。
我的所有研究都表明,您必须重新计算哈希值才能使对象达到所需状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。