楊文剛
摘要:在檔案館數(shù)字化建設(shè)中,電子文件作為檔案實(shí)體移交到檔案館,比起紙質(zhì)檔案存在著很多安全隱患。介紹數(shù)字簽名的加密技術(shù),掌握數(shù)字簽名與簽名驗(yàn)證的原理,利用微軟的集成軟件Visual Studio2005開發(fā)并建立以CA為核心PKI體系模塊,實(shí)現(xiàn)電子文件在移交、接收、存檔過程中不被做任何修改,最終保證電子文件的真實(shí)性、完整性、原始性以及不可否認(rèn)性。
關(guān)鍵字:數(shù)字簽名 公鑰加密 RSA 電子文件
在數(shù)字化檔案館的建設(shè)中,電子文件作為數(shù)字檔案的實(shí)體,在檢索利用方面給檔案工作人員帶來了很大的方便。不過,電子檔案的安全性比起紙質(zhì)檔案又相差很遠(yuǎn)。任何一個(gè)人都可以在計(jì)算機(jī)上對(duì)電子文件進(jìn)行修改,電腦病毒的侵蝕也可能會(huì)導(dǎo)致原始電子文件被篡改。與此同時(shí),檔案作為一種嚴(yán)肅、真實(shí)、敏感的信息載體,特別是黨政類的文書檔案,它會(huì)直接或間接地關(guān)系到組織的發(fā)展與檔案利用者的利益。這就要求我們建立的電子檔案必須要具備真實(shí)性、完整性、原始性及不可否認(rèn)性。而數(shù)字簽名技術(shù)的引入恰恰為解決這個(gè)問題提供了理論基礎(chǔ)和技術(shù)的可行性。同時(shí),《中華人民共和國電子簽名法》的頒布實(shí)施,也為數(shù)字簽名在電子文件中的應(yīng)用提供了法律的依據(jù)和保障。
一、需求分析與解決方案
1.需求分析
我校檔案館以往對(duì)電子文件的收集都是采取磁盤、USB存儲(chǔ)設(shè)備等拷貝電子文件,然后打印移交目錄并由電子文件形成部門負(fù)責(zé)人和檔案接收負(fù)責(zé)人一一核對(duì)后簽字,這樣做不僅浪費(fèi)了檔案工作人員在收集過程中投入的時(shí)間和精力,降低了工作效率。而且在電子文件的安全性方面也存在著隱患,特別是當(dāng)電子文件信息與實(shí)際信息不一致的時(shí)候,沒有人或一個(gè)仲裁能夠準(zhǔn)確判斷出電子文件是在創(chuàng)建的過程中被修改了,還是在接收以后保管的過程中被修改了。如果這個(gè)問題不能解決,電子文件的存在價(jià)值也就失去了意義。所以,我校檔案館在電子文件接收的過程中,要建立一個(gè)電子文件接收平臺(tái),實(shí)現(xiàn)以下功能:一是能夠識(shí)別電子文件發(fā)送者的身份;二是保證電子文件在建立、發(fā)送、接收、存儲(chǔ)這四個(gè)階段不被篡改;三是保證經(jīng)過電子簽名后的電子文件,不能被電子文件的簽名者所否認(rèn)。
2.解決方案
建立以CA(Certificate Authority)為核心的公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure 簡稱PKI)體系,通過CA簽發(fā)證書給電子文件發(fā)送者,并通過證書來識(shí)別他的身份。運(yùn)用數(shù)字簽名技術(shù)實(shí)現(xiàn)電子文件不被改動(dòng),并保證經(jīng)過電子簽名的電子文件不能被該文件簽名者所否認(rèn)。
在PKI體系中,需要兩臺(tái)服務(wù)器,一臺(tái)服務(wù)器用于CA的應(yīng)用服務(wù)器,另一臺(tái)服務(wù)器用于CA的證書數(shù)據(jù)庫服務(wù)器,操作流程可分為如下三個(gè)階段:如圖1
圖1 PKI系統(tǒng)的操作流程
(1)證書簽發(fā)階段
①電子文件的發(fā)送者(即電子文件創(chuàng)建者,以下稱為發(fā)送者)向CA應(yīng)用服務(wù)器申請(qǐng)證書。
②CA應(yīng)用服務(wù)器響應(yīng)申請(qǐng),產(chǎn)生證書和一對(duì)密鑰即公鑰與私鑰,并將證書信息與公鑰存入CA的證書數(shù)據(jù)庫中。
③CA應(yīng)用服務(wù)器將證書信息和私鑰返回給證書申請(qǐng)者。私鑰的存儲(chǔ)介質(zhì)一般包括硬盤、U盤、IC卡及USB智能卡,為了安全起見,我們?yōu)樽C書申請(qǐng)者選用USB智能卡來存儲(chǔ)私鑰。
(2)數(shù)字簽名階段
①發(fā)送者提交要發(fā)送的電子文件、證書和存在USB智能卡中的私鑰到CA的應(yīng)用服務(wù)器,申請(qǐng)數(shù)字簽名。
②CA應(yīng)用服務(wù)器根據(jù)證書對(duì)發(fā)送者進(jìn)行身份識(shí)別,同時(shí)響應(yīng)申請(qǐng),通過邏輯算法,將電子文件的數(shù)字簽名返回給發(fā)送者。
(3)簽名驗(yàn)證階段
①發(fā)送者將電子文件的明文與電子文件的數(shù)字簽名發(fā)送給接收者。
②接收者將收到電子文件的明文與電子文件的數(shù)據(jù)簽名提交給CA應(yīng)用服務(wù)器,申請(qǐng)驗(yàn)證。
③CA應(yīng)用服務(wù)器從證書服務(wù)器中提交公鑰,利用公鑰解密數(shù)字簽名,并通過邏輯算法來驗(yàn)證電子簽名是否合法,電子文件是否被改動(dòng)。
④接收者得到CA應(yīng)用服務(wù)器響應(yīng)返回的驗(yàn)證結(jié)果。
二、數(shù)字簽名技術(shù)及其原理
數(shù)字簽名是基于非對(duì)稱加密技術(shù)基礎(chǔ)上的一種應(yīng)用①。非對(duì)稱加密技術(shù)又稱為公鑰加密,密鑰是由公鑰和私鑰組成的。數(shù)字簽名是利用私鑰加密來簽名,再用公鑰解密來驗(yàn)證。在通信中,通過信息明文計(jì)算出單項(xiàng)散列值,這個(gè)值往往是固定長度的,我們稱這個(gè)值為消息摘要,然后我們用私鑰對(duì)這個(gè)消息摘要進(jìn)行加密得到的就是數(shù)字簽名②。數(shù)字簽名包括兩個(gè)過程:數(shù)字簽名與簽名驗(yàn)證。我們假設(shè)A要發(fā)送數(shù)據(jù)C給B,并保證A不能否認(rèn)數(shù)據(jù)C是A發(fā)送給B的數(shù)據(jù)C,可以參考圖2來說明數(shù)字簽名與驗(yàn)證的過程。
1.數(shù)字簽名過程
①A用Hash函數(shù)加密數(shù)據(jù)C,得到:[Hash(數(shù)據(jù)C)],即消息摘要
②A用自己的私鑰對(duì)消息摘要加密,得到:[私鑰(Hash(數(shù)據(jù)C))],即數(shù)字簽名
③A將數(shù)據(jù)C及數(shù)字簽名發(fā)送給B,發(fā)送:[(數(shù)據(jù)C)+ 私鑰(Hash(數(shù)據(jù)C))]
2.數(shù)字驗(yàn)證過程
①B接收到信息:[(數(shù)據(jù)C)+ 私鑰(Hash(數(shù)據(jù)C))]
②B用相同的Hash算法算出數(shù)據(jù)C的消息摘要,得到:[Hash(數(shù)據(jù)C)]
③B用A的公鑰對(duì)數(shù)字簽名解密,即解密[私鑰(Hash(數(shù)據(jù)C))],得到[公鑰(私鑰(Hash(數(shù)據(jù)C)))]
如果通過公鑰能計(jì)算出[公鑰(私鑰(Hash(數(shù)據(jù)C)))],說明[私鑰(Hash(數(shù)據(jù)C))]是A發(fā)送的,即數(shù)字簽名是A本人的,沒有冒充。
④比較上面第2、3兩個(gè)步驟中得到的消息摘要是否相等,即比較[Hash(數(shù)據(jù)C)]與[公鑰(私鑰(Hash(數(shù)據(jù)C)))]是否相等,如果相等說明數(shù)據(jù)C沒有被別人修改過。
3.數(shù)字簽名的用途
一是防偽造。任何人如果沒有發(fā)送信息者的私鑰是無法完成數(shù)字簽名的,這使得除了簽名者本人外無人能偽造簽名③。二是防止數(shù)字簽名的重用性。消息摘要的值取決于文件的內(nèi)容,數(shù)字簽名又是通過對(duì)消息摘要的加密得到的,這使得不同內(nèi)容的文件得到的數(shù)字簽名一定不一樣。這樣就防止了簽名者對(duì)一個(gè)文件的簽名被盜取后用在別的文件上的情況④。三是防止抵賴、否認(rèn)。只有具有私鑰的簽名者才能進(jìn)行數(shù)字簽名。這就證明了經(jīng)過數(shù)字簽名的文件就是簽名者所發(fā),具有不可否認(rèn)性。四是防止文件被篡改。在簽名驗(yàn)證過程中可以分別通過對(duì)消息使用單項(xiàng)散列函數(shù)和對(duì)數(shù)字簽名解密這兩種方法得到,通過判斷這兩次得到的消息摘要是否相等可以判斷文件是否被篡改,也為衡量是否對(duì)原始文件做過改動(dòng)提供了驗(yàn)證標(biāo)準(zhǔn)⑤。
三、電子文件接收平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
1.系統(tǒng)構(gòu)架
系統(tǒng)設(shè)計(jì)分為三個(gè)步驟:第一步是電子文件發(fā)送者通過申請(qǐng)得到密鑰,將得到的私鑰存儲(chǔ)在自己的USB智能卡中并妥善保存,公鑰存放到CA證書服務(wù)器的數(shù)據(jù)庫中,由CA將公鑰發(fā)布給電子文件的接收人員便于簽名驗(yàn)證。第二步是對(duì)自己電子文件進(jìn)行數(shù)字簽名,并把數(shù)字簽名作為附件與信息正文一起發(fā)送給電子文件接收人員。第三步是電子文件接收人員將接收到的電子文件提交到CA應(yīng)用服務(wù)器,進(jìn)行簽名驗(yàn)證。同時(shí),系統(tǒng)中還可以設(shè)立專門的CA應(yīng)用服務(wù)器管理員對(duì)公鑰及證書信息進(jìn)行管理。
2.系統(tǒng)環(huán)境
①CA應(yīng)用服務(wù)器安裝IIS6.0以及DotNetFramework 2.0
②CA證書數(shù)據(jù)庫采用SQLServer2005
③程序開發(fā)利用微軟集成軟件Visual Studio 2005,程序編寫用C#2.0
④為每個(gè)電子文件發(fā)送者配置一個(gè)USB智能卡,便于身份識(shí)別和私鑰存儲(chǔ)
3.數(shù)據(jù)庫設(shè)計(jì)
在數(shù)據(jù)庫設(shè)計(jì)上,我們主要用到的是5個(gè)表:公鑰列表、電子文件列表、發(fā)送者信息列表、部門信息表、管理員信息表。
4.主要程序
下面我們按上述系統(tǒng)設(shè)計(jì)的三個(gè)步驟進(jìn)行具體實(shí)現(xiàn):
①在申請(qǐng)密鑰的過程中,出于安全性考慮,我們采用C/S模式,電子文件發(fā)送者首先下載申請(qǐng)密鑰模塊,然后在客戶端運(yùn)行申請(qǐng)密鑰模塊,服務(wù)器接收申請(qǐng)后將私鑰返回給客戶端,并將私鑰寫入到申請(qǐng)者的USB智能卡中,同時(shí),將公鑰更新到數(shù)據(jù)庫公鑰列表中。這里我們選用RSA算法來進(jìn)行數(shù)字簽名。
/*導(dǎo)入RSA加密解密的命名空間*/
using System.Security.Cryptography;
/*生成RSACryptoServiceProvider實(shí)例用于獲取RSA密鑰對(duì)*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*由 RSACryptoServiceProvider實(shí)例生成私鑰*/
string privatekey = rsa.ToXmlString(true);
/*由 RSACryptoServiceProvider實(shí)例生成公鑰*/
string publickey = rsa.ToXmlString(false);
/* RSA私鑰存儲(chǔ)到證書申請(qǐng)人的USB智能卡的MyPrivateKey.dat中*/
StreamWriter sw = new StreamWriter ("USBPATH:MyPrivateKey.dat");
sw.WriteLine(privatekey);
②在數(shù)字簽名過程中,考慮到電子文件信息的機(jī)密性,我們提出對(duì)電子文件明文信息也進(jìn)行加密。對(duì)明文信息的加密采用了對(duì)稱加密技術(shù),這是由于明文信息的長度不確定,往往內(nèi)容會(huì)很多,而對(duì)稱加密技術(shù)算法簡單,運(yùn)行速度快,占用空間小,使得明文加密效率大大提高,這里運(yùn)用對(duì)稱加密技術(shù)中的DES算法進(jìn)行加密明文消息。對(duì)明文信息計(jì)算單項(xiàng)散列值生成消息摘要的過程運(yùn)用MD5算法。數(shù)字簽名運(yùn)用RSA算法。數(shù)字簽名的流程如圖3,其核心代碼如下:
/*從電子文件發(fā)送者的USB智能卡中讀取RAS私鑰,此時(shí)將USB智能卡接入電腦*/
StreamReader sw = StreamReader ("USBPATH:MyPrivateKey.dat");
String privatekey = sw.ReadLine();
/*生成RSACryptoServiceProvider實(shí)例*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*將私鑰導(dǎo)入RSACryptoServiceProvider實(shí)例*/
rsa.FromXmlString(privatekey);
/*利用MD5生成消息摘要,利用私鑰對(duì)messagebyes進(jìn)行簽名*/
byte[] output = rsa.SignData(messagebytes, "MD5");
③在簽名驗(yàn)證過程中,主要是驗(yàn)證簽名是否來自發(fā)送方以及電子文件明文信息是否在簽名后被修改,并沒有涉及到私鑰,所以為了方便操作,我們用B/S模式來構(gòu)建。簽名驗(yàn)證的具體過程如圖4,其核心代碼如下:
/*生成RSACryptoServiceProvider實(shí)例*/
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
/*將公鑰導(dǎo)入RSACryptoServiceProvider實(shí)例*/
rsa.FromXmlString(publickey);
/*以MD5為生成消息摘要函數(shù),利用公鑰對(duì)messagebyes進(jìn)行簽名驗(yàn)證,并返回驗(yàn)證是否成功*/
bool flag = rsa.VerifyData(messagebytes, "MD5", output);
此外,程序在簽名與驗(yàn)證的過程中,還要利用DES加密算法對(duì)明文信息進(jìn)行加密與解密,但是,由于文章篇幅有限,這里就不分代碼一一列出了。
注釋:
①陳相琳.數(shù)字簽名技術(shù)及算法的研究[D].哈爾濱:哈爾濱理工大學(xué),2007.
②寧子嵐.基于數(shù)字簽名和數(shù)字水印技術(shù)的電子印章系統(tǒng)[D].長沙:長沙理工大學(xué),2007.
③王華.數(shù)字簽名技術(shù)的研究與應(yīng)用[D].北京:華北電力大學(xué),2009.
④張文波.基于數(shù)字簽名的電子郵票模型研究[D].大連:大連理工大學(xué),2009.
⑤郭延玲.公鑰基礎(chǔ)設(shè)施相關(guān)應(yīng)用設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2006.
作者單位:天津師范大學(xué)檔案館