去年在開發(fā)一個安卓小游戲的時候,還煞有其事地對apk包做了個人簽名。當時只是照貓畫虎的按書上說的步驟來做,也沒深究為什么。最近比較詳細的了解了一下java的安全機制,才發(fā)現(xiàn)原來有那么多一知半解的問題。
創(chuàng)新互聯(lián)是一家成都網(wǎng)站設計、網(wǎng)站制作,提供網(wǎng)頁設計,網(wǎng)站設計,網(wǎng)站制作,建網(wǎng)站,專業(yè)公司,網(wǎng)站開發(fā)公司,2013年至今是互聯(lián)行業(yè)建設者,服務者。以提升客戶品牌價值為核心業(yè)務,全程參與項目的網(wǎng)站策劃設計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。先從非對稱加密的公鑰、私鑰機制說起。所謂非對稱就是指用私鑰加密的內(nèi)容要用公鑰來解密(反過來用公鑰加密也一樣必須要用私鑰來解密。公、私其實是對等的一對兒,并非指技術方面,而是針對發(fā)布范圍來說的)
有了這種加密、解密的唯一性,我們就可以有這樣一些結論:用私鑰/公鑰加密的,只有通過對應的公鑰/私鑰來解密;而能用某個公鑰/私鑰解開的,一定是用其私鑰/公鑰加密的。有點繞嘴,其實不難理解。利用這個特性,我們就可以達到一些互為驗證的目的。
然后介紹一下相關操作。先說關于keystore的:
Keystore是存儲密鑰對集合的文件,所以也叫密鑰庫文件(之前都不知道可以存儲多個)。利用jdk工具是這樣生成的:
keytool -genkey -alias mykey1 -keypass <這個key的密碼> -validity 1000 -keystore xxx.keystore
如果這個xxx.keystore文件還不存在,那么會新生成一個,同時要求輸入一個對xxx.keystore文件進行讀寫的密碼。這個和keypass后的密碼參數(shù)不需要相同。
繼續(xù)一條:
keytool -genkey -alias mykey2 -keypass <這個key的密碼> -validity 1000 -keystore xxx.keystore
這個時候xxx.keystore文件已經(jīng)存在了,所以這個命令是再追加進去一個密鑰對。所以輸入第一次設定的讀寫密碼即可。
從字面意義看會以為alias是個可有可無的別名,但其實不是,這個參數(shù)是必須的,是一對密鑰的“正式”的名字。即便我們不輸入這個參數(shù):-alias mykey1,那么系統(tǒng)也會自動生成一個叫做mykey的密鑰對名字;
如果沒有這個參數(shù):-keypass <這個key的密碼>,那么系統(tǒng)會提示輸入。當然直接回車是設定為和庫文件的讀寫密碼相同。
那么現(xiàn)在呢,實際上xxx.keystore里已經(jīng)存了兩個密鑰對,mykey1和mykey2。可以用這個命令查看:
Keytool –list –keystore xxx.keystore,當然查看也是需要輸入密碼的
有了這些密鑰對,即可以對jar文件進行簽名了。命令是這樣的:
jarsigner -keystore xxx.keystore -storepass <文件讀寫密碼> -keypass <這個key的密碼> xxx.jar mykey1
同樣的,如果沒有這個參數(shù):-storepass <文件讀寫密碼>,系統(tǒng)會要求輸入。沒有這個參數(shù):-keypass <這個key的密碼>,一種情況是mykey1的密碼和庫密碼相同,那么就可以簽名成功。如果不同,那就會報錯。
導出公鑰為一個證書,命令是:
Keytool –export –file xxx.cer –keystore xxx.keystore –alias mykey1,輸入庫密碼后,會生成一個xxx.cer的證書文件。
一個庫里可以有多個密鑰,但一個證書里只有一個公鑰。用命令keytool -printcert -file xxx.cer查看證書,結果是庫密鑰列表中的一個。
私鑰一般用命令導不出來(也沒有導出的必要)。但是可以用寫代碼來導出。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。