最近在做的項目中,有提到要使用電子簽章的功能。以前只是使用過,但從未自己用計算機語言來實現過。現在的網絡知識如此豐富,上來淘一下,運氣不錯,得到如下文章,現收錄鄙人麾下。
子簽章(Electronic Signature)、數字簽章(Digital Signature)、加密簽名、公鑰私鑰、非對稱加密、哈希加密、C#、MD5
摘要:
電子簽章(Electronic Signature)泛指所有以電子形式存在,依附在電子文件並與其邏輯相關,可用以辨識電子文件簽署者身份,保證文件的完整性,並表示簽署者同意電子文件所陳述事項的內容。包括數字簽章技術和逐漸普及的用於身份驗證的生物識別技術如指紋、面紋、DNA技術等。本文從本人參與OA系統項目中數字簽章技術的設計來講述如何使用微軟公司的編程平台Vs.Net中的C#語言來實現數字簽章技術。
正文:
1、緒論
經過10年的高速發展,互聯網已經慢慢地滲透到我們的日常生活中,從各個方面不經意地改變著人類的生活。電子商務越來越接近理想中的樣子了;電子政務也正在一步步地走向我們……這一系列新興網絡行業發展的同時也帶來了許多法律問題,如網絡通訊的安全與隱私保護問題、知識產權問題、電子支付問題、合同問題、交易認證問題等等。
為解決這些問題,國家在2004年8月28日通過《中華人民共和國電子簽名法》,此法令從法律意義上肯定了電子簽章的作用,並明確了電子簽章的用途及范圍,為電子簽章的進一步發展提供了法律上的保證。
所謂電子簽章就是用於電子文件之上,與傳統的手寫簽名、蓋章具有完全相同功能的技術。有了電子簽章,任何信息都可以放心地通過網絡以電子文件的形式傳輸,因此,電子簽章問題是電子商務和電子政務建設中必須首先解決的核心問題。
2、引言
傳統的交易行為和政府間的公文傳送,必須要用書面的文件來完成,為了保證文件是某個當事人或者機關簽發的,並且文件沒有被篡改,還必須要有簽發人的手寫簽字或者公章。
網絡環境中,文件的傳遞采取電子的方式,比如E-mail。這種方式最大的優點就是速度快,文件可以在數秒中到達遠在萬裡之外的客戶手中。在“時間就是金錢、效率就是生命”的生意場上,這種優勢無疑成為廣大廠商的首選。
電子文件並非只用於合同的簽訂和政府文件的傳遞,而是適用於所有信息的傳遞。可以理想化地認為,未來的信息傳遞,可以不借助於任何紙張。
但如何保證一項文件或者一條信息是某個人發出的?某個人發出文件或者信息後,如果發現對自己不利抵賴怎麼辦?如果文件或者信息在網絡傳輸過程中被他人截取,並被篡改了怎麼辦?許多人都知道,我們平時發送和接收的電子郵件是不加密的,對於某些人比如網管員來說,看這些文件甚至比看沒有封上的書面信件更容易。
3、 實例
某信息公司要求研發一套辦公自動化系統,其中就包括了對電子公文進行電子簽章的功能,本人有幸參與並設計了電子簽章部份。
目前最成熟的電子簽章技術就是“數字簽章(Digital Signature)”,它是以公鑰及私鑰的“非對稱型”密碼技術制作的電子簽章。使用原理大致為:由計算機程序將密鑰和需傳送的文件濃縮成信息摘要予以運算,得出數字簽章,將數字簽章並同原交易信息傳送給對方,後者可用公鑰來驗證該信息確實由前者傳送、並可查驗文件在傳送過程是否遭他人篡改,並防止對方抵賴。由於數字簽章技術采用的是單向不可逆運算方式,要想對其破解,以目前的計算機速度以及技術而言,幾乎是不可能的。文件傳輸可選擇明文或密文進行傳輸。因此,從某種意義上講,使用電子文件和數字簽章,甚至比使用經過簽字蓋章的書面文件安全得多。
設計之初,我就先提出了需要解決的幾個問題:
如何保證電子文件在傳輸過程中不被篡改?
如何保證電子文件合法性及不可抵賴?
一般來說要保證電子文件在傳輸過程中不被篡改,一是對電子文件進行私鑰加密。在傳輸方使用私鑰對電子文件進行明文加密,接收方再用私鑰對傳輸過來的密文進行解密,以此來達到電子文件不被篡改。但此方法需要傳輸方與接收方都擁有私鑰而且出現問題後雙方都可能指責對方將私鑰解密,因此單純使用此方法,一般都只用於安全性要求不高的應用,不值得推薦。二是傳輸方對電子文件創建哈希,將電子文件與哈希一同發給接收方,接收方對接受到的電子文件也創建哈希,然後對比哈希值,以此來達到電子文件不被篡改。這是本人所選用的方案。下面是根據本人電子簽章設計所寫的一個DEMO片段,以供參考。
以下是對電子文件創建哈希的具本實現(使用了MD5加密):
1/**//// <summary>
2 /// 得到指定電子文件的哈希
3 /// </summary>
4 /// <param name="filePath">電子文件地址</param>
5 /// <returns>哈希值</returns>
6 public static byte[] GetFileHash(string filePath)
7 {
8 try
9 {
10 FileStream objFile = File.OpenRead(filePath);
11 HashAlgorithm MD5 = HashAlgorithm.Create("MD5");
12 byte[] Hashbyte = MD5.ComputeHash(objFile);
13 objFile.Close();
14 return Hashbyte;
15 }
16 catch
17 {
18 return null;
19 }
20 }
要實現合法性及不可抵賴就必需使用公鑰私鑰非對稱加密方式並結合哈希加密方式。
公鑰及私鑰是一對很有意思的組合,它們是成對使用的,一一對應的,使用私鑰加密的數據,可以使用公鑰來證明是否是由此公鑰所對應的私鑰所加密的,將電子文件的哈希用私鑰加密,接收人就算出電子文件的哈希,然後用公鑰來驗證電子文件是否是傳輸者所確認的文件。
生成公鑰及私鑰:
1/**//// <summary>
2 /// 得到公鑰與私鑰
3 /// </summary>
4 /// <param name="ContainerName">私鑰容器名</param>
5 /// <param name="privatekey">真為得到私鑰,假為得到公鑰</param>
6 /// <returns>公鑰或私鑰</returns>
7 public static string GetKeyFromContainer(string ContainerName,bool privatekey)
8 {
9 CspParameters cp = new CspParameters();
10 cp.KeyContainerName = ContainerName;
11 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
12 return rsa.ToXmlString(privatekey);
13 }
對電子文件的哈希進行數字簽名:
1/**//// <summary>
2 /// 對哈希進行數字簽名
3 /// </s