我遵循
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哈希导致无效结果吗?消化在这里扮演什么角色?
最佳答案 将参数传递给OpenSSL :: Digest :: SHA256.new会导致将数据添加到摘要中.
但是,openssl签名函数在使用之前重置摘要,因此额外数据在此特定情况下无效.