您好,登錄后才能下訂單哦!
去年在開發一個安卓小游戲的時候,還煞有其事地對apk包做了個人簽名。當時只是照貓畫虎的按書上說的步驟來做,也沒深究為什么。最近比較詳細的了解了一下java的安全機制,才發現原來有那么多一知半解的問題。
先從非對稱加密的公鑰、私鑰機制說起。所謂非對稱就是指用私鑰加密的內容要用公鑰來解密(反過來用公鑰加密也一樣必須要用私鑰來解密。公、私其實是對等的一對兒,并非指技術方面,而是針對發布范圍來說的)
有了這種加密、解密的唯一性,我們就可以有這樣一些結論:用私鑰/公鑰加密的,只有通過對應的公鑰/私鑰來解密;而能用某個公鑰/私鑰解開的,一定是用其私鑰/公鑰加密的。有點繞嘴,其實不難理解。利用這個特性,我們就可以達到一些互為驗證的目的。
然后介紹一下相關操作。先說關于keystore的:
Keystore是存儲密鑰對集合的文件,所以也叫密鑰庫文件(之前都不知道可以存儲多個)。利用jdk工具是這樣生成的:
keytool -genkey -alias mykey1 -keypass <這個key的密碼> -validity 1000 -keystore xxx.keystore
如果這個xxx.keystore文件還不存在,那么會新生成一個,同時要求輸入一個對xxx.keystore文件進行讀寫的密碼。這個和keypass后的密碼參數不需要相同。
繼續一條:
keytool -genkey -alias mykey2 -keypass <這個key的密碼> -validity 1000 -keystore xxx.keystore
這個時候xxx.keystore文件已經存在了,所以這個命令是再追加進去一個密鑰對。所以輸入第一次設定的讀寫密碼即可。
從字面意義看會以為alias是個可有可無的別名,但其實不是,這個參數是必須的,是一對密鑰的“正式”的名字。即便我們不輸入這個參數:-alias mykey1,那么系統也會自動生成一個叫做mykey的密鑰對名字;
如果沒有這個參數:-keypass <這個key的密碼>,那么系統會提示輸入。當然直接回車是設定為和庫文件的讀寫密碼相同。
那么現在呢,實際上xxx.keystore里已經存了兩個密鑰對,mykey1和mykey2。可以用這個命令查看:
Keytool –list –keystore xxx.keystore,當然查看也是需要輸入密碼的
有了這些密鑰對,即可以對jar文件進行簽名了。命令是這樣的:
jarsigner -keystore xxx.keystore -storepass <文件讀寫密碼> -keypass <這個key的密碼> xxx.jar mykey1
同樣的,如果沒有這個參數:-storepass <文件讀寫密碼>,系統會要求輸入。沒有這個參數:-keypass <這個key的密碼>,一種情況是mykey1的密碼和庫密碼相同,那么就可以簽名成功。如果不同,那就會報錯。
導出公鑰為一個證書,命令是:
Keytool –export –file xxx.cer –keystore xxx.keystore –alias mykey1,輸入庫密碼后,會生成一個xxx.cer的證書文件。
一個庫里可以有多個密鑰,但一個證書里只有一個公鑰。用命令keytool -printcert -file xxx.cer查看證書,結果是庫密鑰列表中的一個。
私鑰一般用命令導不出來(也沒有導出的必要)。但是可以用寫代碼來導出。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。