Android獨有的安全機制,除了權限機制外,另外一個就是簽名機制了。簽名機制主要用在以下兩個主要場合起到其作用:升級App和權限檢查。
1.升級App
用戶在升級一款已經安裝過的App時,如果程序的修改來自於同一來源,則允許升級安裝,否則會提示簽名不一致無法安裝的提示。
2.權限檢查
彎柚博客的一篇文章Android Permission權限機制的具體使用提過,對於申請權限的 protection level 爲 signature 或者 signatureOrSystem 的,會檢查權限申請者和權限聲明者的證書是否是一致的。
至於簽名機制的原理及其他作用,此不詳述,本文主要介紹,簽名文件key的生成、用key去簽名apk文件及查看簽名的方法。
3.生成keystore
創建keystore,需要用到keytool.exe (位於jdk_xx\jre\bin目錄下),具體做法如下:
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore
說明:
-genkey 產生密鑰
-alias mykey 別名 mykey
-keyalg RSA 使用RSA算法對簽名加密
-validity 40000 有效期限4000天
-keystore demo.keystore
keytool.exe的位置:
用法示例:需要先打開命令行窗口。
最後生成的keystore文件可以在jdk_xx\jre\bin目錄下,這裏的目錄是C:\Program Files\Java\jre7\bin
如圖:
4.apk簽名
4.1使用愛加密提供的APKSign.exe可視化簽名工具進行加密
使用方法如下:需要準備好apk文件和上面的keystore文件。
4.2使用ADT插件方式進行簽名
如果讀者想在Eclipse中直接對apk文件進行簽名,可以使用ADT插件附帶的功能。在工程右鍵菜單中單擊【Android Tools】>【Export Signed Application Package…】菜單項,打開【Export Android Application】對話框,並在第一頁輸入要導出的工程名,如圖2.9所示。
進入下一個設置頁後,輸入密鑰文件的路徑(【Location】文本框)和密碼,如圖2.10所示。在接下來的兩個設置界面中分別輸入簽名信息和要生成的apk文件名,如圖2.11和圖2.12所示。
圖4.2.1 指定要導出的工程
圖4.2.2 指定密鑰文件的路徑和密碼
圖4.2.3 輸入簽名信息
圖4.2.4 輸入要生成的apk文件名
在進行完上面的設置後,單擊【Finish】按鈕生成被簽名的apk文件。查看生成的文件後會發現,除了生成ch02_showdatetime.apk文件外,還生成了一個private_keys文件。該文件就是密鑰文件。下次再簽名時可以直接選擇該文件。
在對apk文件簽完名後,可以直接將apk文件複製給要使用軟件的用戶或發佈到Android Market以及中國移動的Mobile Market上。要注意的是,Android Market不允許上傳未簽名的apk文件,因此,必須對apk文件進行簽名才能上傳到Android Market上。
4.3使用jarsigner.exe進行簽名
使用產生的keystore對apk簽名,使用到的是jarsigner.exe,該工具位於jdk_xx\bin目錄下,命令如下:
jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk mykey
說明:
> test_signed.apk是簽名之後的文件
> test.apk是需要簽名的文件
另外需要注意的是,如果你的jdk版本在1.7以上,你在對apk簽名時,需要加上這個參數:
-digestalg SHA1 -sigalg MD5withRSA
否則同樣會出現:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的錯誤。
查看簽名信息
1)查看keystore的信息
keytool -list -keystore demo.keystore -alias mykey -v
2)查看keystore的公鑰證書信息
keytool -list -keystore demo.keystore -alias mykey -rfc
(注:獲取Base64格式的公鑰證書,RFC 1421)
3)查看apk的簽名信息
jarsigner -verify -verbose -certs