iOS逆向 09:應(yīng)用簽名

iOS 底層原理 + 逆向 文章匯總

本文主要講解什么是代碼簽名,以及iOS中的應(yīng)用簽名

代碼簽名

代碼簽名是對(duì)可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名.用來(lái)確認(rèn)軟件在簽名后未被修改或損壞的措施。和數(shù)字簽名原理一樣,只不過(guò)簽名的數(shù)據(jù)是代碼而已.

目的:防止可執(zhí)行文件或腳本被篡改

簡(jiǎn)單的代碼簽名

  • 在iOS出來(lái)之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運(yùn)行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那么蘋果希望解決這樣的問(wèn)題,要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過(guò)蘋果官方允許的,怎樣保證呢?就是通過(guò)代碼簽名。

  • 如果要實(shí)現(xiàn)驗(yàn)證.其實(shí)最簡(jiǎn)單的方式就是通過(guò)蘋果官方生成非對(duì)稱加密的一對(duì)公私鑰.在iOS的系統(tǒng)中內(nèi)置一個(gè)公鑰,私鑰由蘋果后臺(tái)保存,我們傳APP到AppStore時(shí),蘋果后臺(tái)用私鑰對(duì)APP數(shù)據(jù)進(jìn)行簽名,iOS系統(tǒng)下載這個(gè)APP后,用公鑰驗(yàn)證這個(gè)簽名,若簽名正確,這個(gè)APP肯定是由蘋果后臺(tái)認(rèn)證的,并且沒(méi)有被修改過(guò),也就達(dá)到了蘋果的需求:保證安裝的每一個(gè)APP都是經(jīng)過(guò)蘋果官方允許的.

  • 如果我們iOS設(shè)備安裝APP只從App Store這一個(gè)入口這件事就簡(jiǎn)單解決了,沒(méi)有任何復(fù)雜的東西,一個(gè)數(shù)字簽名搞定.

  • 但是實(shí)際上iOS安裝APP還有其他渠道.比如對(duì)于我們開發(fā)者iOSer而言,我們是需要在開發(fā)APP時(shí)直接真機(jī)調(diào)試的.而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道,企業(yè)證書簽名的APP也是需要順利安裝的.

  • 蘋果需要開放這些方式安裝APP,這些需求就無(wú)法通過(guò)簡(jiǎn)單的代碼簽名來(lái)辦到了。

蘋果的需求

  • 安裝包不需要上傳AppStore,可以直接安裝到手機(jī)

  • 蘋果為了保證系統(tǒng)的安全性,又必須對(duì)安裝的App有絕對(duì)的控制權(quán)

    • 經(jīng)過(guò)蘋果允許才可以安裝
    • 不能被濫用導(dǎo)致非開發(fā)App也能被安裝

為了實(shí)現(xiàn)這些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果這里給出的方案是 雙層簽名

雙層代碼簽名

為了實(shí)現(xiàn)蘋果驗(yàn)證應(yīng)用的一些需求,iOS簽名的復(fù)雜度也就開始增加了,蘋果給出的方案是雙層簽名.

  • iOS的雙層代碼簽名流程這里簡(jiǎn)單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個(gè)基礎(chǔ)上還要稍微加點(diǎn)東西.

  • 首先這里有兩個(gè)角色.一個(gè)是iOS系統(tǒng) 還有一個(gè)就是我們的Mac系統(tǒng).因?yàn)閕OS的APP開發(fā)環(huán)境在Mac系統(tǒng)下.所以這個(gè)依賴關(guān)系成為了蘋果雙層簽名的基礎(chǔ).

  • 1、在Mac系統(tǒng)中生成非對(duì)稱加密算法的一對(duì)公鑰\私鑰(你的Xcode幫你代辦了).這里稱為公鑰M 私鑰M (注:M = Mac)

  • 2、蘋果自己有固定的一對(duì)公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺(tái),公鑰在每個(gè)iOS系統(tǒng)中.這里稱為公鑰A , 私鑰A. A=Apple

  • 3、把公鑰M 以及一些你開發(fā)者的信息,傳到蘋果后臺(tái)(這個(gè)就是CSR文件),用蘋果后臺(tái)里的私鑰 A 去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M 以及其簽名,把這份數(shù)據(jù)稱為證書。

    雙重簽名圖示

蘋果雙向簽名驗(yàn)證步驟

下面簡(jiǎn)述蘋果雙向簽名的步驟

  • 1、前提:


    蘋果雙向簽名驗(yàn)證流程-01
    • xcode會(huì)在keychain生成一對(duì)公鑰M、私鑰M,保存在mac電腦中
    • 還有一對(duì)公鑰A(iPhone)、私鑰A(蘋果服務(wù)端)
  • 2、通過(guò)mac中的公鑰M(核心)+證書頒發(fā)機(jī)構(gòu)信息,生成一個(gè)CSR文件,傳遞給蘋果服務(wù)器

    蘋果雙向簽名驗(yàn)證流程-02

  • 3、蘋果服務(wù)器通過(guò)私鑰A加密公鑰M,生成一個(gè)證書,其中包含公鑰M+Hash值,并對(duì)公鑰M的Hash值作數(shù)字簽名

    蘋果雙向簽名驗(yàn)證流程-03

    • 私鑰A 加密 公鑰M

    • 蘋果服務(wù)器就相當(dāng)于CA機(jī)構(gòu)

    • 證書就是 CRT文件

問(wèn)題:編譯App需要安裝到手機(jī),iPhone如何驗(yàn)證呢?

  • 4、通過(guò)mac中的私鑰M,對(duì)App中的Mach-O進(jìn)行簽名,生成一個(gè)App的簽名,同時(shí)將證書打包進(jìn)去,形成一個(gè)ipa包
    • 1)通過(guò)mac中的私鑰M,對(duì)App中的Mach-O進(jìn)行簽名
      蘋果雙向簽名驗(yàn)證流程-04
    • 2)生成一個(gè)App的簽名


      蘋果雙向簽名驗(yàn)證流程-05
    • 3)將Mach-O文件、App簽名、證書等信息一起打包,形成一個(gè)ipa包


      蘋果雙向簽名驗(yàn)證流程-06
    • 證書 可以由 iPhone中的公鑰A解密
    • 私鑰M 就是 p12證書,證書回來(lái)后,就會(huì)與私鑰M進(jìn)行綁定

雙重驗(yàn)證

  • 5、通過(guò)iPhone的公鑰A 解密 證書,證書解密后得到公鑰M,公鑰M 可以驗(yàn)證 App的簽名,驗(yàn)證通過(guò),說(shuō)明安裝行為是被允許的,合法的
    蘋果雙向簽名驗(yàn)證流程-07

    以下是Mach-O的簽名信息
    蘋果雙向簽名驗(yàn)證流程-08

注:上述這個(gè)過(guò)程是有問(wèn)題的:因?yàn)橹灰暾?qǐng)證書,任何設(shè)備都可以安裝

描述文件

所以蘋果為了解決應(yīng)用濫用的問(wèn)題,所以蘋果又加了兩個(gè)限制.

  • 第一限制在蘋果后臺(tái)注冊(cè)過(guò)的設(shè)備才可以安裝.

  • 第二限制簽名只能針對(duì)某一個(gè)具體的APP.

并且蘋果還想控制App里面的iCloud/PUSH/后臺(tái)運(yùn)行/調(diào)試器附加這些權(quán)限,所以蘋果把這些權(quán)限開關(guān)統(tǒng)一稱為Entitlements(授權(quán)文件).并將這個(gè)文件放在了一個(gè)叫做Provisioning Profile(描述文件)文件中.

  • 描述文件是在AppleDevelop網(wǎng)站創(chuàng)建的(在Xcode中填上AppleID它會(huì)代辦創(chuàng)建),Xcode運(yùn)行時(shí)會(huì)打包進(jìn)入APP內(nèi).所以我們使用CSR申請(qǐng)證書時(shí),我們還要申請(qǐng)一個(gè)東西!! 就是描述文件!

  • 在開發(fā)時(shí),編譯完一個(gè) APP 后,用本地的私鑰M對(duì)這個(gè)APP進(jìn)行簽名,同時(shí)把從蘋果服務(wù)器得到的 Provisioning Profile 文件打包進(jìn)APP里,文件名為embedded.mobileprovision,把 APP 安裝到手機(jī)上.最后系統(tǒng)進(jìn)行驗(yàn)證。

  • 6、為了限制,蘋果提供了一個(gè)權(quán)限文件,即profile - 描述文件,所以3中的證書是包含在描述文件中的。除此之外還包含 設(shè)備id、AppID、權(quán)限文件等信息,其目的有兩個(gè):1)限制免費(fèi)證書安裝設(shè)備;2)限制免費(fèi)證書安裝期限,以下是加上描述文件后的雙重驗(yàn)證過(guò)程

    蘋果雙向簽名驗(yàn)證流程-09

    • 1)蘋果服務(wù)器提供了一個(gè)描述文件,其中包含CRT證書。

    • 2)然后通過(guò)mac的私鑰M對(duì)Mach-O文件進(jìn)行簽名,生成App簽名。

    • 3)將Mach-O文件、App簽名、描述文件一起打包生成ipa

    • 4)將App安裝到iOS設(shè)備中

    • 5)通過(guò)iPhone手機(jī)的私鑰A解密描述文件中的CRT證書,解密后得到公鑰M

    • 6)然后通過(guò)公鑰M驗(yàn)證App的簽名。因?yàn)?code>App簽名是通過(guò)私鑰M進(jìn)行簽名的,如果驗(yàn)證通過(guò),則說(shuō)明安裝是合法的

下面老看下描述文件,以下是描述文件的期限

蘋果雙向簽名驗(yàn)證流程-10

且在編譯好的App包中,同樣可以看到描述文件
蘋果雙向簽名驗(yàn)證流程-11

終端命令查看:通過(guò)命令查看描述文件(.app包的目錄下):security cms -D -i embedded.mobileprovision

雙重驗(yàn)證總結(jié)

所以,綜上所述,蘋果的雙重驗(yàn)證主要是指以下兩次簽名驗(yàn)證:

  • 1、iOS系統(tǒng)中通過(guò)內(nèi)置的公鑰A驗(yàn)證CRT證書

  • 2、通過(guò)1中證書取出的公鑰M驗(yàn)證App的簽名

總結(jié)

  • 證書公鑰M/私鑰M發(fā)出去,由官方的機(jī)構(gòu)對(duì)其進(jìn)行簽名后組成的數(shù)據(jù)包

  • p12 就是本地私鑰M

  • 描述文件:包含證書、權(quán)限文件(Entitlements - 權(quán)限開關(guān))、UUID等信息+權(quán)限。不能修改

  • 證書生成流程:

    • 1、通過(guò)本地的公鑰M/私鑰M,申請(qǐng)證書 -- CSR文件

    • 2、服務(wù)器將公鑰M進(jìn)行一次RSA加密,得到CRT證書

    • 3、將CRT證書下載到本地,與私鑰M(p12)進(jìn)行綁定

  • 蘋果雙向簽名驗(yàn)證流程如下圖所示


    蘋果雙向簽名驗(yàn)證流程
    • 1、在Mac中通過(guò)公鑰M+證書頒發(fā)機(jī)構(gòu)信息生成CSR文件

    • 2、將CSR文件傳遞到蘋果服務(wù)器,申請(qǐng)CRT證書

    • 3、蘋果服務(wù)器通過(guò)私鑰A加密公鑰M,生成CRT證書,并對(duì)公鑰M的hash值進(jìn)行數(shù)字簽名(即通過(guò)RSA加密)。同時(shí)蘋果還提供了描述文件

    • 4、通過(guò)私鑰M對(duì)Mach-O進(jìn)行簽名,生成一個(gè)App的簽名,同時(shí)將描述文件、CRT證書等打包,形成一個(gè)ipa

    • 5、App安裝到iOS設(shè)備

    • 6、從iPhone手機(jī)中獲取公鑰A,通過(guò)公鑰A解密CRT證書,得到公鑰M

    • 7、通過(guò)6中得到公鑰M驗(yàn)證App的簽名

  • 蘋果的雙重驗(yàn)證主要是指以下兩次簽名驗(yàn)證:

    • 1、iOS系統(tǒng)中通過(guò)內(nèi)置的公鑰A驗(yàn)證CRT證書

    • 2、通過(guò)1中證書取出的公鑰M驗(yàn)證App的簽名

參考鏈接

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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