這一節以實踐為主在跟著我做相應的操作之前我希望你已經能夠理解筆記七所提到的概念至少你應該對於筆記七的那個大圖有所了解
好了!對於習慣用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