數字簽名常被用來校驗軟件及軟件制造者
以保證軟件代碼沒有被任何方式
玷污
或者通俗地講
使用數字簽名可以確保軟件的
清潔
和
正宗
即軟件
從其制造者或出版商處直到最終用戶手中這段時間裡未被他人篡改過
本文在對數字簽名的有關概念進行簡單回顧後
給出了用JAVA來創建和使用
數字簽名的具體方法
一
數字簽名及其功能
數字簽名算法(DSA) 是
公共密鑰加密算法
中的一種
因此讓我們從
私有密鑰/公共密鑰
開始進行簡單回顧
私有密鑰加密及其局限性
私有密鑰加密系統使用唯一的密鑰(即私有密鑰)進行加密和解密
該密鑰
必須為發送者和接收者所共享
即
若甲要向乙發一個加密郵件
甲需用一密鑰
將信息加密
乙收到郵件後
須用同樣的密鑰將信息解密
該方法顯然有非常嚴重的缺點
例如
接收雙方必須擁有同樣的密鑰
這要
求一定要有一種安全的協議來保證密鑰傳送的可靠
第二
有緊急的加密消息需
要發送時
可能因接收方沒有密鑰而不能完成傳送
第三
若要將消息發給許多
不同的團體
就需要與各個團體對應
維護許多不同的密鑰
為克服私有密鑰加密系統的這些弱點
人們引進了公共密鑰加密系統
公共密鑰加密
公共密鑰加密不需要一條信息的發送者和接收者知道對方的密鑰
就能訪問
該加密信息
公共密鑰加密系統使用密鑰對(公共密鑰和私有密鑰)來加密和解密信息
其加密思想也非常簡單
用公共密鑰加密的信息只能用與之對應的私有密鑰解開
而用私有密鑰加密的信息
任何擁有與之對應的公共密鑰的人均可解開
因此
私
有密鑰總為個人保管而無須外傳
公共密鑰則可授權給他人使用而不會破壞安全
性
公共密鑰和私有密鑰之間永遠存在著一對一的關系
具體地講即
第一
若信息是用接收方的公共密鑰加密的
則只有應該收到此消息的人
才能對之解密(即只有擁有與該公共密鑰對應的私有密鑰的人才可解密)
例如
甲要向乙發一個加密郵件
甲必須用乙的公共密鑰加密信息後再傳給乙
第二
若信息是用發送方的私有密鑰加密的
則任何擁有發送方公共密鑰的
接收者都可以對信息進行解密
從而確定該信息確實是來自該發送者
並且信息
內容未遭到任何無意或惡意的破壞
上述第二點正是數字簽名的含義
數字簽名的功能
一個數字簽名是一個定長的二進制數字流
其內容附著於被簽名的數據之上
它可以和任何種類的數字數據一起使用
除最普通的代碼軟件外
還可用在口令
電子郵件及電子文檔中
數字簽名的主要功能為
防止原始文檔被污染或變更
防止別有用心者使用他人名字散布欺騙性消息
以及
提供誰是文件原作者的證
據
等等
二
用JAVA創建及使用數字簽名
除了上面提到的功能外
用JAVA做數字簽名還有更現實的意義
最常見的是
應用數字簽名可以突破浏覽器在安全性方面的某些限制
例如
你的浏覽器一般
會拒絕網上的JAVA程序讀寫你本地硬盤的文件或獲取你的本地信息(如你的用戶
名稱等)
哪怕你確認該JAVA程序是
可靠的
(其實你不可能完全確認來自網
上的某個程序真的是
可靠的
)
若你確要運行該JAVA程序
你必須關閉浏覽
器的安全檢查功能
但這無異於將本地系統置為
不設防的城池
使用數字簽
名可完美地解決這個問題
當浏覽器
感覺
到你使用的是簽名後的JAVA小程序後
它會自動搜索與之匹配的數字簽名並進行校驗
若成功則浏覽器認定該JAVA小程序
是
值得信任的
於是放行
這樣
既保證了安全性
又可以讓真正
可信的
的JAVA程序擁有許多特權(見下述JAVA程序)
在 JDK
中
與數字簽名有關的工作是由工具程序 javakey 來完成的
javakey 是 Sun 提供的一個命令行工具
用來為存檔文件(jar 文件)生成數
字簽名並管理密鑰數據庫
下面我們將通過一個具體例子來看一看創建和使用數字簽名的步驟
有關概
念和解釋將在例子中給出
Java 程序及數字簽名的創建 (加密方或簽字者應執行的步驟)
下面的JAVA小程序非常簡單
它的主要功能為
獲取 Win
/
系統當前登錄
用戶的名稱字符串
然後將之寫入本地硬盤當前目錄的 Test
Txt 文件上
import java
awt
*;
import java
io
*;
import java
lang
*;
import java
applet
*;
public class MyApp extends Applet {
DataOutputStream out_file;
public void paint(Graphics g) {
try {
String YourName = System
getProperty(
user
name
);
out_file = new DataOutputStream(new FileOutputStream(
Test
Txt
));
out_file
writeChars(
Your Name:
+YourName+
\n
);
out_file
close();
g
drawString(
Your Name has been written to file
);
}
catch (IOException e) {
gdrawString(File i/o error );
}
catch (SecurityException se) {
gdrawString(You can NOT write to disk or get User Name );
}
}
}
// End of MyAppjava
將 MyAppjava 編譯為 MyAppclass 後用下面的 l 送往浏覽器
(命令為 appletviewer l)
/* End of l */
我們發現浏覽器上顯示的是You can NOT write to disk or get User Name
這是因為獲取用戶名和寫本地硬盤均是系統安全特性所禁止的
下面我們創建一個數字簽名以便該程序的使用者無須變更浏覽器的安全檢查
特性就能完成程序功能(即讀用戶名寫入文件)
第一步創建一個實體並將之設為可信的
javakey cs Kompass true
此處的實體是指簽字者(個人公司或組織)這裡假定為Kompass參
數cs告訴 javakey創建一個簽字者並將之放入數據庫中(不帶參數運行javakey
將得到詳細幫助信息)可選參數true表示簽字者Kompass是可信
的(缺省值是不可信)
第二步生成密鑰對(公共密鑰和私有密鑰)並輸出至文件(可選)
javakey gk Kompass DSA Kompass_pub Kompass_priv
其中DSA是加密算法的名字是密鑰的長度Kompass_pub
Kompass_priv分別是兩個密鑰輸出文件的名字
第三步生成一個許可證(certificate)
javakey gc cert_directive_Kompass
這裡的許可證即為可以交給接收方的數字簽名
上面的參數cert_directive_Kompass並不是輸出文件名而是一個缺省
參數配置文件名通俗地講它象是一個ini文件javakey 根據該文件的
內容決定如何生成一個許可證因此簽字者在執行本步驟之前必須用文本編輯
器先生成這個配置文件(學名叫指示文件directive file)
以下給出文件 cert_directive_Kompass 的內容
issuername=Kompass
issuercert=
subjectname=Kompass
subjectrealname=Kompass
unit=JavaSoft
=Sun MicroSystems
untry=US
startdate= May
enddate= May
serialnumber=
outfile=Kompasskey
/* End of cert_directive_Kompass */
從上面最後一行可以看出輸出文件的名字被定義為Kompasskey即
數字簽名Kompasskey連同簽字後的文件將一同被發給接收者
上述文件包括的其它信息主要有發行者信息(issuer)主題信息
(subject)許可證信息(有效期限及序列號)等
第四步創建存檔文件( jar 文件)
jar cf signMyAppjar MyAppclass l
這裡需要說明的是jar是 Sun提供的另一個命令行工具用於生成和維護
存檔文件( jar 文件) jar是一個打包工具它可將JAVA小程序連同有關的
聲音圖像動畫等文件一起打包成一個文件以便於JAVA產品
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19172.html