讓.保羅.薩特曾說過:現(xiàn)實(shí)的精華就是匱乏,一種普遍而永恒的欠缺。人生重要的不是填補(bǔ)一種不完美,而是找到自己的位置鸽疾。
iOS簽名機(jī)制
iOS 平臺(tái)對(duì)第三方 APP 有絕對(duì)的控制權(quán),一定要保證每一個(gè)安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的训貌,所使用的就是蘋果的簽名機(jī)制制肮。蘋果簽名使用的是非對(duì)稱加密技術(shù),非對(duì)稱加密有兩份密鑰递沪,分別是公鑰和私鑰豺鼻,用公鑰加密的數(shù)據(jù),要用私鑰才能解密区拳,用私鑰加密的數(shù)據(jù)拘领,要用公鑰才能解密。比較常見的非對(duì)稱加密算法就是RSA樱调。
RSA的基本實(shí)現(xiàn)原理如下:
第一步约素,隨機(jī)選擇兩個(gè)不相等的質(zhì)數(shù)p和q
第二步,計(jì)算p和q的乘積n
第三步笆凌,計(jì)算n的歐拉函數(shù)φ(n)
φ(n) = (p-1)(q-1)
第四步圣猎,隨機(jī)選擇一個(gè)整數(shù)e,條件是1< e < φ(n)乞而,且e與φ(n) 互質(zhì)送悔。
第五步,計(jì)算e對(duì)于φ(n)的模反元素d(就是指有一個(gè)整數(shù)d,可以使得ed被φ(n)除的余數(shù)為1)
ed ≡ 1 (mod φ(n)) == ed - 1 = kφ(n)
于是欠啤,找到模反元素d荚藻。(用"擴(kuò)展歐幾里得算法"求解)
第六步,將n和e封裝成公鑰洁段,n和d封裝成私鑰
私鑰被破解应狱,需要大整數(shù)的因數(shù)分解,是一件非常困難的事情祠丝。目前疾呻,除了暴力破解,還沒有發(fā)現(xiàn)別的有效方法写半。對(duì)極大整數(shù)做因數(shù)分解的難度決定了RSA算法的可靠性岸蜗。
App的安裝方式有四種:
1. 通過App Store安裝
由蘋果生成一對(duì)公私鑰,公鑰內(nèi)置iOS設(shè)備中叠蝇,私鑰由蘋果保管璃岳。開發(fā)者上傳App給蘋果審核后,蘋果用私鑰對(duì)App數(shù)據(jù)進(jìn)行簽名蟆肆,使用的是發(fā)布證書矾睦,發(fā)布至App Store。iOS設(shè)備下載App后炎功,用公鑰進(jìn)行驗(yàn)證,若正確缓溅,則證明App是由蘋果認(rèn)證過的蛇损。
2. 開發(fā)者可以通過Xcode安裝
蘋果采用了雙重簽名的機(jī)制。Mac電腦有一對(duì)公私鑰坛怪,蘋果還是原來的一對(duì)公私鑰淤齐。
開發(fā)時(shí)需要真機(jī)測(cè)試時(shí),需要從鑰匙串中的證書中心創(chuàng)建證書請(qǐng)求文件(CSR CertificateSigningRequest.certSigningRequest 用于綁定電腦袜匿,文件中有Mac電腦的公鑰)更啄,并傳至蘋果服務(wù)器。
Apple使用私鑰對(duì) CSR 簽名居灯,生成一份包含Mac公鑰信息及Apple對(duì)它的簽名祭务,被稱為證書(CER:即開發(fā)證書,發(fā)布證書)怪嫌,這里使用的是開發(fā)證書义锥。
編譯完一個(gè)App后,Mac電腦使用私鑰對(duì)App進(jìn)行簽名岩灭。
在安裝App時(shí)拌倍,根據(jù)當(dāng)前配置把CER證書一起打包進(jìn)App。
iOS設(shè)備通過內(nèi)置的Apple的公鑰驗(yàn)證CER是否正確,證書驗(yàn)證確保Mac公鑰時(shí)經(jīng)過蘋果認(rèn)證的柱恤。
再使用CER文件中Mac的公鑰去驗(yàn)證App的簽名是否正確数初,確保安裝行為是經(jīng)過蘋果允許的。在蘋果注冊(cè)過的設(shè)備才可以安裝梗顺;簽名只針對(duì)某一個(gè)App妙真。打包證書進(jìn)App中時(shí),還需要加上允許安裝的設(shè)備ID和App對(duì)應(yīng)的APPID等數(shù)據(jù)(Profile文件)荚守。
蘋果還要控制iCloud/push/后臺(tái)運(yùn)行等珍德,這些都需要蘋果授權(quán)簽名,蘋果把這些權(quán)限開關(guān)統(tǒng)稱為:Entitlements矗漾,需要蘋果授權(quán)锈候。因此證書中可能包含很多東西,不符合規(guī)定的格式規(guī)范敞贡,所以有了Provisioning Profile(描述文件)泵琳,描述中包含了證書以及其他所有的信息及信息的簽名。
蘋果只是確定這里的安裝行為是否合法誊役,不會(huì)驗(yàn)證App內(nèi)容是否修改获列。根據(jù)數(shù)字簽名的原理,只要數(shù)字簽名通過驗(yàn)證蛔垢,這里的設(shè)備 IDs / AppID / Mac公鑰 就都是經(jīng)過蘋果認(rèn)證的击孩,無法被修改,蘋果就可以限制可安裝的設(shè)備和App鹏漆。
3. Ad-Hoc 測(cè)試證書打包的App巩梢,數(shù)量限制100
Ad-Hoc可以用發(fā)布證書打測(cè)試包,流程幾乎和上面的真機(jī)調(diào)試一樣艺玲,唯一的差別在第4步括蝠。編譯簽名完之后,要導(dǎo)出ipa文件饭聚,導(dǎo)出時(shí)忌警,需要選擇一個(gè)保存的方法(App Store/Ad Hoc/Enterprise/Development),就是選擇將上一步生成的CER一起打包進(jìn)App秒梳。
4. In-House 企業(yè)版證書打包App法绵,信任企業(yè)證書后可以使用
企業(yè)版證書簽名驗(yàn)證流程和Ad-Hoc差不多,需要用企業(yè)版證書簽名端幼。只是企業(yè)版不限制設(shè)備數(shù)礼烈,而且需要用戶在iOS設(shè)備上的設(shè)置里手動(dòng)點(diǎn)擊信任證書。
最終流程如下:
其他人想要編譯簽名App時(shí)應(yīng)怎么做? 簡(jiǎn)單就是把私鑰給他婆跑。私鑰也是從 鑰匙串 中導(dǎo)出此熬,就是.p12文件,其他Mac導(dǎo)入私鑰后就可以正常使用了。
查看ipa包中注冊(cè)的設(shè)備ID犀忱,解壓.ipa文件募谎,得到App數(shù)據(jù)包,顯示包內(nèi)容阴汇,找到embedded.mobileprovision文件所在目錄数冬,運(yùn)行命令:
security cms -D -i embedded.mobileprovision
重簽
從上面的原理,我們知道搀庶,如果想看別人的App拐纱,需要他們的.P12文件,如果拿不到別人的.P12文件哥倔,咋整呢秸架。那就只能自己整了。
第一種方式:
從PP助手等破解平臺(tái)下載ipa包咆蒿,這里能找到的包东抹,幾乎都是已經(jīng)重簽過的氢橙,可以隨心所用窍育。
第二種方式:
稍顯復(fù)雜,根據(jù)上面描述丹锹,找到自己打的ipa包的embedded.mobileprovision文件蒂破。然后安裝sigh腳本
sudo gem install sigh
報(bào)錯(cuò)使用下面命令
sudo gem install -n /usr/local/bin sigh
如此馏谨,便可使用sigh重簽名了。
1寞蚌、在終端輸入sigh resign田巴,回車
2、把要簽名的ipa文件(路徑挟秤、包名不要有中文)拖到終端窗口上,回車
3抄伍、填寫用來簽名的證書(第一步中的證書)名如圖(鑰匙串中的完整名字)艘刚,回車
4、把項(xiàng)目的配置文件.mobileprovision文件(第二步中的文件)拖到終端窗口上截珍,回車
5攀甚、resign腳本會(huì)自動(dòng)更改bundel id,簽名并重新打包岗喉。
完成后提示Successfully signed秋度,新生成的包會(huì)自動(dòng)替換原有文件。