【翻譯】PDF中的數(shù)字簽名[2]
原文:Digital Signatures in a PDF,https://www.adobe.com/devnet-docs/etk_deprecated/tools/DigSig/Acrobat_DigitalSignatures_in_PDF.pdf

二、公鑰基礎(chǔ)設(shè)施(PKI)
PDF的數(shù)字簽名功能旨在與企業(yè)和政府環(huán)境中部署的與主流公鑰基礎(chǔ)設(shè)施(PKI)相關(guān)的所有標(biāo)準(zhǔn)兼容。PKI是在創(chuàng)建,分發(fā),管理,吊銷以及使用數(shù)字ID時使用的人員,策略,過程,硬件和軟件的集合,這些數(shù)字ID中包含簽署PDF時使用的公鑰/私鑰對。
在PDF簽名工作流的上下文中,“PKI”通常指數(shù)字ID的頒發(fā)者、用戶、管理員以及任何在這些工作流中使用的軟硬件。實現(xiàn)并符合PDF語言標(biāo)準(zhǔn)的PDF閱讀器能夠以無縫且健壯的方式與這些組件交互。

在簽署重要的紙質(zhì)文件時,人們通常需要向公證人或其他受信任的機(jī)構(gòu)提供令人滿意的身份證明,之后在他們面前對文件進(jìn)行簽署。 因為公證人被認(rèn)為是值得信賴的,所以你可以信任公證人見證的簽名。 使用PKI是一種提供類似信任的方法。
與提供信任直接相關(guān)的一些常見PKI組件包括:
證書頒發(fā)機(jī)構(gòu)(CA):最終的信任機(jī)構(gòu),可以出售或發(fā)行數(shù)字ID(例如Verisign或Geotrust)。 CA會簽署自己的證書(自我簽名),并且其證書通常是證書鏈頂部的“根”證書。
中間證書(ICAs):一種CA,在證書鏈中其位于終端用戶和根證書之間。 該證書不是自簽名的,并且ICA通常提供諸如策略,時間戳,吊銷列表等服務(wù)。
終端用戶證書(EE):簽署者的證書,也是簽署鏈上最后的元素。根據(jù)定義,終端用戶證書不包含CA基本約束值。
數(shù)字ID:與個人或?qū)嶓w相關(guān)聯(lián)的基于ITU-T X.509 v3標(biāo)準(zhǔn)的數(shù)據(jù)電子表示形式。 它存儲在計算機(jī)或網(wǎng)絡(luò)上受密碼保護(hù)的文件,USB令牌,智能卡等中。數(shù)字ID包含公鑰證書,私鑰和其他數(shù)據(jù)
公鑰證書:一個包含公鑰/私鑰對的數(shù)字公鑰部分以及用于定義證書所有者,有效期和用法的關(guān)聯(lián)擴(kuò)展和屬性的文件。
私鑰:PKI系統(tǒng)中的密鑰,用于驗證傳入消息和對傳出消息進(jìn)行簽名。在密鑰生成期間,私鑰始終與其公鑰配對。
盡管數(shù)字ID及其發(fā)行實體是任何PKI的核心,但PKI還包括許多其他企業(yè)所有和第三方項目。 PKI管理員通常管理著數(shù)字ID的創(chuàng)建與分發(fā),LDAP(Light Directory Access Portocol)服務(wù)器,時間戳服務(wù)器,吊銷列表和其他項目。PDF語言支持所有與這些組件交互所需的數(shù)據(jù)。
1. PKI,PDF和簽署
PDF支持將簽名嵌入文件自身,而不是作為單獨(dú)的數(shù)據(jù)管理或者添加到現(xiàn)有文件格式中。這意味著查看應(yīng)用程序可以不破壞簽名而進(jìn)行特定類型的修改。對于其它數(shù)字簽名格式,用戶可能需要使用兩個應(yīng)用來處理文件和簽名,或者需要為每個簽名文件管理兩份單獨(dú)的文件。
PDF中的每個簽名都與簽名處理程序關(guān)聯(lián)。簽名被放置在PDF簽名字典中,里面包含用于處理簽名的簽名處理器名字(如圖3)。Adobe Acrobat leverages Public/Private Key(PPK)加密技術(shù)內(nèi)置了簽名處理程序。PPK基于這樣一種思想,即用私鑰加密的值只能使用公鑰解密(反之,在為特定收件人加密文件時也是同樣的,但這不在本文檔的范圍之內(nèi))。
對PDF進(jìn)行簽名后,簽名者的證書將嵌入在PDF文件中。圖3展示了存儲在用戶硬件設(shè)備上的數(shù)字ID與嵌入PDF文件中簽名值的關(guān)系。簽名值可能還包含額外的信息,例如簽名圖片,時間戳和可能特定于用戶,系統(tǒng)或應(yīng)用程序的其他數(shù)據(jù)。

簽署過程如下:
1. 待簽名文件被處理成字節(jié)流。
2. 將整個PDF文件寫入磁盤,并留出適當(dāng)大小的空間用于簽名值以及ByteRange
數(shù)組中的最壞情況值。
ByteRange
數(shù)組由四個數(shù)字組成。每對中的第一個數(shù)字是對于文件的偏移量(從頭開始,起始是0),表示需要被包含在哈希計算中的字節(jié)流的起始。第二個數(shù)字是該流的長度。這兩對定義了兩個字節(jié)序列,這些字節(jié)序列定義了要哈希的內(nèi)容。實際簽名值存儲在第一個序列的末尾與第二個序列的開頭之間的/Contents
鍵中。圖4中,哈希是針對字節(jié)0到839和960到1200計算的。

3. 一旦根據(jù)文件中的偏移量知道了簽名值的位置,就可以使用正確的值填充ByteRange
數(shù)組。因為字節(jié)偏移禁止修改,所以新數(shù)組語句之后的多余字節(jié)將被零覆蓋。
4. 使用諸如SHA-256之類的哈希算法,由實際ByteRange
值指定的字節(jié)來計算整個文件的哈希。Acrobat始終在整個PDF文件中計算文件簽名的哈希值,該哈希值從字節(jié)0開始到物理文件的最后一個字節(jié)結(jié)束,但不包括簽名值字節(jié)。
5. 哈希值由簽署者的私鑰加密,并生成一個十六進(jìn)制編碼的PKCS#7
對象簽名對象。
6. 簽名對象放置在磁盤上的文件中,覆蓋占位符/Contents
值。 未用于簽名對象的任何空間都將被零覆蓋。
7. 將PDF文件重新加載到Acrobat中,以確保內(nèi)存和磁盤上的版本相同。
提示:?這是一個高層級展示。對于更詳細(xì)的一些應(yīng)用程序級配置選項的快速鍵,請參閱“簽名創(chuàng)建工作流”。
2. PKI,PDF和簽名校驗
由于私鑰和公鑰僅僅是數(shù)字,因此任何人都可以使用任意數(shù)量的工具生成公鑰和私鑰對。 諸如Acrobat之類的應(yīng)用程序提供了一種生成自簽名證書的機(jī)制,該證書將簡單的用戶提供的身份綁定到由應(yīng)用程序生成的公鑰。 然后使用相應(yīng)的私鑰對其進(jìn)行簽名。 顯然,沒有什么可以阻止某人生成使用他人名字的自簽名證書的。 因此,未知的自簽名證書沒有很高的保證水平。
為了解決這種類型的信任問題,組織者使用一種PKI,該P(yáng)KI包括發(fā)布,記錄和跟蹤數(shù)字ID的獨(dú)立權(quán)限。 由于PDF支持將簽名者的公共密鑰作為簽名的一部分進(jìn)行嵌入,因此文件接收者始終可以使用它來進(jìn)行簽名驗證。要驗證簽名,驗證者只需檢索簽名者的證書,并將其與自己的受信任證書列表進(jìn)行比較:
收件人的應(yīng)用程序使用簽名者使用的相同算法(不包括簽名值)來生成文件的單向哈希。
使用簽名者的公鑰對文件中加密的哈希值進(jìn)行解密。
將解密的哈希值與本地生成的哈希值進(jìn)行比較。
如果它們相同,則將簽名報告為已知。
提示:?簽名是否受信任或有效是單獨(dú)的問題。 簽名信任取決于收件人的應(yīng)用程序配置。 簽名狀態(tài)還取決于文件完整性檢查。