對已有的android apk進行簽名詳解

  先說句廢話,今天用騰訊樂固加固應用死活是找不到pc端了,pc端都是一鍵式簡單的很,無奈網頁端弄吧,上傳上去之後由於加固會把之前的簽名刪除,需要對加固後的apk重新簽名,那麼怎麼簽名,百度了半天怎麼說的都有,於是親自嘗試了各種說法,最後總結了一下,希望給他人行個方便

生成密鑰

  簽名之前需要密鑰文件,如果已經在as上創建完成那麼可以直接進行下面的簽名,如果還沒有密鑰文件就需要創建一個
cmd進入as安裝目錄下androidstudio\jre\bin執行命令

keytool -genkeypair -keystore xxx.jks -alias one -validity 35600 -keyalg RSA

參數說明:

  • -genkeypair 生成一條密鑰對(由私鑰和公鑰組成)
  • -keystore 密鑰庫名字以及存儲位置(默認當前目錄)
  • -alias 密鑰對的別名(密鑰庫可以存在多個密鑰對,用於區分不同密鑰對)
  • -validity 密鑰對的有效期(單位: 天)
  • -keyalg 生成密鑰對的算法(常用RSA/DSA,DSA只用於簽名,默認採用DSA)


在這裏插入圖片描述
注意這裏生成完後會有一個警告
在這裏插入圖片描述
如果直接執行這個命令會報錯:keytool 錯誤: java.lang.Exception: 目標 pkcs12 密鑰庫具有不同的 storepass 和 keypass。請在指定了 -destkeypass 時重試

更改命令如下:

keytool -importkeystore -srckeystore E:\resign\zyw.jks -destkeypass 123456 -destkeystore E:\resign\zyw.jks -deststoretype pkcs12

這裏簡單說下在創建jks密鑰庫的時候爲什麼要讓我們設置 storepass 和 keypass 兩個密碼?
針對KeyStore有兩種不同的操作

  • 對store進行添加/查看操作。
  • 用它來生成或簽名->密鑰或證書。

有時候你可能會讓別人去查看或者更新你的KeyStore,但是卻不想讓他用這個KeyStore裏面的密鑰來簽名。

查看密鑰庫詳細信息

cmd進入as安裝目錄下androidstudio\jre\bin執行命令

keytool -list -v -keystore xxx.jks

對未簽名的apk簽名

方法一 使用jarsigner進行簽名(僅限v1簽名)

打開androidstudio安裝目錄進入androidstudio\jre\bin會看到
在這裏插入圖片描述
打開cmd進入到androidstudio\jre\bin下執行 jarsigner.exe
在這裏插入圖片描述
如果可以運行那麼就可以對apk進行簽名了,爲了方便操作可以將.jks文件和需要簽名的apk放到一個文件夾中,接下來執行命令

jarsigner -verbose -keystore xxx.jks -signedjar aSign.apk a.apk Keyalias

需要替換的參數說明:

  1. xxx.jks:簽名文件(注意需要文件的絕對路徑)
  2. aSign.apk:簽名後成的簽名apk(注意需要文件的絕對路徑)
  3. a.apk:需要簽名的apk(注意需要文件的絕對路徑)
  4. Keyalias:jks中你創建的項目別名(就是Key alias)

例:
在這裏插入圖片描述
我將需要的文件放到了E盤的resign文件夾中,CollectInfo就是Key alias,輸入密鑰庫的密碼短語就是Key store password,輸入CollectInfo的密鑰口令就是Key password
在這裏插入圖片描述
執行成功後
在這裏插入圖片描述

方法二 使用apksigner進行簽名(默認同時使用V1和V2簽名)

打開cmd進入到android sdk 隨便選擇一個版本就可以,這裏我選擇的是29.0.3下執行 命令

apksigner sign --ks xxx.jks --ks-key-alias Keyalias test.apk

需要替換的參數說明:

  1. xxx.jks:簽名文件(注意需要文件的絕對路徑)
  2. Keyalias:jks中你創建的項目別名(就是Key alias)
  3. test.apk:需要簽名的apk(注意需要文件的絕對路徑)

禁用V2簽名

apksigner sign --v2-signing-enabled false --ks xxx.jks --ks-key-alias Keyalias test.apk


在這裏插入圖片描述
這裏的簽名是直接在原apk上直接簽名,簽名完成後看一下apk文件的修改時間就可以了

v1和v2簽名的區別

上面使用 jarsigner 和 apksigner 簽名時提到了v1和v2簽名,下面說一下二者的區別

  在Android Studio中點擊菜單 Build->Generate signed apk… 打包簽名過程中,
可以看到兩種簽名選項 V1(Jar Signature) V2(Full APK Signature),從Android 7.0開始, 谷歌增加新簽名方案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能用舊簽名方案 V1 scheme (JAR signing)

v1簽名:
  來自JDK(jarsigner), 對zip壓縮包的每個文件進行驗證, 簽名後還能對壓縮包修改(移動/重新壓縮文件)。對v1簽名的apk/jar解壓,在META-INF存放簽名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指紋(除了META-INF文件), 由此可知: v1簽名是對壓縮包中單個文件簽名驗證

v2簽名:
  來自Google(apksigner), 對zip壓縮包的整個文件驗證, 簽名後不能修改壓縮包(包括zipalign),對V2簽名的apk解壓,沒有發現簽名文件,重新壓縮後V2簽名就失效, 由此可知: V2簽名是對整個APK簽名驗證

v2簽名的優點:
簽名更安全(不能修改壓縮包)
簽名驗證時間更短(不需要解壓驗證),因而安裝速度加快

注意: apksigner工具默認同時使用V1和V2簽名,以兼容Android 7.0以下版本

zipalign和V2簽名

zipalign 是對zip包對齊的工具,使APK包內未壓縮的數據有序排列對齊,從而減少APP運行時的內存消耗

打開cmd進入到android sdk 隨便選擇一個版本就可以,這裏我選擇的是29.0.3下執行 命令

zipalign -v 4 in.apk out.apk   //4字節對齊優化
zipalign -c -v 4 in.apk  //檢查APK是否對齊


在這裏插入圖片描述
如果使用 apksigner 簽名,zipalign 在簽名之前使用
如果使用 jarsigner 簽名,zipalign 在簽名之後使用

刪除apk簽名

  如果apk已經簽名想重新簽名,將apk用zip打開找到 META-INF 文件夾,刪除MANIFEST.MF之外的所有其他文件即可。

判斷當前apk是否已經簽名

1.直接安裝到手機上,如果安裝成功那麼一定是簽名之後的,如果安裝失敗就是沒有簽名的
2.使用 keytool 驗證,執行命令(這是在androidstudio安裝目錄的\jre\bin下執行)

keytool -printcert -jarfile E:\resign\test.apk

參數說明:

  • -printcert 打印證書內容
  • -jarfile 已簽名的jar文件或apk文件

3.使用 apksigner 驗證,執行命令(在android\sdk\build-tools\29.0.3下執行)

apksigner verify --verbose --print-certs test.apk

參數說明:

  • -v, --verbose 顯示詳情(顯示是否使用v1和v2簽名)
  • –print-certs 顯示簽名證書信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章