2014-07-09 47 views
4

我正在遵循OpenSSL指令來生成簽名。我正在使用ruby 2.1.0並生成類似如下的簽名:SHA hash在OpenSSL庫中籤署文檔有什麼作用?

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哈希導致無效結果?摘要在這裏的作用是什麼?

回答

2

將參數傳遞給OpenSSL::Digest::SHA256.new會導致數據被添加到摘要中。

但是,openssl簽名函數在使用之前會重置摘要,因此額外的數據在此特定情況下不起作用。

+0

您能否提供更多信息?爲什麼要這樣做? _不應該有不同的SHA哈希導致無效結果?_ –

+0

這是相同的SHA哈希函數。在第二種情況下,您提供了一些初始數據,這些數據會被丟棄,因此結果就好像初始數據並不在首位。至於爲什麼我認爲它可以更容易地重用摘要對象 –

+0

好的。正如您所看到的,我正在嘗試對文檔進行數字簽名。那我能否假設我用來簽署文件的方法是正確的? –