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