Android 簽名初認(rèn)識(shí)

針對(duì) Android 中簽名的相關(guān)問題,做一些記錄整理糠惫。

以前硼讽,遇到許多關(guān)于簽名的問題

  1. APK 安裝時(shí)的校驗(yàn)
  2. 成為 Android 系統(tǒng)級(jí)應(yīng)用
  3. 查看應(yīng)用的MD5或者是SHA1信息
  4. v2簽名
  5. ….

這些問題都將在后面得到答案牲阁。

什么是簽名

首先城菊,什么是簽名?為什么需要簽名并齐?

在生活中客税,一般我們對(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)用,它有兩種功效:

  1. 確定文件(消息)確實(shí)是由簽名者簽名并發(fā)出來的养渴,因?yàn)閯e人假冒不了簽名者的簽名雷绢。
  2. 數(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 簽名,先看看官方解釋:

Signature Versions V1字币、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…

生成 keystore

填寫完信息之后就生成了數(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ù)解釋:

  1. -genkey 產(chǎn)生證書文件
  2. -keystore 指定密鑰庫的.keystore文件中
  3. -alias 指定別名
  4. -keyalg 指定密鑰的算法,這里指定為RSA(非對(duì)稱密鑰算法)
  5. -validity 為證書有效天數(shù)

jarsigner 簽名

數(shù)字證書生成后桂躏,需要使用 jarsigner 來簽名
jarsigner -verbose -keystore test.keystore -signedjar -signed.apk unsigned.apk 'test'

參數(shù)說明:

  1. -verbose:指定生成詳細(xì)輸出
  2. -keystore:指定數(shù)字證書存儲(chǔ)路徑
  3. -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簽名工具重新簽名

  1. 提供對(duì)應(yīng)平臺(tái)簽名文件「platform.pk8」和「platform.x509.pem」廊鸥,如果是定制系統(tǒng)望浩,為了省事兒,直接找編譯系統(tǒng)的兄弟討要惰说,如果是google 原生系統(tǒng)磨德,則可以到源碼處下載,8.0.0_r4 的兩個(gè)文件地址在此 吆视,其他平臺(tái)版本的位置類似典挑。

  2. 提供簽名工具「signapk.jar」,8.0.0_r4的簽名工具地址在此啦吧,其他平臺(tái)版本的位置類似您觉。

  3. 將簽名證書「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」在孝。

  1. 把pkcs8 格式的私鑰轉(zhuǎn)化成 pkcs12 格式:

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

  1. 把 x509.pem 公鑰轉(zhuǎn)換成 pkcs12 格式

openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey

密碼都是:android
  1. 生成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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淮摔,隨后出現(xiàn)的幾起案子私沮,更是在濱河造成了極大的恐慌,老刑警劉巖和橙,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔燕,死亡現(xiàn)場離奇詭異,居然都是意外死亡魔招,警方通過查閱死者的電腦和手機(jī)晰搀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來办斑,“玉大人厕隧,你說我怎么就攤上這事《碇埽” “怎么了吁讨?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長峦朗。 經(jīng)常有香客問我建丧,道長,這世上最難降的妖魔是什么波势? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任翎朱,我火速辦了婚禮,結(jié)果婚禮上尺铣,老公的妹妹穿的比我還像新娘拴曲。我一直安慰自己,他們只是感情好凛忿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布澈灼。 她就那樣靜靜地躺著,像睡著了一般店溢。 火紅的嫁衣襯著肌膚如雪叁熔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天床牧,我揣著相機(jī)與錄音荣回,去河邊找鬼。 笑死戈咳,一個(gè)胖子當(dāng)著我的面吹牛心软,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播著蛙,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼删铃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了册踩?” 一聲冷哼從身側(cè)響起泳姐,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暂吉,沒想到半個(gè)月后胖秒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慕的,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年阎肝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肮街。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡风题,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沛硅,我是刑警寧澤眼刃,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站摇肌,受9級(jí)特大地震影響擂红,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜围小,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一昵骤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肯适,春花似錦变秦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雨饺,卻和暖如春钳垮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背额港。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工饺窿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人移斩。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓肚医,卻偏偏與公主長得像,于是被迫代替她去往敵國和親向瓷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肠套,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353