原文發(fā)表在個人博客iOS-簽名機制,轉(zhuǎn)載請注明出處。
本文主要介紹iOS系統(tǒng)的簽名機制和證書原理。
對稱和非對稱加密
對稱加密:加密和解密用的是同一份密鑰。
非對稱加密:加密和解密用的是不同的密鑰,稱為公鑰和私鑰。
iOS 系統(tǒng)采用的均是非對稱加密。
App Store下載的簽名機制
當(dāng) App 提交審核通過后,Apple 會對 App 進行重簽名。因此,從 App Store 下載的 App ,統(tǒng)一都是蘋果的官方簽名。驗證機制也較為簡單。
- Apple 官方保存著私鑰,在App提交審核通過后,會通過私鑰對其進行重簽名;
- iOS 系統(tǒng)內(nèi)置公鑰,用戶從 App Store 下載 App ,iOS 系統(tǒng)通過公鑰對其進行簽名驗證;
- 驗證通過,則說明該 App 是經(jīng)過蘋果認(rèn)證的,未經(jīng)篡改的,允許運行,否則,拒絕運行。
XCode開發(fā)的簽名機制
在 XCode 中開發(fā)時,用的是開發(fā)證書。需要針對不同的開發(fā)者賬號進行驗證,簽名機制較為復(fù)雜。
開發(fā)者身份驗證
在 Apple Developer 生成證書時,為了驗證開發(fā)者身份,需要在本地 keychain 中生成公私鑰,公鑰保存在 CertificateSigningRequest 文件中,上傳到 Apple Developer ,私鑰如果需要給其他開發(fā)者用,可以導(dǎo)出為 .p12 文件。
生成證書
Apple Developer 后臺接收到開發(fā)者公鑰后,利用 Apple 的私鑰對其進行簽名,生成證書cer。
驗證設(shè)備
除了驗證開發(fā)者身份,還需要驗證 AppID 和設(shè)備的 UUID , 權(quán)限控制 Entitlements 等,把這些信息和上面生成的證書一起,再用 Apple 的私鑰進行一次簽名,生成最終的 mobileprovision 文件。
簽名 App
在XCode編譯后,生成 App 文件時,會對其通過開發(fā)者私鑰進行簽名,將 mobileprovision 文件命名為 embedded.mobileprovision 并將其打包到 App 文件中。
在通過開發(fā)者私鑰簽名 App 時,對于可執(zhí)行文件( Mach-O ),會將簽名直接寫入到該文件中,而對于其他的資源文件,會統(tǒng)一寫到 _CodeSignature 文件下的 CodeResources 文件中。
CodeResources 文件的格式:
驗證簽名
在安裝 App 文件時,首先通過 iOS 系統(tǒng)內(nèi)置的 Apple 公鑰對上面的簽名進行驗證,包含開發(fā)者共私鑰匹配,設(shè)備 ID,App ID,權(quán)限控制 Entitlements ,證書有效期驗證等。
看了又看:
深度學(xué)習(xí)是怎么識別人臉的?
300行代碼實現(xiàn)手寫漢字識別
如何在一周內(nèi)做一款拼音輸入法
iOS-線程同步詳解