iOS簽名機(jī)制『理解指南』

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)幫你完成以上的步驟而已。

為什么需要這么繁瑣的步驟?

為了安全!
如何保障安全? --通過應(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)證流程就反推回去

參考拓展資料

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

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

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