熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

實踐對jar包的代碼簽名

2013-11-23 18:49:58  來源: Java核心技術 

  這一節以實踐為主在跟著我做相應的操作之前我希望你已經能夠理解筆記七所提到的概念至少你應該對於筆記七的那個大圖有所了解

  好了!對於習慣用ecplise的朋友今天不得不逼迫你把jdk的環境搭建出來!下面讓我們動手來實踐一下對jar進行簽名吧!

  第一步首先配置jdk的環境變量如果你的電腦已經配置了那直接跳過這一步

  path=%JAVA_HOME%/bin

  JAVA_HOME=C:/Java/jdk_

  CLASSPATH=;%JAVA_HOME%/lib/dtjar;%JAVA_HOME%/lib/toolsjar

  配置要這幾個jdk的環境參數好了配完了試著在cmd裡跑一下javajavac看看命令是否生效如果配置成功執行第二步

  第二步來寫幾個簡單的類簡單的才是大家的你完全可以直接copy我的代碼部分看不懂忽略它做實驗而已對那個jar文件簽名不是簽這個例子的代碼邏輯是後面才用到的不用讀

  第一個類Doer

  package comyfqtest;

  public abstract interface Doer {

  void doYourThing()

  }

  第二個類

  package comyfqtestfriend;

  import javasecurityAccessController;

  import javasecurityPrivilegedAction;

  import comyfqtestDoer;

  public class Friend implements Doer{

  private Doer next;

  private boolean direct;

  public Friend(Doer nextboolean direct){

  thisnext=next;

  thisdirect=direct;

  }

  @Override

  public void doYourThing() {

  Systemoutprintln(Im a Friend

  if (direct) {

  nextdoYourThing()

  } else {

  AccessControllerdoPrivileged(new PrivilegedAction() {

  @Override

  public Object run() {

  nextdoYourThing()

  return null;

  }

  })

  }

  }

  }

  第三個類

  package comyfqteststranger;

  import javasecurityAccessController;

  import javasecurityPrivilegedAction;

  import comyfqtestDoer;

  public class Stranger implements Doer {

  private Doer next;

  private boolean direct;

  public Stranger(Doer next boolean direct) {

  thisnext = next;

  thisdirect = direct;

  }

  @Override

  public void doYourThing() {

  Systemoutprintln(Im a Stranger

  if (direct) {

  nextdoYourThing()

  } else {

  AccessControllerdoPrivileged(new PrivilegedAction() {

  @Override

  public Object run() {

  nextdoYourThing()

  return null;

  }

  })

  }

  }

  }

  好了編譯一下用強大的ecplise來編譯項目右鍵Build Project(工具是拿來用的不要浪費這些強大的功能!)

  第三步打jar包用ecplise就可以了就有導出jar包的功能我還是那句老話有工具不用不是牛是蠢

  步驟一項目右鍵ExportjavaJAR filenext

  步驟二展開目錄清單分別對comyfqtesfriend和comyfqteststranger打包(friendjarstrangerjar)放到哪裡就隨便你了只要你記得就好我這裡假設是放在d盤的根目錄下

  第四步用java的keytool生成密鑰對用java的jarsigner做簽名(記得筆記七我們說過對hash摘要的加密是非對稱加密的嗎?這裡就需要兩把不同的鑰匙啦)一步步跟我來

  步驟一cmd窗口進入到存放friendjar和strangerjar的目錄下假設我的jar文件放在d盤下直接輸入盤符d:就可以了

  步驟二在cmd窗口中輸入keytool genkey alias friend keypass friendlife validity keystore ijvmkeys

  生成第一個密鑰對這個密鑰對的別名是 friend查看密鑰對所需要的密碼是friendfile密鑰對的過期時間是密鑰對存儲的文件名ijvmkeys

  而查看ijvmkeys的密碼我們設置為ijvmed

   
     步驟三在cmd窗口輸入keytool genkey alias stranger keypass strangerlife validity keystore ijvmkeys

  按照步驟的截圖一步一步輸入吧這個步驟是生成別名為stranger的密鑰對

  好了密鑰對生成結束看看你的jar文件目錄下有沒有多出一個文件ijvmkeys是滴這裡生成了一個用於存放密鑰對的文件

  步驟四對jar進行摘要並對hash摘要進行加密生成簽名放置到jar文件結構的尾部

  在cmd窗口輸入

  jarsigner keystore ijvmkeys storepass ijvmed keypass firendfile friendjar friend

  jarsigner keystore ijvmkeys storepass ijvmed keypass strangerfile strangerjar stranger

  步驟五查看生成的密鑰文件在cmd窗口輸入keytool list v keystore ijvmkeys storepass ijvmed
                                          
    查看上面最後一個截圖我們來驗證一下在筆記七裡說過的話

  我們說過hash摘要是一個的值對不對呢看證書指紋那一行md:…

  你數一數總共有幾個十六進制數一個十六進制數用個位可以表示完那麼總共是幾位*=但是後面還有一個sha怎麼回事他貌似不止是滴散列函數多種多樣到底用那個散列函數md還是sha這個就看你喜歡而要使用哪個散列函數是可以指定的keytool的參數keyalg DSA這個參數就是用來指定用什麼散列算法的默認的就是DSA普通的位散列數已經是安全的了

  在 筆記七中記不記得最下面那個圖有一個認證機構會對解密簽名(被加密的hash摘要)的公鑰做認證(也就是加密公鑰)並發布證書我們這裡沒有認證機構你有沒有這個疑問?

  keytool程序在生成密鑰時總是會生成一個自簽名證書(自簽名是指如果附近沒有認證機構可以用私鑰對公鑰簽名生成一個自簽名證書)

  總結

  好了對於jar文件的簽名我們已經完成了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25819.html
  • 上一篇文章:

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