探討iOS應(yīng)用簽名之前性含,首先我們需要了解一個(gè)東西,叫做數(shù)字簽名
。
數(shù)字簽名
名詞解釋:為什么用簽名這個(gè)詞墓塌,因?yàn)槔贤庀矚g用支票,支票上面的簽名能夠證明這玩意是你的建车。那么數(shù)字簽名顧名思義,就是用于鑒別數(shù)字信息的方法。
我們來思考一下瞒大,想要證明數(shù)字信息(二進(jìn)制數(shù)據(jù),或計(jì)算機(jī)里面的任意數(shù)據(jù))的有效性搪桂,那么使用什么方式最合適呢透敌?
可以想到有信息指紋
之稱的HASH算法
。在網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)倪^程中踢械,我們可以將明文數(shù)據(jù)酗电,和數(shù)據(jù)的HASH值一起傳輸給對(duì)方,對(duì)方可以拿出HASH值來進(jìn)行驗(yàn)證内列。
但是在這個(gè)過程中撵术,明文數(shù)據(jù)和HASH值如果直接傳輸就都有被篡改的風(fēng)險(xiǎn),所以我們需要對(duì)數(shù)據(jù)進(jìn)行加密话瞧。
明文數(shù)據(jù)有時(shí)會(huì)比較大荷荤,不適合使用RSA非對(duì)稱加密算法
,但是數(shù)據(jù)的HASH值是比較小的移稳,用于校驗(yàn)的蕴纳,它完全可以使用RSA來加密。所以在數(shù)據(jù)傳輸時(shí)个粱,我們將明文數(shù)據(jù)加上通過RSA加密的校驗(yàn)數(shù)據(jù)一并傳輸給對(duì)方古毛。這個(gè)通過RSA加密的校驗(yàn)數(shù)據(jù),我們稱之為簽名
都许。
數(shù)字簽名的驗(yàn)證過程
當(dāng)對(duì)方拿到數(shù)據(jù)之后稻薇,如何進(jìn)行驗(yàn)證呢?
首先傳輸數(shù)據(jù)時(shí)會(huì)將原始的數(shù)據(jù)和數(shù)字簽名一起發(fā)送胶征。
對(duì)方拿到數(shù)據(jù)后塞椎,先進(jìn)行校驗(yàn)。拿到原始數(shù)據(jù)睛低,通過同樣的HASH算法得到數(shù)據(jù)的HASH值案狠。然后通過非對(duì)稱加密,將數(shù)字簽名中校驗(yàn)HASH值解密出來钱雷。
最后對(duì)比兩個(gè)HASH值是否一致骂铁,這樣可以很好的判斷數(shù)據(jù)是否被篡改。
代碼簽名
名詞解釋:代碼簽名
是對(duì)可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名罩抗。用來確認(rèn)軟件在簽名后未被修改或損壞的措施拉庵,和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已套蒂。
簡(jiǎn)單的代碼簽名
在iOS出來之前钞支,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運(yùn)行茫蛹,系統(tǒng)安全存在隱患,盜版軟件烁挟,病毒入侵婴洼,靜默安裝等等。蘋果希望解決這樣的問題信夫,保證每一個(gè)安裝到iOS上的App都是經(jīng)過蘋果官方允許的,怎樣保證呢卡啰?就是通過代碼簽名
静稻。
如果要實(shí)現(xiàn)驗(yàn)證,最簡(jiǎn)單的方式就是通過蘋果官方生成非對(duì)稱加密的一對(duì)公私鑰匈辱。在iOS系統(tǒng)中內(nèi)置一個(gè)公鑰振湾,私鑰由蘋果后臺(tái)保存,我們傳App到App Store時(shí)亡脸,蘋果后臺(tái)用私鑰對(duì)App進(jìn)行簽名押搪,iOS系統(tǒng)下載這個(gè)App后,用公鑰驗(yàn)證這個(gè)簽名浅碾,若簽名正確大州,這個(gè)App肯定是由蘋果后臺(tái)認(rèn)證的,并且沒有被修改過垂谢,也就達(dá)到了蘋果的需求:保證安裝的每一個(gè)App都是經(jīng)過蘋果官方允許的厦画。
如果我們iOS設(shè)備安裝App只有App Store這一個(gè)入口,這件事就解決了滥朱。但是實(shí)際上iOS安裝App還有其他渠道根暑,比如對(duì)于iOS開發(fā)者而言,是需要在開發(fā)App時(shí)直接真機(jī)調(diào)試的徙邻。而且蘋果還開放了企業(yè)內(nèi)部分發(fā)的渠道排嫌,企業(yè)證書簽名的App也是需要順利安裝的。
蘋果需要開發(fā)這些方式安裝App缰犁,這些需求就無法通過簡(jiǎn)單的代碼簽名來做到了淳地。
蘋果的需求:
1.安裝包不需要上傳到App Store,可以直接安裝到手機(jī)上帅容。
2.蘋果為了保證系統(tǒng)的安全性薇芝,又必須對(duì)安裝的App有絕對(duì)的控制權(quán)。
3.經(jīng)過蘋果允許才可以安裝丰嘉。
4.不能被濫用導(dǎo)致非開發(fā)App也能被安裝夯到。
為了實(shí)現(xiàn)以上需求,iOS簽名的復(fù)雜度也就開始增加了饮亏,蘋果這里給出的方案是雙層代碼簽名耍贾。
雙層代碼簽名
iOS的雙層代碼簽名流程這里簡(jiǎn)單梳理一下阅爽,這也不是最終的iOS簽名原理。iOS的最終簽名原理在這個(gè)基礎(chǔ)上還要稍微加點(diǎn)東西荐开,文末會(huì)講付翁。
首先這里有兩個(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ù)稱為證書
。
4.在開發(fā)時(shí)避咆,編譯完一個(gè)App后舟肉,用本地的私鑰M(今后你導(dǎo)出的P12)對(duì)這個(gè)App進(jìn)行簽名,同時(shí)把第三步得到的證書一起打包進(jìn)App里查库,安裝到手機(jī)上路媚。
5.在安裝時(shí),iOS系統(tǒng)取得證書樊销,通過系統(tǒng)內(nèi)置的公鑰A整慎,去驗(yàn)證證書的數(shù)字簽名是否正確。
6.驗(yàn)證證書后確保了公鑰M是蘋果認(rèn)證過的围苫,再用公鑰M去驗(yàn)證App的簽名裤园,這里就間接驗(yàn)證了這個(gè)App安裝行為是否經(jīng)過蘋果官方允許。(這里只驗(yàn)證安裝行為剂府,不驗(yàn)證App是否被改動(dòng)拧揽,因?yàn)殚_發(fā)階段App內(nèi)容總是不斷變化的,蘋果不需要管。)
有了上面的過程淤袜,已經(jīng)可以保證開發(fā)者的認(rèn)證痒谴,以及程序的安全性了。但是铡羡,你要知道iOS的程序积蔚,主要渠道是要通過App Store才能分發(fā)到用戶設(shè)備的,如果只有上述的過程烦周,那豈不是只要申請(qǐng)了一個(gè)證書尽爆,就可以安裝到所有的iOS設(shè)備了?所以為了防止濫用读慎,蘋果再加了幾個(gè)限制漱贱。這就是我們后面要講的。