Android 簽名基礎(chǔ)知識(shí)

文章大綱:

  • Android 為什么要簽名
  • keystore的生成
  • Android 怎么簽名
  • 查看 apk 是否簽名
  • 查看 Apk 的MD5值以及MD5不顯示時(shí)的解決辦法

Android 為什么要簽名

在安裝 apk 時(shí),需要確保 apk 來(lái)源的真實(shí)性,以及 apk 沒(méi)有被第三方篡改。為了解決這一問(wèn)題,Android官方要求開(kāi)發(fā)者對(duì) apk 進(jìn)行簽名,所謂的簽名就是對(duì)apk進(jìn)行加密的過(guò)程。

keystore的生成:

在簽名之前要生成 keystore 文件來(lái)存儲(chǔ)密鑰

(1)分階段生成:
keytool -genkey -alias yushan(別名) -keypass yushan(別名密碼) -keyalg RSA(算法) -keysize 1024(密鑰長(zhǎng)度) -validity 365(有效期,天單位) -keystore 指定路徑/yushan.keystore(指定生成證書(shū)的位置和證書(shū)名稱(chēng)) -storepass 123456(獲取keystore信息的密碼) 回車(chē)輸入相關(guān)信息即可;

 keytool -genkey -alias test -keypass testmima -keyalg RSA -keysize 1024 -validity 365 -keystore /Users/xxx/Desktop/test.keystore   

或者:

keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -validity 365 -storepass 123456
image

(2)一次性生成:
keytool -genkey -alias test -keypass test -keyalg RSA -keysize 1024 -validity 365 -keystore 指定路徑/test.keystore -storepass 123456 -dname "CN=(名字與姓氏), OU=(組織單位名稱(chēng)), O=(組織名稱(chēng)), L=(城市或區(qū)域名稱(chēng)), ST=(州或省份名稱(chēng)), C=(單位的兩字母國(guó)家代碼)"(中英文即可)

keystore信息的查看:

keytool -list -v -keystore test.keystore -storepass 123456

image

參數(shù)說(shuō)明:

  • -genkey 【生成密鑰對(duì)】
  • -alias 【別名】
  • -keypass 【私鑰舊密碼】
  • -keyalg 【關(guān)鍵算法】
  • -keysize 【密鑰長(zhǎng)度】
  • -validity 【有效時(shí)長(zhǎng),以天為單位】
  • -keystore 【密鑰存儲(chǔ)庫(kù)位置】
  • -storepass 【密鑰庫(kù)密碼】
  • -dname 【指定證書(shū)擁有者信息】

一般在公司會(huì)在項(xiàng)目中的 keystore 目錄下創(chuàng)建一個(gè) key.properties 文件,來(lái)記錄 keystore 關(guān)鍵信息,里面的內(nèi)容是:

key.store=keystore/test.keystore 
key.store.password=123456
key.alias=test
key.alias.password= testmima
key.sigalg=RSA

Android 怎么簽名

通過(guò)使用 Java 自帶的 keytool 和 jarsigner 工具或 apksigner 工具(android 11)進(jìn)行簽名。

使用 jarsigner 簽名

/Library/Java/JavaVirtualMachines/xxx.jdk/Contents/Home/bin

需要進(jìn)入到 jarsigner 所在的位置,通過(guò)以下命令可以對(duì)名為 test 的 apk 簽名:
jarsigner -verbose -keystore test.keystore【keystore路徑】 test.apk 【apk 名稱(chēng)】test【別名】

如何查找 jdk 位置

java -version 可以查看 java 版本
java -verbose 可以查看 jdk 路徑,和其他信息
java -verbose

java -verbose

簽名時(shí)遇到的問(wèn)題

在android 11的設(shè)備上安裝時(shí) 可能會(huì)出現(xiàn):
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary] 的問(wèn)題

以上問(wèn)題的原因:
是關(guān)于zip 4字節(jié)對(duì)齊,請(qǐng)參考zipalign

解決方法:
使用 apksigner 對(duì)其簽名

假設(shè)需要被簽名的文件為:source.apk

  • 先進(jìn)入 /Users/xxx/Library/Android/sdk/build-tools/30.0.3 路徑中
  • 先刪除了客戶(hù)的v1簽名,即刪除 META-INF目錄(META-INF目錄下存放的是簽名信息,可能報(bào)找不到META-INF/* ,不重要)
    zip -d source.apk META-INF/*
  • 獲取4KB對(duì)齊apk(source_4.apk 是對(duì)齊后的結(jié)果文件)
    zipalign -v 4 source.apk source_4.apk
  • 查看是否結(jié)果文件是否對(duì)齊 (成功后會(huì)報(bào):Verification succesful)
    zipalign -c -v 4 source_4.apk
  • 然后通過(guò) apksigner 簽名,不能在使用 jarsigner 簽名
    apksigner sign --ks (簽名地址) --ks-key-alias (別名) --out (簽名后的apk地址) (待簽名apk地址)
  • 密碼庫(kù)短語(yǔ)是:keystore 的 password (上文的 123456)

查看 apk 是否簽名

查看source_4.apk 是否簽名,是什么類(lèi)型的簽名
apksigner verify -v source_4.apk

查看 Apk 的MD5值或 SHA1 以及MD5不顯示時(shí)的解決辦法

  • 將以 .apk 結(jié)尾的 APK 文件更換為 .zip 文件
  • 解壓 zip 文件找到 META-INF/xx.RSA 文件
  • 命令查看 MD5 信息
    keytool -printcert -file 【xx.RSA文件所在路徑】

有的時(shí)候 看不到 MD5 值,可以使用命令行:
jadx-gui 目標(biāo)文件.apk
中的 APK signature 查看MD5 簽名、SHA-1 簽名、SHA-256 簽名信息

例如:


看不到 MD5 值
通過(guò) jadx-gui 查看 MD5

xx.RSA文件是簽名文件,它的命名如果不指定名稱(chēng)則自動(dòng)截取別名中前8個(gè)字符
一般上傳到市場(chǎng)平臺(tái)的時(shí)候,被提示解析失敗,沒(méi)有簽名文件,可能就是缺少了這個(gè)文件。

缺少 xx.RSA 文件的原因

缺少 xx.RSA 文件的原因,大概率是因?yàn)闆](méi)有選中 V1 這種簽名方式。

V1 vs V2

V2這種簽名方案是 Android 7.0引入的,它能提供更快的應(yīng)用安裝時(shí)間和更多針對(duì)未授權(quán) APK 文件更改的保護(hù)。具體請(qǐng)看 這里 。 而V1適用于所有android版本的機(jī)型,但在Android7.0及以上會(huì)缺少針對(duì)未授權(quán) APK 文件更改的保護(hù);所以只選V2,Android7.0以下的機(jī)型會(huì)報(bào)錯(cuò),同時(shí)選V1,V2,適用所有機(jī)型。

命令行打包默認(rèn) V1,V2 是都選中的,如果不放心可以在 build.gradle 里做設(shè)置

在 app 的 build.gradle 的 android 標(biāo)簽下加入如下:

 signingconfigs {
        debug {
            v1signingenabled true
            v2signingenabled true
        }

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

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

  • 一、概述 這個(gè)玩意簡(jiǎn)單說(shuō)起來(lái)很簡(jiǎn)單,詳細(xì)描述起來(lái)很復(fù)雜,復(fù)雜在什么地方呢,首先有一塊陌生的知識(shí)點(diǎn),包括但不限于證書(shū)...
    Time_x閱讀 2,618評(píng)論 1 1
  • 概述 這個(gè)玩意簡(jiǎn)單說(shuō)起來(lái)很簡(jiǎn)單,詳細(xì)描述起來(lái)很復(fù)雜,復(fù)雜在什么地方呢,首先有一塊陌生的知識(shí)點(diǎn),包括但不限于證書(shū),數(shù)...
    千山萬(wàn)水迷了鹿閱讀 7,767評(píng)論 3 18
  • 從開(kāi)始著手公司app安卓原生版本的開(kāi)發(fā),到如今2.3發(fā)布,已經(jīng)過(guò)了快半年的時(shí)間,在這半年的時(shí)間里,已經(jīng)逐漸掌握了A...
    呆萌狗和求疵喵閱讀 4,139評(píng)論 1 10
  • 基礎(chǔ)概念簽名:在 APK 中寫(xiě)入一個(gè)「指紋」。指紋寫(xiě)入以后,APK 中有任何修改,都會(huì)導(dǎo)致這個(gè)指紋無(wú)效,Andro...
    cname_1閱讀 2,527評(píng)論 1 0
  • 查看keystore文件的指紋證書(shū)MD5值: 打開(kāi)命令面板:win+R 進(jìn)入到你的.android目錄,一般在C盤(pán)...
    wilken閱讀 344評(píng)論 0 0

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