ruby - SHA 哈希在签署 OpenSSL 库中的文档时起什么作用?

标签 ruby ruby-on-rails-4 openssl digital-signature sha256

我正在关注 OpenSSL生成签名的指令。我正在使用 ruby​​ 2.1.0 并生成如下签名:

document = "This is a simple string document to be signed"
key = OpenSSL::PKey::RSA.new([private_key])
digest = OpenSSL::Digest::SHA256.new
signature = key.sign digest, document

签名被传输并到达要验证的目的地。为了验证,我这样做:

key = OpenSSL::PKey::RSA.new([pubkey])
digest = OpenSSL::Digest::SHA256.new
key.verify digest, signature, document # => valid

这是有效的,因为如果我们只更改文档或签名的一个字母,这将返回无效结果:

key.verify digest, signature, changed_document # => Invalid

但使用不同的 SHA,验证命令仍然会产生有效结果:

digest = OpenSSL::Digest::SHA256.new('this will generate different SHA')
key.verify digest, signature, document # => valid

这让我很困惑。不同的 SHA 哈希值不应该导致无效结果吗? digest在这里的作用是什么?

最佳答案

将参数传递给 OpenSSL::Digest::SHA256.new 会导致该数据被添加到摘要中。

但是,openssl 签名函数会在使用摘要之前重置摘要,因此在这种特殊情况下额外的数据不会产生任何影响。

关于ruby - SHA 哈希在签署 OpenSSL 库中的文档时起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24651088/

相关文章:

ruby-on-rails - Heroku 应用程序坚持使用 HTTPS - 为什么?

php - 在 Objective C 中签名字符串并在 PHP 中验证 - 不工作

c++ - C++ 中的 Winsock2 + OpenSSL : How can I catch their exceptions?

ruby - 试图从字符串 RUBY 中删除空格

带有远程数据库的 Ruby ODBC

ruby - 更传统的方式来写这个 ruby

ruby-on-rails-4 - 带有 rails4 的 Roo 为 nil :NilClass 提供未定义的方法 `[]'

ruby-on-rails-4 - NoMethodError:Capistrano::Configuration:Class 的未定义方法 `instance'

ssl - 证书中不存在主题备用名称

ruby-on-rails - 如何理解 Ruby 类中冒号运算符的用法