摘 要 在Internet網(wǎng)絡(luò)走進(jìn)千家萬戶的今天,。網(wǎng)上在線申請(qǐng)業(yè)務(wù)變得越來越普遍,。本系統(tǒng)采用數(shù)字簽名技術(shù),,在保障用戶申請(qǐng)文件及網(wǎng)絡(luò)上傳過程中安全性的同時(shí),保障了傳輸文件的完整性及真?zhèn)蔚目沈?yàn)證性。
關(guān)鍵詞 網(wǎng)絡(luò)安全,,數(shù)字簽名, SHA1WithDSA,公鑰加密技術(shù)
一,、引言
隨著Internet的飛速發(fā)展,,網(wǎng)上業(yè)務(wù)申請(qǐng)變得越來越普及,經(jīng)常會(huì)出現(xiàn)雙方在不見面的情況下,,通過申請(qǐng)文件的提交,達(dá)到業(yè)務(wù)申請(qǐng)的目的,。由于Internet網(wǎng)絡(luò)的一些不安全因素,,提交的申請(qǐng)文件可能在網(wǎng)上傳輸?shù)倪^程中,被劫取,、篡改,、偽造或發(fā)生發(fā)送方抵賴等問題。那么如何保證申請(qǐng)文件的真實(shí)性,、在網(wǎng)絡(luò)傳輸中的完整性及申請(qǐng)人的不可抵賴性就成了安全地完成網(wǎng)絡(luò)業(yè)務(wù)申請(qǐng)的關(guān)鍵,。
簽名是證明當(dāng)事者的身份和數(shù)據(jù)真實(shí)性的一種信息,可以用不同的形式來表示,。一種完善的簽名應(yīng)滿足以下三個(gè)條件:簽名者事后不能抵賴自己的簽名,;任何其他人不能偽造簽名;如果當(dāng)事人雙方關(guān)于簽名的真?zhèn)伟l(fā)生爭(zhēng)執(zhí),,能夠在公正的仲裁者面前通過驗(yàn)證來確認(rèn)其真?zhèn)巍?/font>
在傳統(tǒng)的書面文件為基礎(chǔ)的事務(wù)處理中,,手簽、印章,、手印等書面簽名基本上滿足以上條件,,因而得到司法部門的支持,具有一定的法律意義,。
在以計(jì)算機(jī)文件為基礎(chǔ)的現(xiàn)代事務(wù)處理中,,采用電子形式的簽名。目前的數(shù)字簽名是建立在公開密鑰體制基礎(chǔ)上,,它是公開密鑰加密技術(shù)的另一類應(yīng)用,。它的主要方式是:報(bào)文的發(fā)送方從報(bào)文文本中生成一個(gè)128位的散列值(或報(bào)文摘要);發(fā)送方用自己的私人密鑰對(duì)這個(gè)散列值進(jìn)行加密來形成發(fā)送方的數(shù)字簽名,。然后,,這個(gè)數(shù)字簽名將作為報(bào)文的附件和報(bào)文一起發(fā)送給報(bào)文的接收方;報(bào)文的接收方首先從接收到的原始報(bào)文中計(jì)算出128位的散列值(或報(bào)文摘要),,接著再用發(fā)送方的公用密鑰來對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,。如果兩個(gè)散列值相同,、那么接收方就能確認(rèn)該數(shù)字簽名是發(fā)送方的。
通過數(shù)字簽名能夠?qū)崿F(xiàn)對(duì)原始報(bào)文的鑒別,,我國(guó)1995年制定了自己的數(shù)字簽名標(biāo)準(zhǔn)(GB15851-1995),,使其具有法律意義,由于數(shù)字簽名利用密鑰技術(shù)進(jìn)行,,因而可以獲得比書面簽名更高的安全性,。
公開密鑰加密技術(shù)的體制是,申請(qǐng)人具有一對(duì)密鑰,,一個(gè)是私鑰,,自行保存,用于文件的數(shù)字簽名,;一個(gè)是公鑰,,公開發(fā)布,用于接收方驗(yàn)證簽名,。由于私鑰只有申請(qǐng)人自己持有,,而且只有用申請(qǐng)人的私鑰加密的文件,才能用申請(qǐng)人的公鑰進(jìn)行解密驗(yàn)證,,所以在保障信息安全的同時(shí),,保障了申請(qǐng)人的不可抵賴性。
本文的數(shù)字簽名方式采用的是公開密鑰算法DSA和報(bào)文摘要算法SHA-1的融合,。
二,、系統(tǒng)的設(shè)計(jì)
本系統(tǒng)分為客戶端和服務(wù)器端,客戶端軟件采用Java技術(shù)生成用戶所需密鑰對(duì),,并產(chǎn)生簽名文件;服務(wù)端采用JSP技術(shù)實(shí)現(xiàn)客戶申請(qǐng)文件的上傳,,接受方則利用客戶端軟件進(jìn)行申請(qǐng)文件的簽名驗(yàn)證,。
1.客戶端
(1) 密鑰對(duì)的生成方法keyPair()
1) 相關(guān)介紹
KeyPairGenerator 類:用于生成公鑰和私鑰對(duì)。密鑰對(duì)生成器是使用 getInstance 工廠方法(返回一個(gè)給定類的實(shí)例的靜態(tài)方法)構(gòu)造的,。 特定算法的密鑰對(duì)生成器創(chuàng)建可與此算法一起使用的公鑰/私鑰對(duì),,也將每個(gè)生成的密鑰與特定于算法的參數(shù)相關(guān)聯(lián)。每個(gè)提供程序都必須提供(并記錄)默認(rèn)的初始化,,以防客戶沒有顯式初始化 KeyPairGenerator(通過調(diào)用 initialize 方法),。例如,Sun 提供程序使用 1024 位的默認(rèn)模大?。荑€大?。?/span>
2) 核心源碼
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("DSA");//使用DSA算法
keyGen.initialize(1024,new SecureRandom());
KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();
pubkey=pub.getEncoded();
privKey= priv.getEncoded();
fileOut=new FileOutputStream("sigPublicKey.dat");//輸出簽名公鑰文件
fileOut.write(pubkey);
fileOut.close();
fileOut=new FileOutputStream("sigPrivateKey.dat");//輸出簽名私鑰文件
fileOut.write(privKey);
fileOut.close();
(2) 數(shù)字簽名方法signFile()
1) 相關(guān)介紹
KeyFactory 類:密鑰工廠是用來將 keys(Key 類型的不透明加密密鑰)轉(zhuǎn)換成 key 規(guī)范(基礎(chǔ)密鑰材料的透明表示),,反之亦然,。 密鑰工廠是雙向的,。也就是說,它們?cè)试S根據(jù)一個(gè)給定的密鑰規(guī)范(密鑰材料)來建造一個(gè)不透明的密鑰對(duì)象,,也可以檢索以合適格式表示的密鑰對(duì)象的基礎(chǔ)密鑰材料,。
2) 核心源碼
fileIn2=new FileInputStream(jTextField2.getText()); //獲取私鑰文件
byte[] encodedprivKey=new byte[fileIn2.available()];
fileIn2.read(encodedprivKey);
fileIn2.close();
PKCS8EncodedKeySpec privKeySpec= new PKCS8EncodedKeySpec(encodedprivKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PrivateKey privKey=keyFactory.generatePrivate(privKeySpec);
Signature dsa=Signature.getInstance("SHA1WithDSA"); //簽名采用DSA和SHA1融合算法
dsa.initSign(privKey);
FileInputStream fis=new FileInputStream(jTextField1.getText()); //獲取原文件
while(fis.available()!=0){
temp=(byte)fis.read();
dsa.update(temp);
}
fis.close();
byte[] sig=dsa.sign();
fileOut1=new FileOutputStream(jTextField3.getText()); //輸出簽名文件
fileOut1.write(sig);
fileOut1.close();
JOptionPane.showMessageDialog(null, "簽名文件生成成功 "+jTextField3.getText(),"確認(rèn)消息", JOptionPane.INFORMATION_MESSAGE);
(3) 簽名驗(yàn)證方法verifyFile()
1) 相關(guān)介紹
Signature 類:用來為應(yīng)用程序提供數(shù)字簽名算法功能。其方法public final byte[] sign() throws SignatureException返回所有已更新數(shù)據(jù)的簽名字節(jié),,簽名的格式取決于基礎(chǔ)簽名方案,;方法public final boolean verify(byte[] signature) throws SignatureException,驗(yàn)證傳入的簽名,。
2) 核心源碼
fileIn3=new FileInputStream(jTextField5.getText()); //獲取公鑰文件
byte[] encodedpubKey =new byte[fileIn3.available()];
fileIn3.read(encodedpubKey);
fileIn3.close();
X509EncodedKeySpec pubKeySpec= new X509EncodedKeySpec(encodedpubKey);
KeyFactory keyFactory=KeyFactory.getInstance("DSA");
PublicKey pubKey=keyFactory.generatePublic(pubKeySpec);
FileInputStream sigStream=new FileInputStream(jTextField6.getText()); //獲取簽名文件
byte[] signature=new byte[sigStream.available()];
sigStream.read(signature);
sigStream.close();
Signature sigObj=Signature.getInstance("SHA1WithDSA");
sigObj.initVerify(pubKey);
fileIn4=new FileInputStream(jTextField4.getText());
byte temp;
while((fileIn4.available())!=0)
{
temp=(byte)fileIn4.read();
sigObj.update(temp);
};
fileIn4.close();
boolean verifies;
if( verifies=sigObj.verify(signature))
JOptionPane.showMessageDialog(null, jTextField4.getText()+" 文件驗(yàn)證通過","確認(rèn)消息", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, jTextField4.getText()+" 文件驗(yàn)證失敗","確認(rèn)消息", JOptionPane.INFORMATION_MESSAGE);
}
2.服務(wù)器
本程序這部分主要為了程序演示,,采用JSP技術(shù)實(shí)現(xiàn)了文件上傳功能。為了實(shí)現(xiàn)穩(wěn)定的上傳功能,,程序使用第三方的類庫cos,。文件fileload.jsp主要代碼如下:
// 上傳文件
MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"GBK" );
<%
// 取得所有上傳文件名稱
Enumeration filesname = multi.getFileNames();
while (filesname.hasMoreElements())
{
String name = (String) filesname.nextElement();
fileName = multi.getFilesystemName(name);
File f = multi.getFile(name);
String ContentType = multi.getContentType(name);
if (fileName != null)
{
count ++;
%>
<font color="red">您上傳的第<%= count %>個(gè)文件:</font><br>
文件名:<%= fileName %><br>
文件類型:<%= ContentType %><br>
文件描述:<%= fileDescription[count-1] %><br><br>
<%
}
}
%>
三、運(yùn)行結(jié)果
程序已在NetBeans IDE 5.0+j2sdk1.5環(huán)境調(diào)試成功,,服務(wù)器軟件采用Tomcat 5,。
客戶端軟件運(yùn)行效果如圖1所示。
圖1 客戶端顯示界面
1.在圖1中點(diǎn)擊“生成密鑰對(duì)”按鈕,,即在當(dāng)前目錄生成公鑰文件sigPublicKey.dat和私鑰文件sigPrivateKey.dat,,生成完畢后會(huì)彈出密鑰生成成功消息框,私鑰文件自己保留,,公鑰文件公開發(fā)布,。
2.在圖1中,選擇原文件和私鑰文件,,輸入保存的簽名文件名,,然后點(diǎn)擊“生成簽名文件”按鈕,生成指定的數(shù)字簽名文件,。
3.文件上傳頁面fileload.html(如圖2所示),,在上傳時(shí),將原文件和生成的簽名文件一同打包上傳,。
圖2 上傳頁面
4.接收方同樣運(yùn)行客戶端軟件,,選擇原文件和發(fā)送方的公鑰文件,發(fā)送方的簽名文件,,然后點(diǎn)擊“文件簽名驗(yàn)證”按鈕,,如果驗(yàn)證通過,則彈出消息確認(rèn)框(如圖3所示),,如驗(yàn)證失敗,,則彈出驗(yàn)證失敗消息框。
圖 3 消息確認(rèn)框
四、結(jié)語
目前,,數(shù)字簽名技術(shù)已成為計(jì)算機(jī)網(wǎng)絡(luò)信息安全方面的一項(xiàng)重要技術(shù),用于數(shù)字簽名的公開密鑰體制除了本文用到的DSA算法,,常用的算法還有RSA算法和橢圓曲線算法。本文所闡述數(shù)字簽名技術(shù)主要用于網(wǎng)上申請(qǐng)文件方面,,當(dāng)然此程序同樣適用于各類電子文件的數(shù)字簽名,。
|