PDF簽名從入門到精通(2):PDF的簽名值到底存在哪裡?
寫了一下午的文章被知乎無情地沒收了(lll¬ω¬)...
研究過PDF簽名的同學應該見過下面這張圖, 來自ADOBE的文檔Acrobat_DigitalSignatures_in_PDF.pdf
PDF被簽名的內容是整個文檔除去signature dictionary里/Contents下面的內容. 簽過名的哈希值再連同其他一些信息一起寫進/Contents里. 也就是說/Contents內容以外的部分一旦被修改, 簽名就無法驗證通過了.
但是這張圖容易誤導我們的地方是, 我們會以為簽名值就是一個由證書, 簽名哈希, 時間戳組成的list. 而且"Signature value"也容易與SignerInfo里的Signature Value混淆.
其實, /Contents下面的真正內容是一個DER編碼的PKCS#7數據對象, 通常我們稱它為一個PKCS#7 container.
所以下面稍微詳細解析一下PKCS#7格式, 它跟CMS幾乎是一樣的, 可以把二者看成一個統一的概念. PKCS#7需要符合RFC3852/RFC5652的標準.
CMS是加密消息語法, 它並不是一個專為數字簽名而定製的標準, 它定義了一個對象ContentInfo, 包含Content Type和Content:
Content Type有6種:
- Data,
- Signed-data,
- Enveloped-data,
- Digested-data,
- Encrypted-data
- Authenticated-data
對於數字簽名來說, 屬於Signed-data類型. ContentInfo里的content是一個SignedData類型:
SignedData包含一個EncapsulatedContentInfo, 存的是待簽名的原文內容. 我們已經知道,對原文的簽名其實是對原文摘要的加密, 如果把原文內容放進這裡, 簽名值有可能會變得很大, 簽完名的文檔的大小就翻了倍. 一般來說, 會把EncapsulatedContentInfo空著, 這就是detached signature. 這跟通常意義上的跟Embedded signature相對的detached signature不是一個概念. Embedded Signature的意思是把一個文檔的簽名值嵌入文檔中成為一個文件, 相對的, detached signature是把文檔的簽名值和文檔分開保存. 對於CMS中的detached signature的概念則是另外一回事, 明白了這個也就明白了, SubFilter里的值為adbe.pkcs7.detached的原因.
SignedData里還包含了SignerInfos, 可以為每個簽名者創建一個獨立的SignerInfo, 也就是說CMS是支持多人平行簽名(Parallel Signature)的. 但是PDF只支持增量簽名(Incremental Signature), 也就是後一個簽名版本是前一個簽完名的文檔加上文檔的更新內容. 見下圖
具體可以參考Acrobat_DigitalSignatures_in_PDF.pdf.
SignerInfo的結構如下:
其中SignerIdentifier是簽名者的證書信息, DigestAlgorithmIdentifier是該簽名者使用的摘要演算法標識, SignatureAlgorithmIdentifier是該簽名者使用的簽名演算法, SignedAttributes和UnsignedAttributes是一些屬性, SignatureValue就是真正的簽名值了!
SignedAttributes是需要簽名的屬性, 是Optional的. 如果為空, 那麼SignatureValue就直接是原文內容的簽名值了. 如果SignedAttributes不為空, 那麼至少要包含兩個Attibutes:
也就是說至少要把原文數據的content type和消息摘要包含進去, 然後加上別的需要簽名的屬性, 例如revocation information, 對SignedAttributes做哈希和加密, 產生的簽名值作為SignatureValue. 所以這種情況下是要做兩次哈希的, 第一次是原文的哈希, 第二次是對SignedAttributes做哈希.
至此, 我們從PDF的signature dictionary結構深入到PKCS#7結構里的找到了簽名值的位置. 下面打算繼續研究MIME, ESS等內容以及它們與CMS的關係.
補充:
ESS - The ESS signing-certificate-v2 attribute是第三個必須要包含在Signed attributes中的屬性.
S/MIME - 郵件中的CMS object
參考文檔:
Acrobat_DigitalSignatures_in_PDF.pdf
RFC5652-Cryptographic Message Syntax (CMS)
PDF Signature digest
Message digest of pdf in digital signature
推薦閱讀:
※最專業製作 PDF 的方式是什麼?
※7款強大的免費PDF批量分割軟體【附下載】
※為什麼 PDF 能保證排版一致性,但通常 Word 文檔不能做到?
※因為專業限制,必須經常看一些彩色的PDF書籍,請問是買iPad還是Kindle fire呢?