熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

用JAVA做數字簽名

2013-11-15 09:49:13  來源: JSP教程 

  數字簽名常被用來校驗軟件及軟件制造者以保證軟件代碼沒有被任何方式
  
  玷污
  
  或者通俗地講使用數字簽名可以確保軟件的清潔正宗即軟件
  
  從其制造者或出版商處直到最終用戶手中這段時間裡未被他人篡改過
  
  本文在對數字簽名的有關概念進行簡單回顧後給出了用JAVA來創建和使用
  
  數字簽名的具體方法
  
  一數字簽名及其功能
  
  數字簽名算法(DSA) 是公共密鑰加密算法中的一種因此讓我們從
  
  私有密鑰/公共密鑰開始進行簡單回顧
  
   私有密鑰加密及其局限性
  
  私有密鑰加密系統使用唯一的密鑰(即私有密鑰)進行加密和解密該密鑰
  
  必須為發送者和接收者所共享若甲要向乙發一個加密郵件甲需用一密鑰
  
  將信息加密乙收到郵件後須用同樣的密鑰將信息解密
  
  該方法顯然有非常嚴重的缺點例如接收雙方必須擁有同樣的密鑰這要
  
  求一定要有一種安全的協議來保證密鑰傳送的可靠第二有緊急的加密消息需
  
  要發送時可能因接收方沒有密鑰而不能完成傳送第三若要將消息發給許多
  
  不同的團體就需要與各個團體對應維護許多不同的密鑰
  
  為克服私有密鑰加密系統的這些弱點人們引進了公共密鑰加密系統
  
   公共密鑰加密
  
  公共密鑰加密不需要一條信息的發送者和接收者知道對方的密鑰就能訪問
  
  該加密信息
  
  公共密鑰加密系統使用密鑰對(公共密鑰和私有密鑰)來加密和解密信息
  
  其加密思想也非常簡單用公共密鑰加密的信息只能用與之對應的私有密鑰解開
  
  而用私有密鑰加密的信息任何擁有與之對應的公共密鑰的人均可解開因此
  
  有密鑰總為個人保管而無須外傳公共密鑰則可授權給他人使用而不會破壞安全
  
  性公共密鑰和私有密鑰之間永遠存在著一對一的關系具體地講即
  
  第一若信息是用接收方的公共密鑰加密的則只有應該收到此消息的人
  
  才能對之解密(即只有擁有與該公共密鑰對應的私有密鑰的人才可解密)例如
  
  甲要向乙發一個加密郵件甲必須用乙的公共密鑰加密信息後再傳給乙
  
  第二若信息是用發送方的私有密鑰加密的則任何擁有發送方公共密鑰的
  
  接收者都可以對信息進行解密從而確定該信息確實是來自該發送者並且信息
  
  內容未遭到任何無意或惡意的破壞
  
  上述第二點正是數字簽名的含義
  
   數字簽名的功能
  
  一個數字簽名是一個定長的二進制數字流其內容附著於被簽名的數據之上
  
  它可以和任何種類的數字數據一起使用除最普通的代碼軟件外還可用在口令
  
  電子郵件及電子文檔中數字簽名的主要功能為防止原始文檔被污染或變更
  
  防止別有用心者使用他人名字散布欺騙性消息以及提供誰是文件原作者的證
  
  據等等
  
  二用JAVA創建及使用數字簽名
  
  除了上面提到的功能外用JAVA做數字簽名還有更現實的意義最常見的是
  
  應用數字簽名可以突破浏覽器在安全性方面的某些限制例如你的浏覽器一般
  
  會拒絕網上的JAVA程序讀寫你本地硬盤的文件或獲取你的本地信息(如你的用戶
  
  名稱等)哪怕你確認該JAVA程序是可靠的(其實你不可能完全確認來自網
  
  上的某個程序真的是可靠的若你確要運行該JAVA程序你必須關閉浏覽
  
  器的安全檢查功能但這無異於將本地系統置為不設防的城池使用數字簽
  
  名可完美地解決這個問題當浏覽器感覺到你使用的是簽名後的JAVA小程序後
  
  它會自動搜索與之匹配的數字簽名並進行校驗若成功則浏覽器認定該JAVA小程序
  
  是值得信任的於是放行這樣既保證了安全性又可以讓真正可信的的JAVA程序擁有許多特權(見下述JAVA程序)
  
  在 JDK與數字簽名有關的工作是由工具程序 javakey 來完成的
  
  javakey 是 Sun 提供的一個命令行工具用來為存檔文件(jar 文件)生成數
  
  字簽名並管理密鑰數據庫
  
  下面我們將通過一個具體例子來看一看創建和使用數字簽名的步驟有關概
  
  念和解釋將在例子中給出
  
   Java 程序及數字簽名的創建 (加密方或簽字者應執行的步驟)
  
  下面的JAVA小程序非常簡單它的主要功能為獲取 Win/系統當前登錄
  
  用戶的名稱字符串然後將之寫入本地硬盤當前目錄的 TestTxt 文件上
  
  import javaawt*;
  
  import javaio*;
  
  import javalang*;
  
  import javaapplet*;
  
  public class MyApp extends Applet {
  
  DataOutputStream out_file;
  
  public void paint(Graphics g) {
  
  try {
  
  String YourName = SystemgetProperty(username);
  
  out_file = new DataOutputStream(new FileOutputStream(TestTxt));
  
  out_filewriteChars(Your Name: +YourName+\n);
  
  out_fileclose();
  
  gdrawString(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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.