Signature

驗證時間戳記令牌的消息摘要

  • November 10, 2022

我正在嘗試使用“文件時間戳字典”的 PDF 2.0 功能驗證嵌入到 PDF 中的時間戳令牌。嵌入的時間戳令牌正是來自時間戳權威伺服器的時間戳響應的令牌。

由於 Ruby 的 OpenSSL 庫似乎沒有提供必要的介面來完成這項任務,我正在嘗試手動完成。而且我一直在驗證時間戳令牌的摘要值是否等於原始內容的摘要值。

這是openssl pkcs7 -in response.der -inform DER -print範例時間戳令牌的輸出:https ://pastebin.com/s4CTGeQX

我能做的:

  • 我可以導航 PKCS7 對象的 ASN1 結構以在 SignerInfo 中定位使用的摘要算法。在範例情況下,這是“SHA512”。
  • 我還發現了名為“messageDigest (1.2.840.113549.1.9.4)”的認證屬性。

但是,messageDigest 屬性值與在原始內容上使用 SHA512 的結果不匹配。

我不太確定我是否必須以某種方式進一步處理 messageDigest 或者我正在尋找的摘要是否隱藏在其他地方(顯而易見)。因此,感謝任何有關如何驗證時間戳令牌中籤名內容摘要的資訊 - 謝謝!

感謝@dave_thompson_085 的評論,我找到了我想要的東西。

所以事實證明,它PKCS7/d.sign/contents/d.other包含TSTInfo結構的 DER 編碼版本。此結構包含messageImprint包含最初在時間戳請求中發送的 PDF 的雜湊/摘要的欄位。

在驗證時間戳記令牌時,我可以將該值與重新計算的值進行比較,以確保該令牌真正涵蓋了 PDF。

在 Ruby 程式碼中,這看起來像這樣:

# Parse the time stamp token
p7 = OpenSSL::ASN1.decode(signature_dict.contents)
raise "not a signed-data" if p7.value[0].value != "pkcs7-signedData"

# Retrieve the signed data portion d.sign
signed_data = p7.value.find { |x| x.tag_class == :CONTEXT_SPECIFIC && x.tag == 0 }.value[0]

# Retrieve the ContentInfo structure
content_info = signed_data.value[2]

# Parse the embedded TSTInfo structure
content = OpenSSL::ASN1.decode(content_info.value[1].value[0].value)
digest_algorithm = content.value[2].value[0].value[0].value

# Retrieve the original hash sent in the time stamp request and
# recompute the hash from the PDF data
original_hash = content.value[2].value[1].value
recomputed_hash = OpenSSL::Digest.new(digest_algorithm).digest(signature_dict.signed_data)

引用自:https://crypto.stackexchange.com/questions/102650