翻譯:《PKCS#7 - SignedData》

JDNew發表於2017-12-12

本文翻譯於 PKI Globe的《PKCS#7 - SignedData》

(歡迎提出修改意見)

以下為翻譯文


在開始PKCS#7 SignedData之前還是很有必要先了解下電子簽名是如何產生和校驗的。

簽名和驗籤

以下是簽名計算所需要的步驟:

  • 通過任何一種金鑰對生成演算法(如RSA)生成一對公鑰和私鑰。

  • 準備需要用於計算簽名的資料。

  • 使用任何一種雜湊演算法(如SHA256)對資料做摘要。

  • 使用私鑰對雜湊後的資料進行加密,輸出來的就是簽名值。

為了驗證簽名,以下是所需的步驟

  • 為了驗證簽名,你需要知道已籤的資料 (譯者注:這裡應該指的是原文),簽名,雜湊演算法和公鑰。

  • 使用簽名過程用到的同樣的雜湊演算法對資料進行雜湊。

  • 利用公鑰解密簽名,你會得到雜湊值。

  • 現在比較上面兩步得到的雜湊,如果它們相等,就意味著資料沒有被篡改或者說這個簽名是認證的,否則就是被篡改了。

一般來說,一方是簽名,另一方是驗籤。如果你已經注意到了簽名驗簽過程中裡的第一步,你會發現在驗籤之前我們是需要一些標準的方法來存放這些資訊。那麼PKCS# 7的SignedData就是其中一種存放這些資訊的格式。當然還有其它的一些格式,像PDF簽名,XML簽名等等,但這些它們底層的生成和驗籤的原理是一樣的。

SignedData

PKCS# 7 SignedData是一種針對任意資料生成電子簽名的標準格式。像有些資料如果他自身的格式規範不能讓它有自己的電子簽名,那麼你就可以使用這種格式。比如說:你想簽署一份文字檔案,但因為它沒有自己的簽名規範,那就能用PKCS# 7 SignedData;而PDF檔案因為有它自己的簽名規範,所以它就可以用PDF的簽名規範進行簽名。此外微軟的Office文件也有自己的簽名規範。你也可以說PKCS# 7 SignedData可以對源資料進行簽名。

在PKCS# 7 SignedData裡,支援帶原文和不帶原文兩種格式。在帶原文的格式裡,已簽名的資料是SignedData裡的一部分,那麼在驗籤的時候,就不需要攜帶源資料了。而在不帶原文的格式裡,已簽名的資料沒有被放在SignedData裡,而是在其它外部的地方,所以驗籤的時候就需要攜帶原文。

PKCS# 7 SignedData裡支援兩種型別的簽名:

  • 獨立簽名

  • 會籤

在獨立簽名裡,所有的簽名者籤的都是同一份資料;而在會籤裡,一個簽名者簽完後,下一個簽名者是在上一個簽名者的簽名上進行簽名。

結構

以下展示的是ASN.1格式下的PKCS# 7 SignedData。因此你需要有能力閱讀ASN.1才能完全理解下圖。

翻譯:《PKCS#7 - SignedData》

翻譯:《PKCS#7 - SignedData》

翻譯:《PKCS#7 - SignedData》

1)指定了SignedData的結構;

2)指定了生成簽名的雜湊演算法。OID 2.16.840.1.101.3.4.2.1顯示使用的是SHA256雜湊演算法;

3)指定了使用的是不帶原文的格式,因為當前沒有內容;如果是帶原文,那麼這裡應該是有內容的。

4)包含用於驗籤時需要用到的公鑰的簽名證書。它也可以包含簽名者的完整證書鏈。

5)指定了簽名資訊結構,如果是獨立簽名,那麼應該包含多個簽名者的資訊。

6)指定了證書發行者和序列號的結構。

7)指定了生成簽名用到的雜湊演算法,這應該跟2)提到的是一樣的。

8)顯示認證屬性的資訊,這些屬性是簽名計算裡的部分,如果任何一部分的屬性被修改了,那麼簽名就會失效。另外如果對於未認證屬性被修改了,那它就還是能照樣驗籤通過。未認證的屬性不會顯示在ASN.1結構裡。

9)指定了加密演算法。

10)指定了簽名值。

以上PKCS# 7 結構是用BouncyCastle庫生成的。

相關文章