APK簽名機制原理詳解

轉(zhuǎn)載請注明出處:http://www.reibang.com/p/286d2b372334
github:https://github.com/rushgit/zhongwenjun.github.com
csdn:https://blog.csdn.net/zwjemperor

前言

眾所周知后添,Android系統(tǒng)在安裝Apk的過程中,會對Apk進行簽名校驗,校驗通過后才能安裝成功。那你知道簽名校驗的機制是什么?具體校驗的是什么內(nèi)容嗎窘奏?申請第三方SDK(如微信支付)時填入的SAH1值是什么?目前眾多的快速批量打包方案又是如何繞過簽名檢驗的?

我將通過一系列的文章來解開這些疑惑:

  1. Apk簽名的基本概念和用法(本篇)
  2. Apk簽名機制之——JAR簽名機制詳解
  3. Apk簽名機制之——V2簽名機制詳解

這篇文章先來介紹Apk簽名相關(guān)的基本知識壮不。

  1. 簽名是什么?如何進行簽名皱碘?
  2. keystore和證書格式
  3. jarsigner和apksigner的區(qū)別

1. 簽名是什么询一?

要知道簽名是什么,先來看為什么需要簽名 癌椿。大家都知道健蕊,在消息通信時,必須至少解決兩個問題:一是確保消息來源的真實性踢俄,二是確保消息不會被第三方篡改缩功。在安裝Apk時,同樣需要確保Apk來源的真實性都办,以及Apk沒有被第三方篡改嫡锌。如何解決這兩個問題呢?方法就是開發(fā)者對Apk進行簽名:在Apk中寫入一個“指紋”琳钉。指紋寫入以后势木,Apk中有任何修改,都會導(dǎo)致這個指紋無效歌懒,Android系統(tǒng)在安裝Apk進行簽名校驗時就會不通過啦桌,從而保證了安全性。

要了解如何實現(xiàn)簽名及皂,需要了解兩個基本概念:數(shù)字摘要和數(shù)字證書甫男。

1.1 數(shù)字摘要

數(shù)字摘要是將任意長度的消息變成固定長度的短消息,它類似于一個自變量是消息的函數(shù)验烧,也就是Hash函數(shù)板驳。數(shù)字摘要就是采用單向Hash函數(shù)將需要加密的明文“摘要”成一串固定長度的密文,這一串密文又稱為數(shù)字指紋碍拆,它有固定的長度若治,而且不同的明文摘要成密文效扫,其結(jié)果總是不同的,而同樣的明文其摘要必定一致直砂。

簡單來說菌仁,就是對一個任意長度的數(shù)據(jù),通過一個Hash算法計算后静暂,都可以得到一個固定長度的二進制數(shù)據(jù)济丘,這個數(shù)據(jù)就稱為“摘要”。摘要具有下面的幾個特征:

  1. 唯一性

    在不考慮碰撞的情況下洽蛀,不同的數(shù)據(jù)的計算出的摘要是不同的摹迷。

  2. 固定長度

    不同的Hash算法計算的長度是不一樣的,但對同一個算法來說是一樣的郊供。比較常用的Hash算法有MD5和SHA1峡碉,MD5的長度是128拉,SHA1的長度是160位驮审。

  3. 不可逆性

    即從正向計算的摘要不可能逆向推導(dǎo)出原始數(shù)據(jù)鲫寄。

1.2 簽名和校驗的大體過程

前面已經(jīng)說到,可以通過簽名來確保數(shù)據(jù)來源的可靠性和數(shù)據(jù)的不可篡改性疯淫。簽名就是在摘要的基礎(chǔ)上再進行一次加密地来,對摘要加密后的數(shù)據(jù)就可以當(dāng)作數(shù)字簽名,在安裝Apk需要對簽名進行驗證熙掺,驗證通過才能繼續(xù)安裝未斑。

這里有兩個過程:簽名過程 和 校驗過程。

簽名校驗

先來說簽名過程:

  1. 計算摘要

    通過Hash算法提取出原始數(shù)據(jù)的摘要币绩;

  2. 計算簽名

    再通過基于密鑰(私鑰)的非對稱加密算法對提取出的摘要進行加密蜡秽,加密后的數(shù)據(jù)就是簽名信息;

  3. 寫入簽名

    將簽名信息寫入原始數(shù)據(jù)的簽名區(qū)塊內(nèi)缆镣。

再來看校驗過程:

  1. 計算摘要

    接收方接收到數(shù)據(jù)后芽突,首先用同樣的Hash算法從接收到的數(shù)據(jù)中提取出摘要;

  2. 解密簽名

    使用發(fā)送方的公鑰對數(shù)字簽名進行解密费就,解密出原始摘要诉瓦;

  3. 比較摘要

    如果解密后的數(shù)據(jù)和提取的摘要一致,則校驗通過力细;如果數(shù)據(jù)被第三方篡改過,解密后的數(shù)據(jù)和摘要不一致固额,校驗不通過眠蚂。

1.3 數(shù)字證書

這里有一個前提:接收方必須要知道發(fā)送方的公鑰和所使用的算法。如果數(shù)字簽名和公鑰一起被篡改斗躏,接收方無法得知逝慧,還是會校驗通過。如何保證公鑰的可靠性呢?答案是數(shù)字證書笛臣,數(shù)字證書是身份認(rèn)證機構(gòu)(Certificate Authority)頒發(fā)的云稚,包含了以下信息:

  • 證書頒發(fā)機構(gòu)
  • 證書頒發(fā)機構(gòu)簽名
  • 證書綁定的服務(wù)器域名
  • 證書版本、有效期
  • 簽名使用的加密算法(非對稱算法沈堡,如RSA)
  • 公鑰 等

接收方收到消息后静陈,先向CA驗證證書的合法性(根據(jù)證書的簽名、綁定的域名等信息诞丽。CA機構(gòu)是權(quán)威的鲸拥,可以保證這個過程的可靠性。)再進行簽名校驗僧免。

關(guān)于通過數(shù)字證書進行簽名校驗的詳細(xì)過程刑赶,可以參考我之前寫的一篇關(guān)于HTTPS通信機制的介紹:詳談HTTPS通信機制,HTTPS是如何進行安全通信的?

需要注意的是懂衩,Apk的證書通常的自簽名的撞叨,也就是由開發(fā)者自己制作,沒有向CA機構(gòu)申請浊洞。Android在安裝Apk時并沒有校驗證書本身的合法性谒所,只是從證書中提取公鑰和加密算法,這也正是對第三方Apk重新簽名后沛申,還能夠繼續(xù)在沒有安裝這個Apk的系統(tǒng)中繼續(xù)安裝的原因劣领。

1.4 簽名和校驗過程

完整的簽名和校驗過程如下:(圖片來源:維基百科

簽名校驗

2. keystore和證書格式

我們在對Apk簽名時并沒有直接指定私鑰、公鑰和數(shù)字證書铁材,而是使用keystore文件,這些信息都包含在了keystore文件中著觉。根據(jù)編碼不同村生,keystore文件分為很多種,Android使用的是Java標(biāo)準(zhǔn)keystore格式JKS(Java Key Storage)饼丘,所以通過Android Studio導(dǎo)出的keystore文件是以.jks結(jié)尾的趁桃。

keystore使用的證書標(biāo)準(zhǔn)是X.509,X.509標(biāo)準(zhǔn)也有多種編碼格式肄鸽,常用的有兩種:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)卫病。jks使用的是der格式,Android也支持直接使用pem格式的證書進行簽名典徘,我們下面會介紹蟀苛。

兩種證書編碼格式的區(qū)別:

  • DER(Distinguished Encoding Rules)

    二進制格式,所有類型的證書和私鑰都可以存儲為der格式逮诲。

  • PEM(Privacy Enhanced Mail)

    base64編碼帜平,內(nèi)容以-----BEGIN xxx----- 開頭幽告,以-----END xxx----- 結(jié)尾,比如:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAlmXFRXEZomRKhNRp2XRoXH+2hm17RfrfecQlT49fktoDLkF6r99uiNnuUdPi6UQuXOnzEbe1nZkfuqfB10aBLrDqBUSZ+3
-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
MIICvTCCAaWgAwIBAgIEcWTElDANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRyPQDLnVKeEIh81OwD3KIrQOUwsxyptOVVea1D8CzIAnGs
-----END CERTIFICATE-----


X.509證書格式:

X.509證書格式

3. jarsigner和apksigner的區(qū)別

Android提供了兩種對Apk的簽名方式裆甩,一種是基于JAR的簽名方式冗锁,另一種是基于Apk的簽名方式,它們的主要區(qū)別在于使用的簽名文件不一樣:jarsigner使用keystore文件進行簽名嗤栓;apksigner除了支持使用keystore文件進行簽名外冻河,還支持直接指定pem證書文件和私鑰進行簽名。

android {
    signingConfigs {
        config {
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword'] 
        }
    }
    ...
  }

不知道大家有沒有注意一個問題抛腕,我們通過keytool或者AS生成一個keystore的時候(簽署您的應(yīng)用)芋绸,除了要輸入keystore的密碼外,還要輸入一個alias和key的密碼担敌。在簽名時摔敛,除了要指定keystore文件和密碼外,也要指定alias和key的密碼全封,這是為什么呢马昙?

原因是keystore是一個密鑰庫,也就是說它可以存儲多對密鑰和證書刹悴,keystore的密碼是用于保護keystore本身的行楞,一對密鑰和證書是通過alias來區(qū)分的。從這里可以看出jarsigner是支持使用多個證書對Apk進行簽名的土匀。apksigner也同樣支持子房,關(guān)于apksigner的使用介紹可以參考官方文檔apksigner

3.1 簽名相關(guān)命令

● jarsigner簽名
jarsigner -keystore keystore_file -signedjar signed.apk unsigned.apk alias_name -storepass pwd

● apksigner簽名
java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

● 查看keystore文件
keytool -list  -v -keystore keystore_file -storepass pwd

● 查看apk證書
keytool -printcert -jarfile apk

● 查看DER格式證書(META-INFO/CERT.RSA)
openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

● 查看PEM格式證書
openssl x509 -in cert.x509.pem -text -noout

● apksigner檢查apk是否簽名就轧,以及查看證書SHA1值
apksigner verify -v --print-certs

ok证杭,簽名的基本概念和校驗過程就介紹到這里,關(guān)于JAR簽名和V2簽名機制的詳細(xì)介紹妒御,參考下面兩篇文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末解愤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乎莉,更是在濱河造成了極大的恐慌送讲,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惋啃,死亡現(xiàn)場離奇詭異哼鬓,居然都是意外死亡,警方通過查閱死者的電腦和手機肥橙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門魄宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人存筏,你說我怎么就攤上這事宠互。” “怎么了椭坚?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵予跌,是天一觀的道長。 經(jīng)常有香客問我善茎,道長券册,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任垂涯,我火速辦了婚禮烁焙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耕赘。我一直安慰自己骄蝇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布操骡。 她就那樣靜靜地躺著九火,像睡著了一般。 火紅的嫁衣襯著肌膚如雪册招。 梳的紋絲不亂的頭發(fā)上岔激,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音是掰,去河邊找鬼虑鼎。 笑死,一個胖子當(dāng)著我的面吹牛键痛,可吹牛的內(nèi)容都是我干的炫彩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼散休,長吁一口氣:“原來是場噩夢啊……” “哼媒楼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戚丸,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤划址,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后限府,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夺颤,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年胁勺,在試婚紗的時候發(fā)現(xiàn)自己被綠了世澜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡署穗,死狀恐怖寥裂,靈堂內(nèi)的尸體忽然破棺而出嵌洼,到底是詐尸還是另有隱情,我是刑警寧澤封恰,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布麻养,位于F島的核電站,受9級特大地震影響诺舔,放射性物質(zhì)發(fā)生泄漏鳖昌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一低飒、第九天 我趴在偏房一處隱蔽的房頂上張望许昨。 院中可真熱鬧,春花似錦褥赊、人聲如沸糕档。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翼岁。三九已至,卻和暖如春司光,著一層夾襖步出監(jiān)牢的瞬間琅坡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工残家, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榆俺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓坞淮,卻偏偏與公主長得像茴晋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子回窘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于作者: 李濤诺擅,騰訊Android工程師,14年加入騰訊SNG增值產(chǎn)品部啡直,期間主要負(fù)責(zé)手Q動漫烁涌、企鵝電競等項目的...
    稻草人_3e17閱讀 3,595評論 0 10
  • 轉(zhuǎn)載: http://blog.csdn.net/kickxxx/article/details/18252881...
    笑羋閱讀 1,417評論 0 1
  • “隨著路越走越遠(yuǎn)舷丹,有一把無形的尺子抒钱,為我們架設(shè)了一個坐標(biāo),開叉一個角度,順著看過去谋币,它展現(xiàn)給我一個全新的三觀體系:...
    郎中柯拉閱讀 717評論 0 1
  • 1.map task 執(zhí)行完畢后會將計算狀態(tài)以及磁盤小文件位置等信息分裝到mapStatue對象中瑞信,然后由本進程中...
    0_9f3a閱讀 2,774評論 1 3
  • 在很小很小的時候 我就渴望去看海 我想去到海邊 漫步 吹風(fēng) 乘著夕陽 但 我需要長大獨立才能夠自己去旅行 盼著...
    dikwnbdhiskw閱讀 212評論 0 0