標籤:android code java tar ext http
Android專屬的安全機制,除了許可權機制外,另外一個就是簽名機制了。簽名機制主要用在以下兩個主要場合起到其作用:升級App和許可權檢查。
升級App
使用者在升級一款已經安裝過的App時,如果程式的修改來自於同一來源,則允許升級安裝,否則會提示簽名不一致無法安裝的提示。
許可權檢查
我曾在Android Permission許可權機制的具體使用一文中提過,對於申請許可權的 protection level 為 signature 或者 signatureOrSystem 的,會檢查許可權申請者和許可權聲明者的認證是否是一致的。
至於簽名機制的原理及其他作用,此不詳述,本文主要介紹,簽名檔案key的產生、用key去簽名apk檔案及查看簽名的方法。
產生keystore
建立keystore,需要用到keytool.exe (位於jdk_xx\jre\bin目錄下),具體做法如下:
(註:
///
Mac下jdk的安裝路徑
蘋果系統已經包含完整的J2SE,其中就有JDK和JVM(蘋果叫VM)。
如果要在MAC系統下開發CODE。可以先裝個IDE(NETBEANS/Eclipse等),而後不需要裝JDK和JVM了,MAC下已經幫你下載好,安裝完成,配置好路徑。當然如果要升級JDK,那當然要自己下載安裝了。
在MAC系統中,jdk的安裝路徑與windows不同,預設目錄是:/System/Libray/Frameworks/JavaVM.Framwork/。
在這個目錄下有個Versions目錄,裡面有不同版本的jdk。
///
)
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
#說明:
# -genkey 產生密鑰
# -alias demo.keystore 別名 demo.keystore
# -keyalg RSA 使用RSA演算法對簽名加密
# -validity 40000 有效期間限4000天
# -keystore demo.keystore
///
(這裡需要注意,命令列下產生keystore的時候會有亂碼 參考以下文字:
首先,我們需要一個keystore,當然已經有了的話就不用這一步了:
cmd下:
進入到jdk的bin目錄,這樣的話,android.keystore檔案就會產生在這個目錄下,簽名的時候我們需要這個檔案
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什嗎?
[Unknown]: qiaoling您的組織單位名稱是什嗎?
[Unknown]: www.chinaandroid.com
您的組織名稱是什嗎?
[Unknown]: www.chinaandroid.com
您所在的城市或地區名稱是什嗎?
[Unknown]: haidian
您所在的州或省份名稱是什嗎?
[Unknown]: BJ
該單位的兩字母國家代碼是什麼
[Unknown]: 86
CN=qiaoling, OU=www.chinaandroid.com, O=www.chinaandroid.com, L=haidian, ST=BJ, C=86 正確嗎?
[否]: Y
輸入<android.keystore>的主密碼(如果和 keystore 密碼相同,按斷行符號):
其中參數-validity為認證有效天數,這裡我們寫的大些10000天。還有在輸入密碼時沒有回顯(儘管輸就是啦) 並且 退格,tab等都屬於密碼內容,這個密碼在給.apk檔案簽名的時候需要.
然後簽名:
Eclipse中,右擊需要簽名的工程-->android tools-->export signed application package...
出現下面對話方塊,選擇需要簽名的工程
next,選擇上面產生的android.keystore檔案位置和設定的密碼
next
next,選擇簽名組建檔案的位置和名稱
finish,搞定啦...
)
///
對apk進行簽名
使用產生的keystore對apk簽名,使用到的是jarsigner.exe ,該工具位於jdk_xx\bin目錄下,命令如下:
jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk demo.keystore
# test_signed.apk是簽名之後的檔案
# test.apk是需要簽名的檔案
另外需要注意的是,如果你的jdk版本在1.7以上,你在對apk簽名時,需要加上這個參數:
1
-digestalg SHA1 -sigalg MD5withRSA
否則同樣會出現:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的錯誤。
(註:
使用jarsigner給android_infoAssistant.apk
檔案簽名,如下所示:
E:\android_publish>"E:\jdk1.6\bin\jarsigner.exe" -verbose -keystore alex_android.keystore -signedjar android_assistant.apk assistant.apk alex_android.keystore
輸入密匙的口令短語:
...... (註:這裡是輸入密碼)
通過上面的命令就可以講未簽名的assistant.apk 檔案簽名為android_assistant.apk
最後驗證是否簽名成功
E:\android_publish>"E:\jdk1.6\bin\jarsigner.exe" -verify android_assistant.apk
如果成功則
輸出:
jar 已驗證 )
查看簽名資訊
1、查看keystore的資訊
1
keytool -list -keystore demo.keystore -alias mykey -v
2、查看keystore的密鑰憑證資訊
1
keytool -list -keystore demo.keystore -alias mykey -rfc
(註:擷取Base64格式的密鑰憑證,RFC 1421)
3、查看apk的簽名資訊
1
jarsigner -verify -verbose -certs <your_apk_path.apk>