iOS App 簽名的原理

iOS 簽名機(jī)制挺復(fù)雜,各種證書(shū)究流,Provisioning Profile,entitlements锉矢,CertificateSigningRequest梯嗽,p12,AppID沽损,概念一堆灯节,也很容易出錯(cuò),本文嘗試從原理出發(fā)绵估,一步步推出為什么會(huì)有這么多概念炎疆,希望能有助于理解 iOS App 簽名的原理和流程。

目的

先來(lái)看看蘋(píng)果的簽名機(jī)制是為了做什么国裳。在 iOS 出來(lái)之前形入,在主流操作系統(tǒng)(Mac/Windows/Linux)上開(kāi)發(fā)和運(yùn)行軟件是不需要簽名的,軟件隨便從哪里下載都能運(yùn)行缝左,導(dǎo)致平臺(tái)對(duì)第三方軟件難以控制亿遂,盜版流行。蘋(píng)果希望解決這樣的問(wèn)題渺杉,在 iOS 平臺(tái)對(duì)第三方 APP 有絕對(duì)的控制權(quán)蛇数,一定要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過(guò)蘋(píng)果官方允許的,怎樣保證呢是越?就是通過(guò)簽名機(jī)制耳舅。

非對(duì)稱(chēng)加密

通常我們說(shuō)的簽名就是數(shù)字簽名,它是基于非對(duì)稱(chēng)加密算法實(shí)現(xiàn)的倚评。對(duì)稱(chēng)加密是通過(guò)同一份密鑰加密和解密數(shù)據(jù)浦徊,而非對(duì)稱(chēng)加密則有兩份密鑰馏予,分別是公鑰和私鑰,用公鑰加密的數(shù)據(jù)盔性,要用私鑰才能解密霞丧,用私鑰加密的數(shù)據(jù),要用公鑰才能解密纯出。

簡(jiǎn)單說(shuō)一下常用的非對(duì)稱(chēng)加密算法 RSA 的數(shù)學(xué)原理蚯妇,理解簡(jiǎn)單的數(shù)學(xué)原理,就可以理解非對(duì)稱(chēng)加密是怎么做到的暂筝,為什么會(huì)是安全的:

選兩個(gè)質(zhì)數(shù) p 和 q箩言,相乘得出一個(gè)大整數(shù)n,例如 p = 61焕襟,q = 53陨收,n = pq = 3233

選 1-n 間的隨便一個(gè)質(zhì)數(shù)e,例如 e = 17

經(jīng)過(guò)一系列數(shù)學(xué)公式鸵赖,算出一個(gè)數(shù)字 d务漩,滿(mǎn)足:

a.通過(guò) n 和 e 這兩個(gè)數(shù)據(jù)一組數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算后,可以通過(guò) n 和 d 去反解運(yùn)算它褪,反過(guò)來(lái)也可以饵骨。

b.如果只知道 n 和 e,要推導(dǎo)出 d茫打,需要知道 p 和 q居触,也就是要需要把 n 因數(shù)分解。

上述的 (n,e) 這兩個(gè)數(shù)據(jù)在一起就是公鑰老赤,(n,d) 這兩個(gè)數(shù)據(jù)就是私鑰轮洋,滿(mǎn)足用私鑰加密,公鑰解密抬旺,或反過(guò)來(lái)公鑰加密弊予,私鑰解密,也滿(mǎn)足在只暴露公鑰 (只知道 n 和 e)的情況下开财,要推導(dǎo)出私鑰 (n,d)汉柒,需要把大整數(shù) n 因數(shù)分解。目前因數(shù)分解只能靠暴力窮舉责鳍,而 n 數(shù)字越大竭翠,越難以用窮舉計(jì)算出因數(shù) p 和 q,也就越安全薇搁,當(dāng) n 大到二進(jìn)制 1024 位或 2048 位時(shí),以目前技術(shù)要破解幾乎不可能渡八,所以非常安全啃洋。

若對(duì)數(shù)字 d 是怎樣計(jì)算出來(lái)的感興趣传货,可以詳讀這兩篇文章:RSA 算法原理(一)(二)

數(shù)字簽名

現(xiàn)在知道了有非對(duì)稱(chēng)加密這東西,那數(shù)字簽名是怎么回事呢宏娄?

數(shù)字簽名的作用是我對(duì)某一份數(shù)據(jù)打個(gè)標(biāo)記问裕,表示我認(rèn)可了這份數(shù)據(jù)(簽了個(gè)名),然后我發(fā)送給其他人孵坚,其他人可以知道這份數(shù)據(jù)是經(jīng)過(guò)我認(rèn)證的粮宛,數(shù)據(jù)沒(méi)有被篡改過(guò)。

有了上述非對(duì)稱(chēng)加密算法卖宠,就可以實(shí)現(xiàn)這個(gè)需求:

首先用一種算法巍杈,算出原始數(shù)據(jù)的摘要。需滿(mǎn)足 a.若原始數(shù)據(jù)有任何變化扛伍,計(jì)算出來(lái)的摘要值都會(huì)變化筷畦。 b.摘要要夠短。這里最常用的算法是MD5刺洒。

生成一份非對(duì)稱(chēng)加密的公鑰和私鑰鳖宾,私鑰我自己拿著,公鑰公布出去逆航。

對(duì)一份數(shù)據(jù)鼎文,算出摘要后,用私鑰加密這個(gè)摘要因俐,得到一份加密后的數(shù)據(jù)拇惋,稱(chēng)為原始數(shù)據(jù)的簽名。把它跟原始數(shù)據(jù)一起發(fā)送給用戶(hù)女揭。

用戶(hù)收到數(shù)據(jù)和簽名后蚤假,用公鑰解密得到摘要。同時(shí)用戶(hù)用同樣的算法計(jì)算原始數(shù)據(jù)的摘要吧兔,對(duì)比這里計(jì)算出來(lái)的摘要和用公鑰解密簽名得到的摘要是否相等磷仰,若相等則表示這份數(shù)據(jù)中途沒(méi)有被篡改過(guò),因?yàn)槿绻鄹倪^(guò)境蔼,摘要會(huì)變化灶平。

之所以要有第一步計(jì)算摘要,是因?yàn)榉菍?duì)稱(chēng)加密的原理限制可加密的內(nèi)容不能太大(不能大于上述 n 的位數(shù)箍土,也就是一般不能大于 1024 位 / 2048 位)逢享,于是若要對(duì)任意大的數(shù)據(jù)簽名,就需要改成對(duì)它的特征值簽名吴藻,效果是一樣的瞒爬。

好了,有了非對(duì)稱(chēng)加密的基礎(chǔ),知道了數(shù)字簽名是什么侧但,怎樣可以保證一份數(shù)據(jù)是經(jīng)過(guò)某個(gè)地方認(rèn)證的矢空,來(lái)看看怎樣通過(guò)數(shù)字簽名的機(jī)制保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過(guò)蘋(píng)果認(rèn)證允許的。

最簡(jiǎn)單的簽名

要實(shí)現(xiàn)這個(gè)需求很簡(jiǎn)單禀横,最直接的方式屁药,蘋(píng)果官方生成一對(duì)公私鑰,在 iOS 里內(nèi)置一個(gè)公鑰柏锄,私鑰由蘋(píng)果后臺(tái)保存酿箭,我們傳 App 上 AppStore 時(shí),蘋(píng)果后臺(tái)用私鑰對(duì) APP 數(shù)據(jù)進(jìn)行簽名趾娃,iOS 系統(tǒng)下載這個(gè) APP 后缭嫡,用公鑰驗(yàn)證這個(gè)簽名,若簽名正確茫舶,這個(gè) APP 肯定是由蘋(píng)果后臺(tái)認(rèn)證的械巡,并且沒(méi)有被修改過(guò),也就達(dá)到了蘋(píng)果的需求:保證安裝的每一個(gè) APP 都是經(jīng)過(guò)蘋(píng)果官方允許的饶氏。

如果我們 iOS 設(shè)備安裝 APP 只有從 AppStore 下載這一種方式的話讥耗,這件事就結(jié)束了,沒(méi)有任何復(fù)雜的東西疹启,只有一個(gè)數(shù)字簽名古程,非常簡(jiǎn)單地解決問(wèn)題。

但實(shí)際上因?yàn)槌藦?AppStore 下載喊崖,我們還可以有三種方式安裝一個(gè) App:

開(kāi)發(fā) App 時(shí)可以直接把開(kāi)發(fā)中的應(yīng)用安裝進(jìn)手機(jī)進(jìn)行調(diào)試挣磨。

In-House 企業(yè)內(nèi)部分發(fā),可以直接安裝企業(yè)證書(shū)簽名后的 APP荤懂。

AD-Hoc 相當(dāng)于企業(yè)分發(fā)的限制版茁裙,限制安裝設(shè)備數(shù)量,較少用节仿。

蘋(píng)果要對(duì)用這三種方式安裝的 App 進(jìn)行控制晤锥,就有了新的需求,無(wú)法像上面這樣簡(jiǎn)單了廊宪。

新的需求

我們先來(lái)看第一個(gè)矾瘾,開(kāi)發(fā)時(shí)安裝APP,它有兩個(gè)個(gè)需求:

安裝包不需要傳到蘋(píng)果服務(wù)器箭启,可以直接安裝到手機(jī)上壕翩。如果你編譯一個(gè) APP 到手機(jī)前要先傳到蘋(píng)果服務(wù)器簽名,這顯然是不能接受的傅寡。

蘋(píng)果必須對(duì)這里的安裝有控制權(quán)放妈,包括

a. 經(jīng)過(guò)蘋(píng)果允許才可以這樣安裝北救。

b. 不能被濫用導(dǎo)致非開(kāi)發(fā)app也能被安裝。

為了實(shí)現(xiàn)這些需求大猛,iOS 簽名的復(fù)雜度也就開(kāi)始增加了扭倾。

蘋(píng)果這里給出的方案是使用了雙層簽名,會(huì)比較繞挽绩,流程大概是這樣的:

在你的 Mac 開(kāi)發(fā)機(jī)器生成一對(duì)公私鑰,這里稱(chēng)為公鑰L驾中,私鑰L唉堪。L:Local

蘋(píng)果自己有固定的一對(duì)公私鑰,跟上面 AppStore 例子一樣肩民,私鑰在蘋(píng)果后臺(tái)唠亚,公鑰在每個(gè) iOS 設(shè)備上。這里稱(chēng)為公鑰A持痰,私鑰A灶搜。A:Apple

把公鑰 L 傳到蘋(píng)果后臺(tái),用蘋(píng)果后臺(tái)里的私鑰 A 去簽名公鑰 L工窍。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名割卖,把這份數(shù)據(jù)稱(chēng)為證書(shū)。

在開(kāi)發(fā)時(shí)患雏,編譯完一個(gè) APP 后鹏溯,用本地的私鑰 L 對(duì)這個(gè) APP 進(jìn)行簽名,同時(shí)把第三步得到的證書(shū)一起打包進(jìn) APP 里淹仑,安裝到手機(jī)上丙挽。

在安裝時(shí),iOS 系統(tǒng)取得證書(shū)匀借,通過(guò)系統(tǒng)內(nèi)置的公鑰 A颜阐,去驗(yàn)證證書(shū)的數(shù)字簽名是否正確。

驗(yàn)證證書(shū)后確保了公鑰 L 是蘋(píng)果認(rèn)證過(guò)的吓肋,再用公鑰 L 去驗(yàn)證 APP 的簽名凳怨,這里就間接驗(yàn)證了這個(gè) APP 安裝行為是否經(jīng)過(guò)蘋(píng)果官方允許。(這里只驗(yàn)證安裝行為蓬坡,不驗(yàn)證APP 是否被改動(dòng)猿棉,因?yàn)殚_(kāi)發(fā)階段 APP 內(nèi)容總是不斷變化的,蘋(píng)果不需要管屑咳。)

加點(diǎn)東西

上述流程只解決了上面第一個(gè)需求萨赁,也就是需要經(jīng)過(guò)蘋(píng)果允許才可以安裝,還未解決第二個(gè)避免被濫用的問(wèn)題兆龙。怎么解決呢杖爽?蘋(píng)果再加了兩個(gè)限制敲董,一是限制在蘋(píng)果后臺(tái)注冊(cè)過(guò)的設(shè)備才可以安裝,二是限制簽名只能針對(duì)某一個(gè)具體的 APP慰安。

怎么加的腋寨?在上述第三步,蘋(píng)果用私鑰 A 簽名我們本地公鑰 L 時(shí)化焕,實(shí)際上除了簽名公鑰 L萄窜,還可以加上無(wú)限多數(shù)據(jù),這些數(shù)據(jù)都可以保證是經(jīng)過(guò)蘋(píng)果官方認(rèn)證的撒桨,不會(huì)有被篡改的可能查刻。

可以想到把 允許安裝的設(shè)備 ID 列表 和 App對(duì)應(yīng)的 AppID 等數(shù)據(jù),都在第三步這里跟公鑰L一起組成證書(shū)凤类,再用蘋(píng)果私鑰 A 對(duì)這個(gè)證書(shū)簽名穗泵。在最后第 5 步驗(yàn)證時(shí)就可以拿到設(shè)備 ID 列表,判斷當(dāng)前設(shè)備是否符合要求谜疤。根據(jù)數(shù)字簽名的原理佃延,只要數(shù)字簽名通過(guò)驗(yàn)證,第 5 步這里的設(shè)備 IDs / AppID / 公鑰 L 就都是經(jīng)過(guò)蘋(píng)果認(rèn)證的夷磕,無(wú)法被修改履肃,蘋(píng)果就可以限制可安裝的設(shè)備和 APP,避免濫用企锌。

最終流程

到這里這個(gè)證書(shū)已經(jīng)變得很復(fù)雜了榆浓,有很多額外信息,實(shí)際上除了 設(shè)備 ID / AppID撕攒,還有其他信息也需要在這里用蘋(píng)果簽名陡鹃,像這個(gè) APP 里 iCloud / push / 后臺(tái)運(yùn)行 等權(quán)限蘋(píng)果都想控制,蘋(píng)果把這些權(quán)限開(kāi)關(guān)統(tǒng)一稱(chēng)為 Entitlements抖坪,它也需要通過(guò)簽名去授權(quán)萍鲸。

實(shí)際上一個(gè)“證書(shū)”本來(lái)就有規(guī)定的格式規(guī)范,上面我們把各種額外信息塞入證書(shū)里是不合適的擦俐,于是蘋(píng)果另外搞了個(gè)東西脊阴,叫 Provisioning Profile,一個(gè) Provisioning Profile 里就包含了證書(shū)以及上述提到的所有額外信息蚯瞧,以及所有信息的簽名嘿期。

所以整個(gè)流程稍微變一下,就變成這樣了:

因?yàn)椴襟E有小變動(dòng)埋合,這里我們不辭啰嗦重新再列一遍整個(gè)流程:

在你的 Mac 開(kāi)發(fā)機(jī)器生成一對(duì)公私鑰备徐,這里稱(chēng)為公鑰L,私鑰L甚颂。L:Local

蘋(píng)果自己有固定的一對(duì)公私鑰蜜猾,跟上面 AppStore 例子一樣秀菱,私鑰在蘋(píng)果后臺(tái),公鑰在每個(gè) iOS 設(shè)備上蹭睡。這里稱(chēng)為公鑰A衍菱,私鑰A。A:Apple

把公鑰 L 傳到蘋(píng)果后臺(tái)肩豁,用蘋(píng)果后臺(tái)里的私鑰 A 去簽名公鑰 L脊串。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名,把這份數(shù)據(jù)稱(chēng)為證書(shū)清钥。

在蘋(píng)果后臺(tái)申請(qǐng) AppID洪规,配置好設(shè)備 ID 列表和 APP 可使用的權(quán)限,再加上第③步的證書(shū)循捺,組成的數(shù)據(jù)用私鑰 A 簽名,把數(shù)據(jù)和簽名一起組成一個(gè) Provisioning Profile 文件雄人,下載到本地 Mac 開(kāi)發(fā)機(jī)从橘。

在開(kāi)發(fā)時(shí),編譯完一個(gè) APP 后础钠,用本地的私鑰 L 對(duì)這個(gè) APP 進(jìn)行簽名恰力,同時(shí)把第④步得到的 Provisioning Profile 文件打包進(jìn) APP 里,文件名為 embedded.mobileprovision旗吁,把 APP 安裝到手機(jī)上踩萎。

在安裝時(shí),iOS 系統(tǒng)取得證書(shū)很钓,通過(guò)系統(tǒng)內(nèi)置的公鑰 A香府,去驗(yàn)證 embedded.mobileprovision 的數(shù)字簽名是否正確,里面的證書(shū)簽名也會(huì)再驗(yàn)一遍码倦。

確保了 embedded.mobileprovision 里的數(shù)據(jù)都是蘋(píng)果授權(quán)以后企孩,就可以取出里面的數(shù)據(jù),做各種驗(yàn)證袁稽,包括用公鑰 L 驗(yàn)證APP簽名勿璃,驗(yàn)證設(shè)備 ID 是否在 ID 列表上,AppID 是否對(duì)應(yīng)得上推汽,權(quán)限開(kāi)關(guān)是否跟 APP 里的 Entitlements 對(duì)應(yīng)等补疑。

開(kāi)發(fā)者證書(shū)從簽名到認(rèn)證最終蘋(píng)果采用的流程大致是這樣,還有一些細(xì)節(jié)像證書(shū)有效期/證書(shū)類(lèi)型等就不細(xì)說(shuō)了歹撒。

概念和操作

上面的步驟對(duì)應(yīng)到我們平常具體的操作和概念是這樣的:

第 1 步對(duì)應(yīng)的是 keychain 里的 “從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū)”莲组,這里就本地生成了一對(duì)公私鑰,保存的 CertificateSigningRequest 就是公鑰栈妆,私鑰保存在本地電腦里胁编。

第 2 步蘋(píng)果處理厢钧,不用管。

第 3 步對(duì)應(yīng)把 CertificateSigningRequest 傳到蘋(píng)果后臺(tái)生成證書(shū)嬉橙,并下載到本地早直。這時(shí)本地有兩個(gè)證書(shū),一個(gè)是第 1 步生成的市框,一個(gè)是這里下載回來(lái)的霞扬,keychain 會(huì)把這兩個(gè)證書(shū)關(guān)聯(lián)起來(lái),因?yàn)樗麄児借€是對(duì)應(yīng)的枫振,在XCode選擇下載回來(lái)的證書(shū)時(shí)喻圃,實(shí)際上會(huì)找到 keychain 里對(duì)應(yīng)的私鑰去簽名。這里私鑰只有生成它的這臺(tái) Mac 有粪滤,如果別的 Mac 也要編譯簽名這個(gè) App 怎么辦斧拍?答案是把私鑰導(dǎo)出給其他 Mac 用,在 keychain 里導(dǎo)出私鑰杖小,就會(huì)存成 .p12 文件肆汹,其他 Mac 打開(kāi)后就導(dǎo)入了這個(gè)私鑰。

第 4 步都是在蘋(píng)果網(wǎng)站上操作予权,配置 AppID / 權(quán)限 / 設(shè)備等昂勉,最后下載 Provisioning Profile 文件。

第 5 步 XCode 會(huì)通過(guò)第 3 步下載回來(lái)的證書(shū)(存著公鑰)扫腺,在本地找到對(duì)應(yīng)的私鑰(第一步生成的)岗照,用本地私鑰去簽名 App,并把 Provisioning Profile 文件命名為 embedded.mobileprovision 一起打包進(jìn)去笆环。這里對(duì) App 的簽名數(shù)據(jù)保存分兩部分攒至,Mach-O 可執(zhí)行文件會(huì)把簽名直接寫(xiě)入這個(gè)文件里,其他資源文件則會(huì)保存在 _CodeSignature 目錄下咧织。

第 6 – 7 步的打包和驗(yàn)證都是 Xcode 和 iOS 系統(tǒng)自動(dòng)做的事嗓袱。

這里再總結(jié)一下這些概念:

證書(shū):內(nèi)容是公鑰或私鑰,由其他機(jī)構(gòu)對(duì)其簽名組成的數(shù)據(jù)包习绢。

Entitlements:包含了 App 權(quán)限開(kāi)關(guān)列表渠抹。

CertificateSigningRequest:本地公鑰。

p12:本地私鑰闪萄,可以導(dǎo)入到其他電腦梧却。

Provisioning Profile:包含了 證書(shū) / Entitlements 等數(shù)據(jù),并由蘋(píng)果后臺(tái)私鑰簽名的數(shù)據(jù)包败去。

其他發(fā)布方式

前面以開(kāi)發(fā)包為例子說(shuō)了簽名和驗(yàn)證的流程放航,另外兩種方式 In-House 企業(yè)簽名和 AD-Hoc 流程也是差不多的,只是企業(yè)簽名不限制安裝的設(shè)備數(shù)圆裕,另外需要用戶(hù)在 iOS 系統(tǒng)設(shè)置上手動(dòng)點(diǎn)擊信任這個(gè)企業(yè)才能通過(guò)驗(yàn)證广鳍。

而 AppStore 的簽名驗(yàn)證方式有些不一樣荆几,前面我們說(shuō)到最簡(jiǎn)單的簽名方式,蘋(píng)果在后臺(tái)直接用私鑰簽名 App 就可以了赊时,實(shí)際上蘋(píng)果確實(shí)是這樣做的吨铸,如果去下載一個(gè) AppStore 的安裝包,會(huì)發(fā)現(xiàn)它里面是沒(méi)有 embedded.mobileprovision 文件的祖秒,也就是它安裝和啟動(dòng)的流程是不依賴(lài)這個(gè)文件诞吱,驗(yàn)證流程也就跟上述幾種類(lèi)型不一樣了。

據(jù)猜測(cè)竭缝,因?yàn)樯蟼鞯?AppStore 的包蘋(píng)果會(huì)重新對(duì)內(nèi)容加密房维,原來(lái)的本地私鑰簽名就沒(méi)有用了,需要重新簽名抬纸,從 AppStore 下載的包蘋(píng)果也并不打算控制它的有效期咙俩,不需要內(nèi)置一個(gè) embedded.mobileprovision 去做校驗(yàn),直接在蘋(píng)果用后臺(tái)的私鑰重新簽名湿故,iOS 安裝時(shí)用本地公鑰驗(yàn)證 App 簽名就可以了暴浦。

那為什么發(fā)布 AppStore 的包還是要跟開(kāi)發(fā)版一樣搞各種證書(shū)和 Provisioning Profile?猜測(cè)因?yàn)樘O(píng)果想做統(tǒng)一管理晓锻,Provisioning Profile 里包含一些權(quán)限控制,AppID 的檢驗(yàn)等飞几,蘋(píng)果不想在上傳 AppStore 包時(shí)重新用另一種協(xié)議做一遍這些驗(yàn)證砚哆,就不如統(tǒng)一把這部分放在 Provisioning Profile 里,上傳 AppStore 時(shí)只要用同樣的流程驗(yàn)證這個(gè) Provisioning Profile 是否合法就可以了屑墨。

所以 App 上傳到 AppStore 后躁锁,就跟你的 證書(shū) / Provisioning Profile 都沒(méi)有關(guān)系了损趋,無(wú)論他們是否過(guò)期或被廢除串塑,都不會(huì)影響 AppStore 上的安裝包。

到這里 iOS 簽名機(jī)制的原理和主流程大致說(shuō)完了予弧,希望能對(duì)理解蘋(píng)果簽名和排查日常簽名問(wèn)題有所幫助以躯。

P.S.一些疑問(wèn)

最后這里再提一下我關(guān)于簽名流程的一些的疑問(wèn)槐秧。

企業(yè)證書(shū)

企業(yè)證書(shū)簽名因?yàn)橄拗粕伲趪?guó)內(nèi)被廣泛用于測(cè)試和盜版忧设,fir.im / 蒲公英等測(cè)試平臺(tái)都是通過(guò)企業(yè)證書(shū)分發(fā)刁标,國(guó)內(nèi)一些市場(chǎng)像 PP 助手,愛(ài)思助手址晕,一部分安裝手段也是通過(guò)企業(yè)證書(shū)重簽名膀懈。通過(guò)企業(yè)證書(shū)簽名安裝的 App,啟動(dòng)時(shí)都會(huì)驗(yàn)證證書(shū)的有效期谨垃,并且不定期請(qǐng)求蘋(píng)果服務(wù)器看證書(shū)是否被吊銷(xiāo)启搂,若已過(guò)期或被吊銷(xiāo)硼控,就會(huì)無(wú)法啟動(dòng) App。對(duì)于這種助手的盜版安裝手段胳赌,蘋(píng)果想打擊只能一個(gè)個(gè)吊銷(xiāo)企業(yè)證書(shū)牢撼,并沒(méi)有太好的辦法。

這里我的疑問(wèn)是匈织,蘋(píng)果做了那么多簽名和驗(yàn)證機(jī)制去限制在 iOS 安裝 App浪默,為什么又要出這樣一個(gè)限制很少的方式讓盜版鉆空子呢?若真的是企業(yè)用途不適合上 AppStore缀匕,也完全可以在 AppStore 開(kāi)辟一個(gè)小的私密版塊纳决,還是通過(guò) AppStore 去安裝,就不會(huì)有這個(gè)問(wèn)題了乡小。

AppStore 加密

另一個(gè)問(wèn)題是我們把 App 傳上 AppStore 后阔加,蘋(píng)果會(huì)對(duì) App 進(jìn)行加密,導(dǎo)致 App 體積增大不少满钟,這個(gè)加密實(shí)際上是沒(méi)卵用的胜榔,只是讓破解的人要多做一個(gè)步驟,運(yùn)行 App 去內(nèi)存 dump 出可執(zhí)行文件而已湃番,無(wú)論怎樣加密夭织,都可以用這種方式拿出加密前的可執(zhí)行文件。所以為什么要做這樣的加密呢吠撮?想不到有什么好處尊惰。

本地私鑰

我們看到前面說(shuō)的簽名流程很繞很復(fù)雜,經(jīng)常出現(xiàn)各種問(wèn)題泥兰,像有 Provisioning Profile 文件但證書(shū)又不對(duì)弄屡,本地有公鑰證書(shū)沒(méi)對(duì)應(yīng)私鑰等情況,不理解原理的情況下會(huì)被繞暈鞋诗,我的疑問(wèn)是膀捷,這里為什么不能簡(jiǎn)化呢?還是以開(kāi)發(fā)證書(shū)為例削彬,為什么一定要用本地 Mac 生成的私鑰去簽名全庸?蘋(píng)果要的只是本地簽名,私鑰不一定是要本地生成的融痛,蘋(píng)果也可以自己生成一對(duì)公私鑰給我們糕篇,放在 Provisioning Profile 里,我們用里面的私鑰去加密就行了酌心,這樣就不會(huì)有 CertificateSigningRequest 和 p12 的概念拌消,跟本地 keychain 沒(méi)有關(guān)系,不需要關(guān)心證書(shū),只要有 Provisioning Profile 就能簽名墩崩,流程會(huì)減少氓英,易用性會(huì)提高很多,同時(shí)蘋(píng)果想要的控制一點(diǎn)都不會(huì)少鹦筹,也沒(méi)有什么安全問(wèn)題铝阐,為什么不這樣設(shè)計(jì)呢?

能想到的一個(gè)原因是 Provisioning Profile 在非 AppStore 安裝時(shí)會(huì)打包進(jìn)安裝包铐拐,第三方拿到這個(gè) Provisioning Profile 文件就能直接用起來(lái)給他自己的 App 簽名了徘键。但這種問(wèn)題也挺好解決,只需要打包時(shí)去掉文件里的私鑰就行了遍蟋,所以仍不明白為什么這樣設(shè)計(jì)吹害。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虚青,隨后出現(xiàn)的幾起案子它呀,更是在濱河造成了極大的恐慌,老刑警劉巖棒厘,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纵穿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奢人,警方通過(guò)查閱死者的電腦和手機(jī)谓媒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)何乎,“玉大人篙耗,你說(shuō)我怎么就攤上這事∠芨希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脯燃,是天一觀的道長(zhǎng)搂妻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辕棚,這世上最難降的妖魔是什么欲主? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮逝嚎,結(jié)果婚禮上扁瓢,老公的妹妹穿的比我還像新娘。我一直安慰自己补君,他們只是感情好引几,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挽铁,像睡著了一般伟桅。 火紅的嫁衣襯著肌膚如雪敞掘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天楣铁,我揣著相機(jī)與錄音玖雁,去河邊找鬼。 笑死盖腕,一個(gè)胖子當(dāng)著我的面吹牛赫冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溃列,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劲厌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哭廉?” 一聲冷哼從身側(cè)響起脊僚,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遵绰,沒(méi)想到半個(gè)月后辽幌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椿访,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年乌企,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成玫。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡加酵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哭当,到底是詐尸還是另有隱情猪腕,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布钦勘,位于F島的核電站陋葡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏彻采。R本人自食惡果不足惜腐缤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肛响。 院中可真熱鬧岭粤,春花似錦、人聲如沸特笋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偿渡,卻和暖如春臼寄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溜宽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吉拳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人适揉。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓留攒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嫉嘀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炼邀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354