天天看點

PDFKit.NET 數字簽名與文檔處理

PDFKit.NET 2.0

是一個百分百的.net元件,用來建立以及操作PDF文檔。這篇文章我将專注于它的“數字簽名”功能。數字簽名可以被用來認證PDF的源檔案(誰簽名過它)并且提供一個PDF文檔的完整性(看文檔在被簽名過後被是否更改過)。我将展示怎樣使用一個或多個數字簽名技術以及怎樣驗證數字簽名。

内容

簽名

更新

驗證

請看下面這個表單:

PDFKit.NET 數字簽名與文檔處理

圖檔1:帶有字段的PDF表單以及兩個空的簽名字段

這個表單的字段中分為兩段。一段是學生資訊,一段是老師資訊。通常,首先由學生填寫他的部分,并且簽名該文檔。下面的程式可以完成這個功能:

PDFKit.NET 數字簽名與文檔處理
PDFKit.NET 數字簽名與文檔處理

在執行上面的代碼後,在PDF Reader中打開文檔,看起來如下圖所示:

PDFKit.NET 數字簽名與文檔處理

圖檔2:應用第一次簽名後

注意PDF 文檔中的問号。這意味着該證書還沒有被用戶端信任,它隻是簡單地将證書添加到信任域中。

接下來,老師将檢視到學生的資料,然後填寫最終剩餘的那段字段,然後給予簽名。下面這段代碼實作了該功能:

PDFKit.NET 數字簽名與文檔處理
PDFKit.NET 數字簽名與文檔處理

如果你仔細看上面這段代碼。它确實與之前的這段代碼很相似。唯一明顯的不同是傳遞了一個額外的參數給Document.Write方法:DocumentWriteMode.AppendUpdate。這告訴PDFKit.Net儲存所有的改變以Update模式。我将在下一節讨論它。

在執行上面的代碼之後,打開PDF 閱讀器,文檔看起來類似下面的圖檔:

PDFKit.NET 數字簽名與文檔處理

圖檔3:在應用第二次簽名之後

注意:第一次簽名後的圖示(問号)現在已經變成了警告的驚歎号形式。它用來辨別,文檔在簽名後已經被修改。當然這僅僅是一個例子。

注意當我們儲存了第二次簽名,我們傳遞了一個額外的參數給Document.Write方法:DocumentWriteMode.AppendUpdate。它隻是PDFKit.NET儲存新的字段資料并且以Update的形式簽名。這意味着源PDF檔案是完好的,未被修改的。并且改變是連貫的。下面的圖檔展示了這個改變:

PDFKit.NET 數字簽名與文檔處理

圖檔4:PDF更新

是以,第一次簽名仍然有效,因為簽署的确切資料并沒有被修改。我們隻是增加了更新。

是以,在儲存完更新之後。事實上關于該文檔有兩個版本:一個是被學生簽名過的,而另一個是老師簽名過的。它對檢索一個給定的應用簽名的确切檔案很有用。很顯然簽名者隻關注該版本,而不是事後建立的那個版本。

給一個文檔,你可以枚舉出所有的更新以及文檔的版本,并且在硬碟上保留一份拷貝:

PDFKit.NET 數字簽名與文檔處理

但也許或者說更有趣的是,你能夠打開一個簽名過後的文檔并且對每一個簽名域都可以檢索簽署的更新。接下來的代碼簡單得枚舉了所有的簽名域并且儲存了簽署的更新:

PDFKit.NET 數字簽名與文檔處理

在執行了上面的代碼後,兩個新的文檔被存儲:studentSignature.pdf 和

teacherSignature.pdf。每一個文檔都展示了各自的域被簽名過的版本。

到現在,我們已經讨論了文檔的簽名。驗證的功能留給了PDF

Reader應用程式。但PDFKit.Net也允許你程式設計來驗證簽名。它就像下面的這段代碼一樣極其地簡單。這個例子打開了那個被學生、老師以及枚舉過簽名字段的PDF文檔。每一次簽名、簽名的狀态資訊都被寫入了控制台。

PDFKit.NET 數字簽名與文檔處理

在執行完上面這段代碼,下面的圖檔顯示了輸出的結果:

PDFKit.NET 數字簽名與文檔處理

譯者注:

數字簽名技術主要用于辨別檔案的完整性,不可篡改、不可抵賴。如果A要傳遞給B一個檔案。那麼需要用A使用A的私鑰加密,B使用A的公鑰解密。而如果在Web系統中實作這種機制。可以把Server作為第三方認證中心。PDF的制作方、上傳方類似使用者A,PDF的下載下傳方類似使用者B。數字證書通常由第三方提供,也由第三方負責認證。

原文釋出時間為:2011-09-12