用JAVA做數(shù)字簽名
發(fā)表時間:2023-07-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]數(shù)字簽名常被用來校驗軟件及軟件制造者,以保證軟件代碼沒有被任何方式玷污。 ---- 或者通俗地講,使用數(shù)字簽名可以確保軟件的“清潔”和“正宗”,即軟件從其制造者或出版商處直到最終用戶手中這段時間里未...
數(shù)字簽名常被用來校驗軟件及軟件制造者,以保證軟件代碼沒有被任何方式玷污。
---- 或者通俗地講,使用數(shù)字簽名可以確保軟件的“清潔”和“正宗”,即軟件從其制造者或出版商處直到最終用戶手中這段時間里未被他人篡改過。
---- 本文在對數(shù)字簽名的有關(guān)概念進行簡單回顧后,給出了用JAVA來創(chuàng)建和使用數(shù)字簽名的具體方法。
一、數(shù)字簽名及其功能
---- 數(shù)字簽名算法(DSA) 是“公共密鑰加密算法”中的一種,因此讓我們從 “私有密鑰/公共密鑰”開始進行簡單回顧。
---- 1. 私有密鑰加密及其局限性
---- 私有密鑰加密系統(tǒng)使用唯一的密鑰(即私有密鑰)進行加密和解密。該密鑰必須為發(fā)送者和接收者所共享。即,若甲要向乙發(fā)一個加密郵件,甲需用一密鑰將信息加密;乙收到郵件后,須用同樣的密鑰將信息解密。
---- 該方法顯然有非常嚴重的缺點。例如,接收雙方必須擁有同樣的密鑰,這要求一定要有一種安全的協(xié)議來保證密鑰傳送的可靠;第二,有緊急的加密消息需要發(fā)送時,可能因接收方?jīng)]有密鑰而不能完成傳送;第三,若要將消息發(fā)給許多不同的團體,就需要與各個團體對應(yīng),維護許多不同的密鑰。
---- 為克服私有密鑰加密系統(tǒng)的這些弱點,人們引進了公共密鑰加密系統(tǒng)。
---- 2. 公共密鑰加密
---- 公共密鑰加密不需要一條信息的發(fā)送者和接收者知道對方的密鑰,就能訪問該加密信息。
---- 公共密鑰加密系統(tǒng)使用密鑰對(公共密鑰和私有密鑰)來加密和解密信息。其加密思想也非常簡單:用公共密鑰加密的信息只能用與之對應(yīng)的私有密鑰解開;而用私有密鑰加密的信息,任何擁有與之對應(yīng)的公共密鑰的人均可解開。因此,私有密鑰總為個人保管而無須外傳,公共密鑰則可授權(quán)給他人使用而不會破壞安全性,公共密鑰和私有密鑰之間永遠存在著一對一的關(guān)系。具體地講即:
---- 第一,若信息是用接收方的公共密鑰加密的,則只有應(yīng)該收到此消息的人才能對之解密(即只有擁有與該公共密鑰對應(yīng)的私有密鑰的人才可解密)。例如,甲要向乙發(fā)一個加密郵件,甲必須用乙的公共密鑰加密信息后再傳給乙。
---- 第二,若信息是用發(fā)送方的私有密鑰加密的,則任何擁有發(fā)送方公共密鑰的接收者都可以對信息進行解密,從而確定該信息確實是來自該發(fā)送者,并且信息內(nèi)容未遭到任何無意或惡意的破壞。
---- 上述第二點正是數(shù)字簽名的含義。
---- 3. 數(shù)字簽名的功能
---- 一個數(shù)字簽名是一個定長的二進制數(shù)字流,其內(nèi)容附著于被簽名的數(shù)據(jù)之上。它可以和任何種類的數(shù)字數(shù)據(jù)一起使用,除最普通的代碼軟件外。還可用在口令、電子郵件及電子文檔中。數(shù)字簽名的主要功能為:防止原始文檔被污染或變更;防止別有用心者使用他人名字散布欺騙性消息;以及,提供誰是文件原作者的證據(jù),等等。
二、用JAVA創(chuàng)建及使用數(shù)字簽名
---- 除了上面提到的功能外,用JAVA做數(shù)字簽名還有更現(xiàn)實的意義。最常見的是:應(yīng)用數(shù)字簽名可以突破瀏覽器在安全性方面的某些限制。例如,你的瀏覽器一般會拒絕網(wǎng)上的JAVA程序讀寫你本地硬盤的文件或獲取你的本地信息(如你的用戶名稱等),哪怕你確認該JAVA程序是“可靠的”(其實你不可能完全確認來自網(wǎng)上的某個程序真的是“可靠的”)。若你確要運行該JAVA程序,你必須關(guān)閉瀏覽器的安全檢查功能,但這無異于將本地系統(tǒng)置為“不設(shè)防的城池”。使用數(shù)字簽名可完美地解決這個問題:當瀏覽器“感覺”到你使用的是簽名后的JAVA小程序后,它會自動搜索與之匹配的數(shù)字簽名并進行校驗,若成功則瀏覽器認定該JAVA小程序是“值得信任的”,于是放行。這樣,既保證了安全性,又可以讓真正“可信的”的 JAVA程序擁有許多特權(quán)(見下述JAVA程序)。
---- 在 JDK1.1 中,與數(shù)字簽名有關(guān)的工作是由工具程序 javakey 來完成的。 javakey 是 Sun 提供的一個命令行工具,用來為存檔文件(jar 文件)生成數(shù)字簽名并管理密鑰數(shù)據(jù)庫。
---- 下面我們將通過一個具體例子來看一看創(chuàng)建和使用數(shù)字簽名的步驟,有關(guān)概念和解釋將在例子中給出。
---- 1. Java 程序及數(shù)字簽名的創(chuàng)建 (加密方或簽字者應(yīng)執(zhí)行的步驟) 下面的JAVA小程序非常簡單,它的主要功能為:獲取 Win95/98系統(tǒng)當前登錄用戶的名稱字符串,然后將之寫入本地硬盤當前目錄的 Test.Txt 文件上。
... ...
---- 將 MyApp.java 編譯為 MyApp.class 后,用下面的 MyApp.html 送往瀏覽器(命令為 appletviewer MyApp.html)。
... ...
---- 我們發(fā)現(xiàn)瀏覽器上顯示的是“You can NOT write to disk or get User Name”。這是因為獲取用戶名和寫本地硬盤均是系統(tǒng)安全特性所禁止的。
---- 下面我們創(chuàng)建一個數(shù)字簽名,以便該程序的使用者無須變更瀏覽器的安全檢查特性就能完成程序功能(即:讀用戶名,寫入文件)。
---- 第一步:創(chuàng)建一個實體,并將之設(shè)為“可信的”。
... ...
---- 第二步:生成密鑰對(公共密鑰和私有密鑰)并輸出至文件(可選)。
... ...
---- 第三步:生成一個許可證(certificate)。
... ...
---- 第四步:創(chuàng)建存檔文件( jar 文件)。
... ...
---- 第五步:對存檔文件進行簽名。
... ...
---- 第六步:更改文件名。
... ...
---- 2. 數(shù)字簽名的使用 (解密方或使用者應(yīng)執(zhí)行的步驟)
---- 第一步:得到許可證(即數(shù)字簽名 -- Kompass.key)和簽名后的文件。
---- 第二步:創(chuàng)建簽名者實體,并將之設(shè)為“可信的”。
javakey -c Kompass true
第三步:將許可證倒入數(shù)據(jù)庫。
javakey -ic Kompass Kompass.key
最后一步:運行JAVA程序。
appletviewer signMyApp.html
我們注意到這里的“.html”
不是上面給出的“MyApp.html”。其實這二者
的差別很小,“signMyApp.html”
只是多了一個參數(shù):
archive="signMyApp.jar"
它告訴瀏覽器所有有用的文件
(這里的 MyApp.class)均在存檔文件中而不
在其它地方。
... ...
---- 現(xiàn)在,我們終于看到了期待已久的結(jié)果:瀏覽器打出了“Your Name has been written to file < Test.Txt >”;而文件“Test.Txt”確實被創(chuàng)建,并且其內(nèi)容正是用戶登錄 Win95/98 時的名字:
Y o u r N a m e : M a w e n q i a n