Android 簽名之Signature Version V1 和 V2 探索

記錄之前寫的一篇總結(jié)拗馒。

V1:V1是Android7.0之前的簽名方式,使用jar Signature方式對(duì)APK進(jìn)行簽名打包,jar Signature來(lái)自JDK茎毁。APK進(jìn)行簽名時(shí)會(huì)生成一個(gè)META-INF文件夾,里面有三個(gè)文件:MANIFEST.MF忱辅,CERT.RSA七蜘,CERT.SF,是用來(lái)記錄簽名信息的墙懂。

除了上述三個(gè)文件橡卤,其他的文件都會(huì)對(duì)文件內(nèi)容做一次SHA1算法,就是計(jì)算出文件的摘要信息,然后用Base64進(jìn)行編碼损搬。比如AndroidManifest.xml文件碧库,就會(huì)對(duì)它進(jìn)行編碼生成SHA-1值,把這個(gè)SHA-1值用Base64轉(zhuǎn)化網(wǎng)站轉(zhuǎn)化回去巧勤,就是MANIFEST.MF文件中記錄的條目值嵌灰。

因此,MANIFEST.MF中存儲(chǔ)的是:逐一遍歷里面的所有條目颅悉,如果是目錄就跳過(guò)沽瞭,如果是一個(gè)文件,就用SHA1(或者SHA256)消息摘要算法提取出該文件的摘要然后進(jìn)行BASE64編碼后剩瓶,作為“SHA1-Digest”屬性的值寫入到MANIFEST.MF文件中的一個(gè)塊中驹溃。該塊有一個(gè)“Name”屬性柒瓣,其值就是該文件在apk包中的路徑。

不再詳細(xì)累述吠架,CERT.SF文件做了什么工作:

1.計(jì)算這個(gè)MANIFEST.MF文件的整體SHA1值芙贫,再經(jīng)過(guò)BASE64編碼后,記錄在CERT.SF主屬性塊(在文件頭上)的“SHA1-Digest-Manifest”屬性值值下傍药。

2.逐條計(jì)算MANIFEST.MF文件中每一個(gè)塊的SHA1磺平,并經(jīng)過(guò)BASE64編碼后,記錄在CERT.SF中的同名塊中拐辽,屬性的名字是“SHA1-Digest”拣挪。

CERT.RSA是一個(gè)滿足PKCS7格式的文件:它會(huì)把之前生成的 CERT.SF文件,用私鑰計(jì)算出簽名, 然后將簽名以及包含公鑰信息的數(shù)字證書一同寫入CERT.RSA中保存俱诸。

總結(jié):V1加密簽名后菠劝,如果APK文件被篡改后,在APK安裝校驗(yàn)時(shí)睁搭,改變后的文件摘要信息與MANIFEST.MF的檢驗(yàn)信息不同赶诊,于是驗(yàn)證失敗,程序就不能成功安裝园骆。

如果你對(duì)更改的過(guò)的文件相應(yīng)的算出新的摘要值舔痪,然后更改MANIFEST.MF文件里面對(duì)應(yīng)的屬性值,那么必定與CERT.SF文件中算出的摘要值不一樣锌唾,照樣驗(yàn)證失敗锄码。

如果不死心繼續(xù)計(jì)算MANIFEST.MF的摘要值,相應(yīng)的更改CERT.SF里面的值晌涕,那么數(shù)字簽名值必定與CERT.RSA文件中記錄的不一樣滋捶,還是失敗。

所以余黎,重新打包后的應(yīng)用程序能再Android設(shè)備上安裝重窟,必須對(duì)其進(jìn)行重簽名。

V2:Android7.0推出了V2簽名方式驯耻,使用Full Apk Signature方式對(duì)APK進(jìn)行簽名打包亲族。

經(jīng)過(guò)對(duì)V1的詳細(xì)介紹,V2就簡(jiǎn)單明了了可缚。V1是驗(yàn)證單個(gè)的ZIP條目,而V2則是驗(yàn)證壓縮文件的所有字節(jié)碼斋枢。因此帘靡,在簽名完成后無(wú)法再更改(包括zipalign)。因此瓤帚,現(xiàn)在在編譯過(guò)程中描姚,壓縮涩赢、調(diào)整和簽署合并成一步完成。好處是轩勘,更安全而且新的簽名可縮短在設(shè)備上進(jìn)行驗(yàn)證的時(shí)間(不需要費(fèi)時(shí)地解壓縮然后驗(yàn)證)筒扒,從而加快應(yīng)用安裝速度。當(dāng)然只在Android7.0以上的手機(jī)才會(huì)使用這種驗(yàn)證方式绊寻。

總結(jié):


選擇V1還是V2花墩?

只選擇V1,還是依照舊的簽名方式澄步,不會(huì)有任何影響冰蘑,只是在Android7.0以上的手機(jī)上不會(huì)使用更安全的驗(yàn)證方式。

只選擇V2村缸,在Android7.0以上的手機(jī)沒問題祠肥,但是由于7.0以下的系統(tǒng)沒有這種新的驗(yàn)證方式,因此會(huì)提示未安裝梯皿。

同時(shí)選擇V1和V2仇箱,在Android7.0以下的手機(jī)會(huì)使用V1驗(yàn)證,7.0以上的會(huì)使用V2方式驗(yàn)證东羹,因此都沒問題工碾。

新的問題(多渠道打包)

由于Android市場(chǎng)眾多,因此需要標(biāo)記不同的渠道包百姓。

目前使用的方案是:使用V1簽名方式渊额,美團(tuán)Python腳本批量打包,它的原理就是生成一個(gè)全新的文件垒拢,把APK進(jìn)行解壓遍歷復(fù)制進(jìn)去旬迹,復(fù)制中通過(guò)在META-INF目錄下添加空文件,用空文件的名稱來(lái)作為渠道的唯一標(biāo)識(shí)求类,之前在META-INF下添加文件是不需要重新簽名應(yīng)用的奔垦,因此批量打出的包在Android上是可以校驗(yàn)通過(guò)的。

但是如果使用的V2方式尸疆,在新的應(yīng)用簽名方案下META-INF已經(jīng)被列入了保護(hù)區(qū)了椿猎,那么Python腳本批量打出的包就會(huì)造成Android7.0上校驗(yàn)不通過(guò),這便是之前我們遇到的問題寿弱。

雖然只使用V1簽名驗(yàn)證不會(huì)影響什么犯眠,但V2是谷歌爸爸推薦的簽名方式,肯定是要慢慢用起來(lái)的症革,一路高歌走向安全規(guī)范化的道路筐咧。

美團(tuán)推出了針對(duì)V2的新一套批量打包方式,并生成了插件,可以使用Gradle快速集成量蕊。

Walle(瓦力)https://github.com/Meituan-Dianping/walle

walle.png

可擴(kuò)展的APK Signature Scheme v2 Block

V2的簽名信息是以ID(0x7109871a)的ID-value來(lái)保存在這個(gè)區(qū)塊中铺罢,通過(guò)Android源代碼可以看出Android是通過(guò)查找ID為 APK_SIGNATURE_SCHEME_V2_BLOCK_ID = 0x7109871a 的ID-value,來(lái)獲取APK Signature Scheme v2 Block残炮,對(duì)這個(gè)區(qū)塊中其他的ID-value選擇了忽略韭赘。

因此美團(tuán)是通過(guò)提供一個(gè)自定義的ID-value并寫入該區(qū)域,從而為快速生成渠道包服務(wù)势就,每打一個(gè)渠道包只需復(fù)制一個(gè)APK泉瞻,然后在APK中添加一個(gè)ID-value即可。

所以蛋勺,我們可以考慮采用這用新的方式來(lái)打渠道包了瓦灶。

參考鏈接:

https://tech.meituan.com/android-apk-v2-signature-scheme.html

http://blog.csdn.net/u011904605/article/details/52058971

http://www.reibang.com/p/a27783a713f2

http://www.reibang.com/p/e1e2fd05bb62

關(guān)于上次分享的APK加殼概念:

一、什么是加殼抱完?

加殼是在二進(jìn)制的程序中植入一段代碼贼陶,在運(yùn)行的時(shí)候優(yōu)先取得程序的控制權(quán),做一些額外的工作巧娱。大多數(shù)病毒就是基于此原理碉怔。是應(yīng)用加固的一種手法對(duì)原始二進(jìn)制原文進(jìn)行加密/隱藏/混淆。

示例.png

1禁添、需要加密的Apk(源Apk)

2撮胧、殼程序Apk(負(fù)責(zé)解密Apk工作)

3、加密工具(將源Apk進(jìn)行加密和殼Dex合并成新的Dex)

加殼程序就是把要加殼的apk放入解殼程序的dex文件中老翘。

解殼程序是最后替代我們apk安裝到手機(jī)中運(yùn)行的程序芹啥。它在執(zhí)行中從自己的dex中釋放出我們apk程序。

二铺峭、加殼作用

加殼的程序可以有效阻止對(duì)程序的反匯編分析墓怀,其實(shí)就是魚目混珠。

參考鏈接:

http://www.cnblogs.com/cute/p/4809386.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卫键,一起剝皮案震驚了整個(gè)濱河市傀履,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莉炉,老刑警劉巖钓账,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異絮宁,居然都是意外死亡梆暮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門羞福,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惕蹄,“玉大人,你說(shuō)我怎么就攤上這事治专÷袅辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵张峰,是天一觀的道長(zhǎng)泪蔫。 經(jīng)常有香客問我,道長(zhǎng)喘批,這世上最難降的妖魔是什么撩荣? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮饶深,結(jié)果婚禮上餐曹,老公的妹妹穿的比我還像新娘。我一直安慰自己敌厘,他們只是感情好台猴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俱两,像睡著了一般饱狂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪彩,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天休讳,我揣著相機(jī)與錄音,去河邊找鬼尿孔。 笑死俊柔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的活合。 我是一名探鬼主播雏婶,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芜辕!你這毒婦竟也來(lái)了尚骄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侵续,失蹤者是張志新(化名)和其女友劉穎倔丈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體状蜗,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡需五,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧坎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏邮。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜜氨,到底是詐尸還是另有隱情械筛,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布飒炎,位于F島的核電站埋哟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏郎汪。R本人自食惡果不足惜赤赊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煞赢。 院中可真熱鬧抛计,春花似錦、人聲如沸照筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朦肘。三九已至饭弓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媒抠,已是汗流浹背弟断。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趴生,地道東北人阀趴。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苍匆,于是被迫代替她去往敵國(guó)和親刘急。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 關(guān)于作者: 李濤浸踩,騰訊Android工程師叔汁,14年加入騰訊SNG增值產(chǎn)品部,期間主要負(fù)責(zé)手Q動(dòng)漫检碗、企鵝電競(jìng)等項(xiàng)目的...
    稻草人_3e17閱讀 3,595評(píng)論 0 10
  • 對(duì)于 Android 開發(fā)者而言据块, APK 簽名的重要性不言而喻。Android 7.0 后 APK 簽名已經(jīng)從基...
    Cavabiao閱讀 9,801評(píng)論 7 30
  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/682bb351099fgithub:http...
    rushjs閱讀 8,836評(píng)論 4 21
  • 對(duì)于 Android 開發(fā)者而言折剃, APK 簽名的重要性不言而喻另假。Android 7.0 后 APK 簽名已經(jīng)從基...
    稻草人_3e17閱讀 605評(píng)論 0 4
  • 你把憂傷畫在眼角/我將流浪抹在額頭/你用思念添幾縷白發(fā)/我讓歲月雕刻我憔悴的手……年少時(shí)讀席慕蓉的《邂逅》,為...
    淡若有痕閱讀 251評(píng)論 0 1