Android apk簽名詳解——AS簽名、獲取簽名信息、系統(tǒng)簽名、命令行簽名

Apk簽名,每一個Android開發(fā)者都不陌生。它就是對我們的apk加了一個校驗參數(shù),防止apk被掉包。一開始做Android開發(fā),就接觸到了apk簽名;后來在微信開放平臺、高德地圖等平臺注冊時,需要填寫apk簽名的md5值和sha256值;再后來做系統(tǒng)應用,接觸到了系統(tǒng)簽名;而后就想了解下apk的生成機制,學習了如何用命令行進行簽名。很早時以為很簡單的簽名,真沒想到也蘊含這么豐富的知識,就想整理一下,也分享給其它小伙伴們。

文章結(jié)構(gòu):

  • 利用Android Studio生成簽名與對apk進行簽名
  • 獲取簽名文件的md5值和sha256值
  • 獲取系統(tǒng)簽名
  • 利用命令行生成簽名與對apk進行簽名

一、利用Android Studio生成簽名與對apk進行簽名

利用Android Studio(或者Eclipse)生成簽名與對apk進行簽名,是最常用的簽名方式。本文也就從這里開始說起。

1.生成簽名

依次選擇Build——Generate Signed Bundle/APK——選擇apk——點擊Next,會看到Key store path下面有兩個按鈕(如圖1)。


圖片1.png

我們這里是要生成簽名,當然選擇Create New…,打開New Key Store對話框(如圖2),填入指定的信息后,點擊OK即可生成簽名。


圖片2.png

2.對apk進行簽名

打開Generate Signed Bundle or APK對話框后,直接選擇已有的簽名即可,點擊Next,選擇輸出路徑、簽名版本后,點擊Finish即可生成簽名后的版本。

3.Android Studio2.2之后的V1簽名和V2簽名

當使用Android Studio2.2及以后版本進行簽名打包時,會發(fā)現(xiàn)多了一個對簽名版本的選擇(如圖3),這個V1和V2表示什么意思呢?


圖片3.png

V1就是傳統(tǒng)的簽名方式,V2則是Android7.0之后引入的。其區(qū)別是,V1是通過ZIP條目進行驗證,這樣APK 簽署后可進行許多修改;而V2驗證壓縮文件的所有字節(jié),而不是單個 ZIP 條目,這樣在簽名后無法再更改。V2的好處很明顯,更安全且驗證更迅速。所以,推薦在生成apk時,簽名方式選擇V1+V2。當然,僅僅選擇V1也是可以的。如果僅選擇V2呢,這樣生成的apk在Android7.0及之后的版本上沒有問題,不過會導致7.0以下的版本無法安裝,所以要避免這種方式。

4.在gradle中配置簽名信息

我們都知道Android使用gradle來構(gòu)建版本,因此我們也希望在gradle中配置好簽名信息,在打包apk時更方便。
在項目的build.gradle中,android下加入signingConfig信息。

signingConfigs {      
  debug {          
    storeFile file("./hyydev.jks")          
    storePassword "******"         
     keyAlias "**"          
    keyPassword "******"          
    v1SigningEnabled true          
    v2SigningEnabled true      
  }      
  release {          
    storeFile file("./hyydev.jks")          
    storePassword "******"          
    keyAlias "**"          
    keyPassword "******"         
    v1SigningEnabled true          
    v2SigningEnabled true      
  }
}

5.jks與keystore

從Eclipse開始做Android開發(fā)的小伙伴都知道,Eclipse默認生成的簽名文件是keystore格式,而Android Studio生成的是jks格式。二者只是簽名格式的不同,是可以進行轉(zhuǎn)換的(如何轉(zhuǎn)換,后續(xù)會專門介紹)。

二、獲取簽名文件的md5值和sha256值

在文章開始時,就提到了在許多開放平臺注冊時,需要用到apk簽名的md5值和sha256值,怎么獲取呢?這里提供了兩種方法。

1.用命令行獲取md5值和sha256值

keytool -v -list -keystore hyydev.jks

如圖4。


圖片4.png

2.用代碼獲取md5值和sha256值

除了用keytool命令獲取外,也可以通過代碼獲取簽名的md5值和sha256值。
代碼如下:

public static String getSign(Context context, String packageName) {        

  String signValidString = "";      
  try {          
    @SuppressLint("PackageManagerGetSignatures")          
    PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.*GET_SIGNATURES*);          
    signValidString = *getSignValidString*(packageInfo.signatures[0].toByteArray(), "MD5");  //參數(shù)可以填"SHA1"、"SHA256"      
  } catch (Exception e) {      
  }      
  return signValidString;  
}  

private static String getSignValidString(byte[] paramArrayOfByte, String signType) throws NoSuchAlgorithmException {

  MessageDigest localMessageDigest = MessageDigest.*getInstance*(signType); 
  localMessageDigest.update(paramArrayOfByte);      
  return *toHexString*(localMessageDigest.digest());  //轉(zhuǎn)為16進制顯示,實現(xiàn)略去  
}

三、獲取系統(tǒng)簽名

Android系統(tǒng)的簽名信息不是keystore或jks格式,它默認存在build\target\product\security目錄下(如圖5)。如果需要獲取系統(tǒng)簽名的信息,需要在Ubuntu環(huán)境下把它轉(zhuǎn)換為keystore或jks格式。


圖片5.png

1.生成keystore簽名文件

1>.取platform.pk8 platform.x509.pem放到一個目錄下
2>.生成platform.pem

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocrypt

3>.生成platform.p12

openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pk12 -name dev 
Enter Export Password: (輸入密碼,比如hyydev)
Verifying - Enter Export Password:(輸入密碼,比如hyydev)

4>.生成hyysign.keystore

keytool -importkeystore -deststorepass android -destkeypass hyydev -destkeystore hyysign.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass hyydev -alias dev

2.生成jks簽名文件

與生成keystore文件類似。
1>.取platform.pk8 platform.x509.pem放到一個目錄下
2>.生成platform.pem文件

openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

3>.生成platform.p12

openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:hyydev -name hyy

4>.生成hyysign.jks

keytool -importkeystore -deststorepass hyydev -destkeystore hyysign.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass hyydev

3.哪些apk的簽名必須使用系統(tǒng)簽名文件

有些apk需要系統(tǒng)權(quán)限,比如實現(xiàn)關機指令。
如何聲明系統(tǒng)權(quán)限呢?
在AndroidMainfest.xml的mainfest中加入:

android:sharedUserId="android.uid.system"

用到系統(tǒng)權(quán)限的apk,起簽名必須使用系統(tǒng)簽名,否則安裝不上,會報錯誤(如圖6)。


圖片6.png

四、利用命令行生成簽名與對apk進行簽名

上面所提到的簽名,都是利用IDE來生成簽名、進行簽名,用命令行該怎么做呢?

1.生成簽名

keytool -genkeypair -alias hyydev -keyalg RSA -validity 400 -keystore hyydev.keystore 
圖片7.png

2.對未簽名的apk進行簽名

jarsigner -verbose -keystore hyydev.keystore -signedjar TestSign.apk Test.apk hyydev

3.重簽名

進行重簽名時,會報錯java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575bytes) bytes)。如何解決呢?就是要重簽名的apk后綴改成zip,打開后刪除里面的META-INF目錄,然后重新改成apk后綴,再進行簽名就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 關于作者: 李濤,騰訊Android工程師,14年加入騰訊SNG增值產(chǎn)品部,期間主要負責手Q動漫、企鵝電競等項目的...
    稻草人_3e17閱讀 3,921評論 0 10
  • 對于 Android 開發(fā)者而言, APK 簽名的重要性不言而喻。Android 7.0 后 APK 簽名已經(jīng)從基...
    Cavabiao閱讀 10,128評論 7 30
  • 對于 Android 開發(fā)者而言, APK 簽名的重要性不言而喻。Android 7.0 后 APK 簽名已經(jīng)從基...
    稻草人_3e17閱讀 710評論 0 4
  • 一、前言 Android 簽名。 在說道Android簽名之前,我們需要了解的幾個知識點 1、數(shù)據(jù)摘要(數(shù)據(jù)指紋)...
    福later閱讀 21,744評論 0 13
  • 2018年6月1日 星期五 天氣晴 今天是六一兒童節(jié),昨天下午表演的節(jié)目,雖然只是集體...
    小兔麻麻_ace0閱讀 167評論 0 0

友情鏈接更多精彩內(nèi)容