keytool
keytool工具 是一個Java 數(shù)據(jù)證書的管理工具跟匆,它是JDK自帶的一個在命令行下執(zhí)行的程序异袄。
常用命令:
genkey 生成密鑰對(公鑰和私鑰)
-v 顯示密鑰庫中的證書詳細信息
-alias <alias_name> 秘鑰的別名,只有前8個字符有效
-keyalg <alg> 生成秘鑰的算法玛臂,支持DSA和RSA
-keysize <size> 生成秘鑰的位數(shù)隙轻,默認1024位,建議使用2048以上的位數(shù)
-dname <name> 發(fā)布者名稱垢揩,如未指定玖绿,在使用jarsigner簽名時會提示輸入
-keypass <password> 秘鑰的密碼
-validity <valDays> 密鑰的有效期是多少天
-storepass <password> keystore的密碼
如下是使用Keytool生成keystore文件,使用RSA算法叁巨,秘鑰長度為4096位
keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
生成的過程中會讓我們填寫一些信息斑匪,如密碼、城市等锋勺,生成的keystore文件默認在當前目錄下蚀瘸。
jarsigner
Android系統(tǒng)中的簽名算法使用MD5作為哈希算法并使用RSA進行加密和解密,計算apk的哈希算法使用SHA-1
常用命令:
-keystore <keystore-name>.keystore keystore路徑
-signedjar <signed-apk-name>.apk 簽名后apk文件輸出路徑
-verbose 輸出詳細信息
-sigalg <算法> 簽名算法
-digestalg <算法> 處理apk使用的哈希算法
-verify 驗證已簽名的jar文件
我們通過工具導出一個未經(jīng)過簽名的apk文件庶橱,為其簽名
通過Eclipse:
右鍵單擊項目名稱贮勃,選擇AndroidTools→Export Unsinged Application Package通過AndroidStudio
在找到項目右側的Gradle按鈕,點擊打開
在打開的窗口中找到項目名對應的Gradle,依次進入Tasks→build苏章,點擊assemble進行生成
生成后的apk文件在moudle的build/outputs/apk目錄下寂嘉,文件名包含unsigned的apk文件即是生成的未簽名apk文件
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar my_application_signed.apk my_application_unsigned.apk my_alias
如圖所示,雖然我們簽名成功了枫绅。但是會提示警告:
警告:
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2045-10-02) or after any future revocation date.
大概意思是說泉孩,未提供 -tsa 或 -tsacert, 此 jar 沒有時間戳。如果沒有時間戳, 則在簽名者證書的到期或以后的任何撤銷日期之后并淋,用戶可能無法驗證此jar寓搬。
解決此問題的方法就是在命令后面添加時間戳網(wǎng)址,完整命令如下:
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar my_application_signed.apk my_application_unsigned.apk my_alias -tsa http://sha256timestamp.ws.symantec.com/sha256/timestamp
網(wǎng)上大部分讓加的-tsa https://timestamp.geotrust.com/tsa 會提示無法對 jar 進行簽名: 時間戳頒發(fā)機構沒有響應县耽。
原因是這個時間戳網(wǎng)址已經(jīng)過期了
我們可以通過如下命令進行驗證簽名是否成功:
jarsigner -verify my_application_signed.apk
如果你使用的是一個簽過名的apk文件句喷,執(zhí)行重簽名會報如下錯誤:
jarsigner: 無法對 jar 進行簽名: java.util.zip.ZipException: invalid entry compressed size
如果有重簽名(與之前簽名不同)的需求,可以把要重簽名的apk后綴改成zip兔毙,打開后刪除里面的META-INF目錄唾琼,然后重新改成apk后綴,再次進行簽名
zipalign
簽名之后瞒御,我們還可以使用zipalign工具對安裝包進行對齊優(yōu)化父叙,這樣能夠讓應用程序和整個系統(tǒng)運行得更快
開發(fā)工具進行zipalign非常方便:
Eclipse中的ADT插件(0.9.3及以上版本)可以自動zipalign對齊:
右鍵單擊項目名稱,選擇AndroidTools→Export Signed Application PackageAndroid studio在build.gradle文件中加入zipAlignEnabled true 開啟zipalign對齊:
buildTypes {
release {
...
zipAlignEnabled true
...
}
}
- 手動zipalign對齊:
Android 1.6及以后的SDK的 build-tools/版本/ 文件夾下都有zipalign工具肴裙。例如我的路徑是:
C:\Users\hanpeng\AppData\Local\Android\Sdk\build-tools\23.0.1\zipalign.exe
在簽名后使用以下命令進行zipalign對齊:
zipalign -v 4 my_application_signed.apk my_application_signed_zipaligned.apk
對齊驗證:
zipalign -c -v 4 my_application_signed_zipaligned.apk
參考:
《Android安全機制解析與應用實踐》 第八章 Android應用安全實用解決方案