針對(duì) Android 中簽名的相關(guān)問題,做一些記錄整理糠惫。
以前硼讽,遇到許多關(guān)于簽名的問題
- APK 安裝時(shí)的校驗(yàn)
- 成為 Android 系統(tǒng)級(jí)應(yīng)用
- 查看應(yīng)用的MD5或者是SHA1信息
- v2簽名
- ….
這些問題都將在后面得到答案牲阁。
什么是簽名
首先城菊,什么是簽名?為什么需要簽名并齐?
在生活中客税,一般我們對(duì)某個(gè)文件進(jìn)行簽名霎挟,代表簽名者對(duì)此文件的認(rèn)可,防止簽名者抵賴赐纱,同時(shí)防止文件被他人篡改疙描。在計(jì)算機(jī)中也一樣,簽名就是對(duì)某個(gè)文件的一種認(rèn)證過程久又,而簽名校驗(yàn)就可以有效防止文件被惡意篡改地消,證明此文件是簽名者的原始文件畏妖。
簽名的流程如下:
利用一個(gè)單向哈希函數(shù)對(duì)原始文件進(jìn)行運(yùn)算戒劫,生成數(shù)字摘要迅细,然后用私鑰加密這個(gè)數(shù)字摘要,這個(gè)加密后的數(shù)字摘要就是數(shù)字簽名湘换,最后將數(shù)字簽名和原始文件一起打包成一個(gè)新的文件敬尺,如此砂吞,這個(gè)原始文件就被簽名了崎溃。
校驗(yàn)簽名的流程如下:
拿到被簽名后的文件之后袁串,首先提取出原始文件與簽名,然后使用相同的單向哈希函數(shù)對(duì)原始文件運(yùn)算赎瑰,生成數(shù)字摘要餐曼,然后用公鑰解密數(shù)字簽名,然后對(duì)比兩個(gè)數(shù)字摘要集惋,如果相同就表示校驗(yàn)成功刮刑。
數(shù)字簽名是非對(duì)稱加密與數(shù)字摘要的組合應(yīng)用,它有兩種功效:
- 確定文件(消息)確實(shí)是由簽名者簽名并發(fā)出來的养渴,因?yàn)閯e人假冒不了簽名者的簽名雷绢。
- 數(shù)字簽名能確定消息的完整性。
當(dāng)然理卑,數(shù)字簽名一般不單獨(dú)使用习寸,基本都是用在數(shù)字證書里面。
Android 簽名
Android 要求所有已安裝的應(yīng)用程序都使用數(shù)字證書做數(shù)字簽名傻工,數(shù)字證書的私鑰由開發(fā)者持有霞溪。
Android 使用數(shù)字證書作為標(biāo)識(shí)應(yīng)用程序開發(fā)者的一種方式,并在應(yīng)用程序之間建立信任的關(guān)系中捆,證書并不用來控制用戶能否安裝那個(gè)應(yīng)用程序。
Android 的數(shù)字證書與普通數(shù)字證書最大的區(qū)別是泄伪,Android 數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機(jī)構(gòu)(CA)認(rèn)證殴蓬,它只是用來讓應(yīng)用程序包自我認(rèn)證的,完全可以使用自簽名證書(seft-signed certificates)蟋滴。
沒有正確簽名的應(yīng)用染厅,Android系統(tǒng)不會(huì)安裝或運(yùn)行,此規(guī)則適用于任何地方運(yùn)行的Android系統(tǒng)津函,不管是在模擬器還是在真實(shí)設(shè)備上肖粮。即使是開發(fā)人員調(diào)試時(shí)的應(yīng)用程序,也是使用了默認(rèn)的簽名文件 (目錄:用戶名/.android/debug.keystore尔苦,密碼:android)進(jìn)行簽名的涩馆。
只有簽名文件相同且包名相同的 apk 才可以覆蓋安裝并保留用戶信息,這樣做是為了防止已安裝的應(yīng)用被惡意的第三方覆蓋或替換允坚。
此外魂那,數(shù)字證書都是有有效期的,Android 只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期稠项。如果程序已經(jīng)安裝在系統(tǒng)中涯雅,即使證書過期也不會(huì)影響程序的正常功能。
Android 簽名的作用
Android 簽名的主要作用是為了
- 應(yīng)用程序升級(jí):如果你希望用戶無縫升級(jí)到新的版本展运,那么你必須用同一個(gè)證書進(jìn)行簽名活逆。這是由于只有以同一個(gè)證書簽名精刷,系統(tǒng)才會(huì)允許安裝升級(jí)的應(yīng)用程序。如果你采用了不同的證書划乖,那么系統(tǒng)會(huì)要求你的應(yīng)用程序采用不同的包名稱贬养,在這種情況下相當(dāng)于安裝了一個(gè)全新的應(yīng)用程序。如果想升級(jí)應(yīng)用程序琴庵,簽名證書要相同误算,包名稱要相同!
- 應(yīng)用程序模塊化:Android系統(tǒng)可以允許同一個(gè)證書簽名的多個(gè)應(yīng)用程序在一個(gè)進(jìn)程里運(yùn)行迷殿,系統(tǒng)實(shí)際把他們作為一個(gè)單個(gè)的應(yīng)用程序儿礼,此時(shí)就可以把我們的應(yīng)用程序以模塊的方式進(jìn)行部署,而用戶可以獨(dú)立的升級(jí)其中的一個(gè)模塊
- 代碼或者數(shù)據(jù)共享:Android提供了基于簽名的權(quán)限機(jī)制庆寺,那么一個(gè)應(yīng)用程序就可以為另一個(gè)以相同證書簽名的應(yīng)用程序公開自己的功能蚊夫。以同一個(gè)證書對(duì)多個(gè)應(yīng)用程序進(jìn)行簽名,利用基于簽名的權(quán)限檢查懦尝,你就可以在應(yīng)用程序間以安全的方式共享代碼和數(shù)據(jù)了知纷。
所以一旦給Apk簽名并上線后,簽名文件和密碼別名等一定要記住不能丟失陵霉,否則會(huì)損失用戶且?guī)頌?zāi)難性的后果.
簽名文件格式
簽名文件格式有很多種琅轧,這里主要是介紹 Android 相關(guān)的,比如最早的 keystore踊挠、jks乍桂、pem/pk8等。
- KeyStore: KeyStore 是 Eclipse 開發(fā) Android 的時(shí)候最早的簽名文件了效床。
- JKS (Java key store): jks 是目前 Android Studio 中創(chuàng)建簽名文件的格式 (Build -> Generate Signed APK) 即可創(chuàng)建和使用簽名文件為對(duì)應(yīng)apk進(jìn)行簽名
- pem/pk8 :這個(gè)是系統(tǒng)的簽名文件睹酌,Android系統(tǒng)在編譯的時(shí)候也是需要簽名,所以這個(gè)是系統(tǒng)的簽名文件剩檀,如果想使自己的應(yīng)用變成系統(tǒng)應(yīng)用憋沿,則必須使用系統(tǒng)的簽名文件進(jìn)行簽名。
Signature Versions V1谨朝、V2
在新的 Android studio 版本中卤妒,出現(xiàn)了 v2 簽名,先看看官方解釋:
V1:通過ZIP條目進(jìn)行驗(yàn)證,這樣APK 簽署后可進(jìn)行許多修改共缕,可以移動(dòng)甚至重新壓縮文件洗出。
V2:驗(yàn)證壓縮文件的所有字節(jié),而不是單個(gè) ZIP 條目图谷,因此翩活,在簽名后無法再更改(包括 zipalign)阱洪。正因如此,現(xiàn)在在編譯過程中菠镇,我們將壓縮冗荸、調(diào)整和簽署合并成一步完成。好處顯而易見利耍,更安全而且新的簽名可縮短在設(shè)備上進(jìn)行驗(yàn)證的時(shí)間(不需要費(fèi)時(shí)地解壓縮然后驗(yàn)證)蚌本。
只勾選v1簽名并不會(huì)影響什么,但是在7.0上不會(huì)使用更安全的驗(yàn)證方式 隘梨。
只勾選V2簽名7.0以下會(huì)直接安裝完顯示未安裝程癌,7.0以上則使用了V2的方式驗(yàn)證
同時(shí)勾選V1和V2則所有機(jī)型都沒問題
或者在app的build.gradle的android標(biāo)簽下加入如下
signingConfigs {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
v1SigningEnabled true
v2SigningEnabled true
}
}
建議把V1和V2兩個(gè)選項(xiàng)全部勾選,如果全部勾選出現(xiàn)了問題轴猎,那么可以忽略這種新的簽名機(jī)制嵌莉,只勾選第一個(gè)選項(xiàng)(V1),依舊使用我們之前老的簽名機(jī)制捻脖。
生成數(shù)字證書
生成數(shù)字證書有兩種方式锐峭,包括帶圖形界面的 AS,以及命令行的keytool可婶。
Android Studio
在 Android studio 中生成簽名文件非常簡單沿癞,build -> Generate Signed APK -> Create new…
填寫完信息之后就生成了數(shù)字證書,之后下一步就給 apk 簽名上了扰肌。
AS 簽名帶界面的抛寝,自然方便,但有時(shí)候需要使用命令行工具曙旭。
簽名相關(guān)的兩個(gè)工具都在 JDK 中
- keytool 是個(gè)密鑰和證書管理工具盗舰,可以用來生成證書。
- jarsigner 工具利用密鑰倉庫中的信息來產(chǎn)生或校驗(yàn) Java 存檔 (JAR) 文件的數(shù)字簽名
Keytool 生成
使用keytool生成證書:
keytool -genkey -keystore test.keystore -alias test -keyalg RSA -validity 10000
參數(shù)解釋:
- -genkey 產(chǎn)生證書文件
- -keystore 指定密鑰庫的.keystore文件中
- -alias 指定別名
- -keyalg 指定密鑰的算法,這里指定為RSA(非對(duì)稱密鑰算法)
- -validity 為證書有效天數(shù)
jarsigner 簽名
數(shù)字證書生成后桂躏,需要使用 jarsigner 來簽名
jarsigner -verbose -keystore test.keystore -signedjar -signed.apk unsigned.apk 'test'
參數(shù)說明:
- -verbose:指定生成詳細(xì)輸出
- -keystore:指定數(shù)字證書存儲(chǔ)路徑
- -signedjar:該選項(xiàng)的三個(gè)參數(shù)為 -簽名后的apk包钻趋,-未簽名的apk包,-數(shù)字證書別名(注意順序)
查看簽名文件
在使用一些第三方庫時(shí)(如分享剂习、百度地圖)蛮位,有時(shí)會(huì)被要求提供 MD5 或者 SHA1值。
查看簽名文件信息需要用到 keytool 工具鳞绕,keytool 是 JDK 自帶的工具失仁,需要配置環(huán)境變量,輸入以下命令:
keytool -list -v -keystore <keystore文件名>
例如们何,查看位于 .android
目錄下默認(rèn)的簽名文件 debug.keystore
的信息:
此命令需要提供 簽名文件的密碼萄焦, debug.keystore
文件的別名是 androiddebugkey
,密碼是 android
,之后輸出了簽名文件的 MD5拂封、SHA1茬射、SHA256的值。
系統(tǒng)簽名
普通應(yīng)用程序的權(quán)限受限制冒签,需要系統(tǒng)應(yīng)用權(quán)限才行在抛,因此在定制化系統(tǒng)中,需要將應(yīng)用程序升級(jí)為系統(tǒng)應(yīng)用程序萧恕,這時(shí)候就需要系統(tǒng)簽名刚梭。
這里有兩種方案。
使用Android簽名工具重新簽名
提供對(duì)應(yīng)平臺(tái)簽名文件「platform.pk8」和「platform.x509.pem」廊鸥,如果是定制系統(tǒng)望浩,為了省事兒,直接找編譯系統(tǒng)的兄弟討要惰说,如果是google 原生系統(tǒng)磨德,則可以到源碼處下載,8.0.0_r4 的兩個(gè)文件地址在此 吆视,其他平臺(tái)版本的位置類似典挑。
提供簽名工具「signapk.jar」,8.0.0_r4的簽名工具地址在此啦吧,其他平臺(tái)版本的位置類似您觉。
將簽名證書「platform.pk8」、「platform.x509.pem 」授滓,簽名工具「signapk.jar 」放置在同一個(gè)文件夾琳水,執(zhí)行命令
java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk
生成系統(tǒng)debug.keystore文件
這種方式的好處就是不用每次都手動(dòng)打包,可以直接配置在 AS 中般堆,同樣需要前面的平臺(tái)簽名文件「platform.pk8」和「platform.x509.pem」在孝。
- 把pkcs8 格式的私鑰轉(zhuǎn)化成 pkcs12 格式:
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
- 把 x509.pem 公鑰轉(zhuǎn)換成 pkcs12 格式
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey
密碼都是:android
- 生成debug.keystore
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey
原文地址:https://www.deemons.cn/2018/05/10/Android-%E7%AD%BE%E5%90%8D%E9%82%A3%E7%82%B9%E4%BA%8B%E5%84%BF/