Apk去掉簽名以及重新簽名的方法


Android開發中很重要的一部就是用自己的密鑰給Apk文件簽名,不經過簽名的Apk文件一般是無法安裝的,就算裝了最后也是失敗。

網上流傳的“勾選允許安裝未知來源的應用”其實跟簽不簽名沒啥關系,說白了就是允許安裝不從電子市場上下載的應用而已。

近幾日需要修改一個Apk中JNI調用的.so文件,苦於沒有apk源代碼,只好研究了一下簽名相關的問題。當然有很多第三方工具可以做到,但其實JDK中已經提供了強大的簽名工具jarsigner。

  1. 去除簽名

    其實很簡單,用WinRAR打開apk,找到META-INF文件夾,刪除MANIFEST.MF之外的所有其他文件即可。

  2. 簽名

    運行jarsigner,如果沒有設置PATH環境變量,那可以從JDK安裝路徑下的bin目錄中找到,比如我本機的就是C:\Program Files\Java\jdk1.8.0_31\bin\jarsigner.exe

    jarsigner用法如下:

    用法: jarsigner [選項] jar-file 別名
           jarsigner -verify [選項] jar-file [別名...]
    
    [-keystore <url>]           密鑰庫位置
    
    [-storepass <口令>]         用於密鑰庫完整性的口令
    
    [-storetype <類型>]         密鑰庫類型
    
    [-keypass <口令>]           私有密鑰的口令 (如果不同)
    
    [-certchain <文件>]         替代證書鏈文件的名稱
    
    [-sigfile <文件>]           .SF/.DSA 文件的名稱
    
    [-signedjar <文件>]         已簽名的 JAR 文件的名稱
    
    [-digestalg <算法>]        摘要算法的名稱
    
    [-sigalg <算法>]           簽名算法的名稱
    
    [-verify]                   驗證已簽名的 JAR 文件
    
    [-verbose[:suboptions]]     簽名/驗證時輸出詳細信息。
                                子選項可以是 all, grouped 或 summary
    
    [-certs]                    輸出詳細信息和驗證時顯示證書
    
    [-tsa <url>]                時間戳頒發機構的位置
    
    [-tsacert <別名>]           時間戳頒發機構的公共密鑰證書
    
    [-tsapolicyid <oid>]        時間戳頒發機構的 TSAPolicyID
    
    [-altsigner <類>]           替代的簽名機制的類名
    
    [-altsignerpath <路徑列表>] 替代的簽名機制的位置
    
    [-internalsf]               在簽名塊內包含 .SF 文件
    
    [-sectionsonly]             不計算整個清單的散列
    
    [-protected]                密鑰庫具有受保護驗證路徑
    
    [-providerName <名稱>]      提供方名稱
    
    [-providerClass <類>        加密服務提供方的名稱
      [-providerArg <參數>]]... 主類文件和構造器參數
    
    [-strict]                   將警告視為錯誤

    比較常用的參數就是指定keystore的位置和簽名后的文件,舉例如下:

    jarsigner -keystore C:\myKey.key -signedjar apk-signed.apk apk-unsigned.apk myKey

    待簽名的文件是apk-unsigned.apk,簽名后的apk是apk-signed.apk。我們也可以不指定-signedjar參數,則在待簽名的apk上直接簽名。最后一個myKey是我的keystore的別名。

    簽名完成后再用WinRAR打開,會發現META-INF目錄下多了MYKEY.RSA和MYKEY.SF兩個文件,他們分別是:
    MANIFEST.MF中保存了所有其他文件的SHA-1並base64編碼后的值。
    MYKEY.SF中也有其他文件的SHA-1並base64編碼的值,而且還多一個MANIFEST.MF文件的SHA-1並base64編碼后的值
    MYKEY.RSA包含了公鑰信息和發布機構信息
    后兩個文件的名稱和我的key別名轉換為大寫后一致。

    關於如何生成本機的keystore就不再贅述了,在AndroidStudio和Eclipse中都有相應的工具,圖形界面,so easy。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM