Xcode7之前進(jìn)行真機(jī)調(diào)試需要進(jìn)行以下繁瑣步驟:
1.生成CertificateSigningRequest.certSigningRequest文件
2.獲得ios_development.cer\ios_distribution.cer證書文件
3.注冊(cè)device、添加App ID
4.獲得*.mobileprovision文件
注意:Xcode7以后也是需要這些繁瑣步驟的,只是如果你勾選了[Automatically manage signing],Xcode會(huì)自動(dòng)幫你完成以上的步驟而已。
- 具體操作參考以下鏈接:
http://www.itdecent.cn/p/be0267ebd238
為什么需要這么繁瑣的步驟?
為了安全!
如何保障安全? --通過應(yīng)用代碼簽名機(jī)制和沙盒機(jī)制

應(yīng)用代碼簽名(App code signing)


『iOS 內(nèi)核啟動(dòng)后, 它將控制哪些用戶進(jìn)程和應(yīng)用可以運(yùn)行。 為確保所有應(yīng)用均來自批準(zhǔn)的
已知來源并且未被篡改, iOS 要求所有可執(zhí)行代碼均使用Apple頒發(fā)的證書進(jìn)行簽名。
設(shè)備附帶的應(yīng)用(如 “郵件” 和 Safari 瀏覽器)由Apple簽名。 第三方應(yīng)用也必須使用
Apple頒發(fā)的證書進(jìn)行驗(yàn)證和簽名。 強(qiáng)制性代碼簽名將信任鏈的概念從操作系統(tǒng)擴(kuò)展至
應(yīng)用, 防止了第三方應(yīng)用加載未簽名的代碼資源,或使用自修改代碼。
······
與其他移動(dòng)平臺(tái)不同, iOS 不允許用戶安裝來自網(wǎng)站的潛在惡意未簽名應(yīng)用或者運(yùn)行不受信任的代碼。運(yùn)行時(shí),會(huì)在加載所有可執(zhí)行內(nèi)存頁時(shí)對(duì)這些內(nèi)存頁進(jìn)行代碼簽名檢查,以確保應(yīng)用自安裝或上次更新之后未被修改過?!?br> —— 引用自《iOS_Security_Guide》第18頁
-
我們可以從上文中提取到三個(gè)概念:① 確保代碼未被篡改(注意這里不是防篡改)、② 簽名、③ 證書
-
如何確保代碼未被篡改?
散列函數(shù)(英語:Hash function)又稱散列算法、哈希函數(shù),是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來?!米浴毒S基百科》
- 理解:通過單向散列函數(shù)(One-way hash function),可以算出原始數(shù)據(jù)唯一的摘要(也可以理解為指紋),這個(gè)摘要(散列值)是跟原始數(shù)據(jù)是相對(duì)應(yīng)的,如果數(shù)據(jù)有任何微小改動(dòng),算出來的摘要值都是不相同的。這樣到你拿到數(shù)據(jù)后,再算一遍散列值,通過對(duì)比原始數(shù)據(jù)的散列值,就可以校驗(yàn)出數(shù)據(jù)的完整性以及是否被篡改過。常用的單向散列函數(shù)算法有MD5,SHA-1,SHA-2。
-
什么是簽名?
數(shù)字簽名(又稱公鑰數(shù)字簽名,英語:Digital Signature)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實(shí)現(xiàn),用于鑒別數(shù)字信息的方法。 ——引用自《維基百科》
- 理解:消息發(fā)送者利用公鑰密碼算法中的私鑰對(duì)代碼的摘要生成簽名,意思就是對(duì)這段摘要認(rèn)可,消息接收者利用公鑰對(duì)簽名進(jìn)行驗(yàn)證,解密出來消息的摘要(散列值)如果對(duì)等的話就證明這個(gè)消息是沒有被篡改過。
- 注意:數(shù)字簽名的作用僅僅是為了識(shí)別內(nèi)容有沒有被篡改過,而不是為了保證機(jī)密性。
-
什么是證書?
公開密鑰認(rèn)證(英語:Public key certificate),又稱公開密鑰證書、公鑰證書、數(shù)字證書(digital certificate)、數(shù)字認(rèn)證、身份證書(identity certificate)、電子證書或安全證書,是用于公開密鑰基礎(chǔ)建設(shè)的電子文件,用來證明公開密鑰擁有者的身份。 ——引用自《維基百科》
- 理解:因?yàn)閿?shù)字簽名有個(gè)無法解決的問題“中間人攻擊”,證書就是為了解決這個(gè)問題。
-
iOS APP簽名流程
-
iOS APP的簽名其實(shí)分為兩種,一種是真機(jī)調(diào)試,另一種是上傳到App Store。這里較為復(fù)雜的是真機(jī)調(diào)試,采用的是雙層簽名。
-
從AppStore下載的應(yīng)用簽名驗(yàn)證流程(下圖引用自http://blog.cnbang.net/tech/3386/)
- 步驟簡介:
- 1.每臺(tái)iOS設(shè)備保存公鑰,Apple后臺(tái)保存私鑰;
- 2.APP上傳至AppStore,蘋果利用后臺(tái)的私鑰對(duì)APP源文件的摘要(散列值)進(jìn)行簽名;
- 3.iOS設(shè)備從AppStore下載應(yīng)用,每次啟動(dòng)的時(shí)候進(jìn)行代碼簽名檢查。
- 步驟簡介:
-
真機(jī)調(diào)試的簽名認(rèn)證流程(下圖引用自http://blog.cnbang.net/tech/3386/)
- 前提條件:
- 真機(jī)調(diào)試不需要把APP源文件上傳至Apple后臺(tái),但也希望通過Apple的驗(yàn)證才能裝到設(shè)備上
- 步驟簡介:
- 1.MacBook生成了一把公鑰和私鑰;
- 2.寫好的APP源文件通過MacBook的私鑰進(jìn)行簽名;
- 3.通過CA(這里的CA就是蘋果)對(duì)MacBook的公鑰進(jìn)行簽名認(rèn)證 => 生成簽名證書;
- 4.再配置好appID、devicesID、entitlements(各種權(quán)限);
- 5.簽名證書與配置打包,蘋果再使用私鑰進(jìn)行一次簽名,生成.mobileprovision文件;
- 6.打包出來的ipa包就包含了以上文件(Mach-O、mobileprovision、資源文件);
- 7.驗(yàn)證流程就反推回去
- 前提條件:
-
參考拓展資料
- http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
- http://blog.cnbang.net/tech/3386/
- https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB
- https://developer.apple.com/support/code-signing/
- https://developer.apple.com/library/content/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

