楊文剛
摘要:在檔案館數字化建設中,電子文件作為檔案實體移交到檔案館,比起紙質檔案存在著很多安全隱患。介紹數字簽名的加密技術,掌握數字簽名與簽名驗證的原理,利用微軟的集成軟件Visual Studio2005開發并建立以CA為核心PKI體系模塊,實現電子文件在移交、接收、存檔過程中不被做任何修改,最終保證電子文件的真實性、完整性、原始性以及不可否認性。
關鍵字:數字簽名 公鑰加密 RSA 電子文件
在數字化檔案館的建設中,電子文件作為數字檔案的實體,在檢索利用方面給檔案工作人員帶來了很大的方便。不過,電子檔案的安全性比起紙質檔案又相差很遠。任何一個人都可以在計算機上對電子文件進行修改,電腦病毒的侵蝕也可能會導致原始電子文件被篡改。與此同時,檔案作為一種嚴肅、真實、敏感的信息載體,特別是黨政類的文書檔案,它會直接或間接地關系到組織的發展與檔案利用者的利益。這就要求我們建立的電子檔案必須要具備真實性、完整性、原始性及不可否認性。而數字簽名技術的引入恰恰為解決這個問題提供了理論基礎和技術的可行性。同時,《中華人民共和國電子簽名法》的頒布實施,也為數字簽名在電子文件中的應用提供了法律的依據和保障。
一、需求分析與解決方案
1.需求分析
我校檔案館以往對電子文件的收集都是采取磁盤、USB存儲設備等拷貝電子文件,然后打印移交目錄并由電子文件形成部門負責人和檔案接收負責人一一核對后簽字,這樣做不僅浪費了檔案工作人員在收集過程中投入的時間和精力,降低了工作效率。而且在電子文件的安全性方面也存在著隱患,特別是當電子文件信息與實際信息不一致的時候,沒有人或一個仲裁能夠準確判斷出電子文件是在創建的過程中被修改了,還是在接收以后保管的過程中被修改了。如果這個問題不能解決,電子文件的存在價值也就失去了意義。所以,我校檔案館在電子文件接收的過程中,要建立一個電子文件接收平臺,實現以下功能:一是能夠識別電子文件發送者的身份;二是保證電子文件在建立、發送、接收、存儲這四個階段不被篡改;三是保證經過電子簽名后的電子文件,不能被電子文件的簽名者所否認。
2.解決方案
建立以CA(Certificate Authority)為核心的公鑰基礎設施(Public Key Infrastructure 簡稱PKI)體系,通過CA簽發證書給電子文件發送者,并通過證書來識別他的身份。運用數字簽名技術實現電子文件不被改動,并保證經過電子簽名的電子文件不能被該文件簽名者所否認。
在PKI體系中,需要兩臺服務器,一臺服務器用于CA的應用服務器,另一臺服務器用于CA的證書數據庫服務器,操作流程可分為如下三個階段:如圖1

圖1 PKI系統的操作流程
(1)證書簽發階段
①電子文件的發送者(即電子文件創建者,以下稱為發送者)向CA應用服務器申請證書。
②CA應用服務器響應申請,產生證書和一對密鑰即公鑰與私鑰,并將證書信息與公鑰存入CA的證書數據庫中。
③CA應用服務器將證書信息和私鑰返回給證書申請者。私鑰的存儲介質一般包括硬盤、U盤、IC卡及USB智能卡,為了安全起見,我們為證書申請者選用USB智能卡來存儲私鑰。
(2)數字簽名階段
①發送者提交要發送的電子文件、證書和存在USB智能卡中的私鑰到CA的應用服務器,申請數字簽名。
②CA應用服務器根據證書對發送者進行身份識別,同時響應申請,通過邏輯算法,將電子文件的數字簽名返回給發送者。
(3)簽名驗證階段
①發送者將電子文件的明文與電子文件的數字簽名發送給接收者。
②接收者將收到電子文件的明文與電子文件的數據簽名提交給CA應用服務器,申請驗證。
③CA應用服務器從證書服務器中提交公鑰,利用公鑰解密數字簽名,并通過邏輯算法來驗證電子簽名是否合法,電子文件是否被改動。
④接收者得到CA應用服務器響應返回的驗證結果。
二、數字簽名技術及其原理
數字簽名是基于非對稱加密技術基礎上的一種應用①。非對稱加密技術又稱為公鑰加密,密鑰是由公鑰和私鑰組成的。數字簽名是利用私鑰加密來簽名,再用公鑰解密來驗證。在通信中,通過信息明文計算出單項散列值,這個值往往是固定長度的,我們稱這個值為消息摘要,然后我們用私鑰對這個消息摘要進行加密得到的就是數字簽名②。數字簽名包括兩個過程:數字簽名與簽名驗證。我們假設A要發送數據C給B,并保證A不能否認數據C是A發送給B的數據C,可以參考圖2來說明數字簽名與驗證的過程。
1.數字簽名過程
①A用Hash函數加密數據C,得到:[Hash(數據C)],即消息摘要
②A用自己的私鑰對消息摘要加密,得到:[私鑰(Hash(數據C))],即數字簽名
③A將數據C及數字簽名發送給B,發送:[(數據C)+ 私鑰(Hash(數據C))]
2.數字驗證過程
①B接收到信息:[(數據C)+ 私鑰(Hash(數據C))]
②B用相同的Hash算法算出數據C的消息摘要,得到:[Hash(數據C)]
③B用A的公鑰對數字簽名解密,即解密[私鑰(Hash(數據C))],得到[公鑰(私鑰(Hash(數據C)))]
如果通過公鑰能計算出[公鑰(私鑰(Hash(數據C)))],說明[私鑰(Hash(數據C))]是A發送的,即數字簽名是A本人的,沒有冒充。
④比較上面第2、3兩個步驟中得到的消息摘要是否相等,即比較[Hash(數據C)]與[公鑰(私鑰(Hash(數據C)))]是否相等,如果相等說明數據C沒有被別人修改過。

3.數字簽名的用途
一是防偽造。任何人如果沒有發送信息者的私鑰是無法完成數字簽名的,這使得除了簽名者本人外無人能偽造簽名③。二是防止數字簽名的重用性。消息摘要的值取決于文件的內容,數字簽名又是通過對消息摘要的加密得到的,這使得不同內容的文件得到的數字簽名一定不一樣。這樣就防止了簽名者對一個文件的簽名被盜取后用在別的文件上的情況④。三是防止抵賴、否認。只有具有私鑰的簽名者才能進行數字簽名。這就證明了經過數字簽名的文件就是簽名者所發,具有不可否認性。四是防止文件被篡改。在簽名驗證過程中可以分別通過對消息使用單項散列函數和對數字簽名解密這兩種方法得到,通過判斷這兩次得到的消息摘要是否相等可以判斷文件是否被篡改,也為衡量是否對原始文件做過改動提供了驗證標準⑤。
三、電子文件接收平臺的設計與實現
1.系統構架
系統設計分為三個步驟:第一步是電子文件發送者通過申請得到密鑰,將得到的私鑰存儲在自己的USB智能卡中并妥善保存,公鑰存放到CA證書服務器的數據庫中,由CA將公鑰發布給電子文件的接收人員便于簽名驗證。第二步是對自己電子文件進行數字簽名,并把數字簽名作為附件與信息正文一起發送給電子文件接收人員。第三步是電子文件接收人員將接收到的電子文件提交到CA應用服務器,進行簽名驗證。同時,系統中還可以設立專門的CA應用服務器管理員對公鑰及證書信息進行管理。
2.系統環境
①CA應用服務器安裝IIS6.0以及DotNetFramework 2.0
②CA證書數據庫采用SQLServer2005
③程序開發利用微軟集成軟件Visual Studio 2005,程序編寫用C#2.0
④為每個電子文件發送者配置一個USB智能卡,便于身份識別和私鑰存儲
3.數據庫設計
在數據庫設計上,我們主要用到的是5個表:公鑰列表、電子文件列表、發送者信息列表、部門信息表、管理員信息表。
4.主要程序
下面我們按上述系統設計的三個步驟進行具體實現:
①在申請密鑰的過程中,出于安全性考慮,我們采用C/S模式,電子文件發送者首先下載申請密鑰模塊,然后在客戶端運行申請密鑰模塊,服務器接收申請后將私鑰返回給客戶端,并將私鑰寫入到申請者的USB智能卡中,同時,將公鑰更新到數據庫公鑰列表中。這里我們選用RSA算法來進行數字簽名。
/*導入RSA加密解密的命名空間*/
using System.Security.Cryptography;

/*生成RSACryptoServiceProvider實例用于獲取RSA密鑰對*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*由 RSACryptoServiceProvider實例生成私鑰*/
string privatekey = rsa.ToXmlString(true);
/*由 RSACryptoServiceProvider實例生成公鑰*/
string publickey = rsa.ToXmlString(false);
/* RSA私鑰存儲到證書申請人的USB智能卡的MyPrivateKey.dat中*/
StreamWriter sw = new StreamWriter ("USBPATH:MyPrivateKey.dat");
sw.WriteLine(privatekey);
②在數字簽名過程中,考慮到電子文件信息的機密性,我們提出對電子文件明文信息也進行加密。對明文信息的加密采用了對稱加密技術,這是由于明文信息的長度不確定,往往內容會很多,而對稱加密技術算法簡單,運行速度快,占用空間小,使得明文加密效率大大提高,這里運用對稱加密技術中的DES算法進行加密明文消息。對明文信息計算單項散列值生成消息摘要的過程運用MD5算法。數字簽名運用RSA算法。數字簽名的流程如圖3,其核心代碼如下:

/*從電子文件發送者的USB智能卡中讀取RAS私鑰,此時將USB智能卡接入電腦*/
StreamReader sw = StreamReader ("USBPATH:MyPrivateKey.dat");
String privatekey = sw.ReadLine();
/*生成RSACryptoServiceProvider實例*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*將私鑰導入RSACryptoServiceProvider實例*/
rsa.FromXmlString(privatekey);
/*利用MD5生成消息摘要,利用私鑰對messagebyes進行簽名*/
byte[] output = rsa.SignData(messagebytes, "MD5");
③在簽名驗證過程中,主要是驗證簽名是否來自發送方以及電子文件明文信息是否在簽名后被修改,并沒有涉及到私鑰,所以為了方便操作,我們用B/S模式來構建。簽名驗證的具體過程如圖4,其核心代碼如下:
/*生成RSACryptoServiceProvider實例*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*將公鑰導入RSACryptoServiceProvider實例*/
rsa.FromXmlString(publickey);
/*以MD5為生成消息摘要函數,利用公鑰對messagebyes進行簽名驗證,并返回驗證是否成功*/
bool flag = rsa.VerifyData(messagebytes, "MD5", output);
此外,程序在簽名與驗證的過程中,還要利用DES加密算法對明文信息進行加密與解密,但是,由于文章篇幅有限,這里就不分代碼一一列出了。
注釋:
①陳相琳.數字簽名技術及算法的研究[D].哈爾濱:哈爾濱理工大學,2007.
②寧子嵐.基于數字簽名和數字水印技術的電子印章系統[D].長沙:長沙理工大學,2007.
③王華.數字簽名技術的研究與應用[D].北京:華北電力大學,2009.
④張文波.基于數字簽名的電子郵票模型研究[D].大連:大連理工大學,2009.
⑤郭延玲.公鑰基礎設施相關應用設計與實現[D].北京:北京郵電大學,2006.
作者單位:天津師范大學檔案館