首先說明這篇文章沒有什么特別的東西,只是盡量用最簡單的邏輯來說明一下自己對ios簽名機(jī)制的理解.
簽名機(jī)制的意義
安全.蘋果為了對App的環(huán)境有絕對的控制權(quán),只有被蘋果認(rèn)可的應(yīng)用才可以安裝到手機(jī)上.可以避免應(yīng)用被篡改,以及盜版應(yīng)用的暢行,保護(hù)了開發(fā)者的利益.
原理:非對稱加密算法
非對稱加密算法是iOS的基礎(chǔ),它使用兩份密鑰(公鑰,私鑰)來對信息進(jìn)行加密以及解密:對外公開的為公鑰,簽名放自己持有的密鑰為私鑰,通過私鑰加密的內(nèi)容只能公鑰解密,而通過公鑰加密的內(nèi)容只有私鑰能夠解密.由于公鑰反推私鑰難度非常大,理論上只要密鑰的位數(shù)足夠長,反推基本是不可能的,所以非對稱機(jī)密算法是被廣泛使用的安全性非常高的加密算法.
Hash算法
由于非對稱加密算法對明文的長度有要求,既不能超過密鑰的長度,所以在使用非對稱加密算法之前,會使用hash算法對明文進(jìn)行處理
Appstore 對簽名的驗證邏輯
1.png
圖1
1,首先使用Hash算法對App數(shù)據(jù)進(jìn)行處理得到摘要
2,用私鑰對摘要進(jìn)行加密,得到簽名
圖2
首先要說明兩點(diǎn)
1,每臺iphone設(shè)備應(yīng)該都有蘋果特有的公鑰
2,每個通過App Store下載的應(yīng)用都會帶有蘋果通過私鑰的簽名
接下來說一下圖2的邏輯:
1,使用相同的hash算法對下載的到用戶手機(jī)的App進(jìn)行處理得到摘要1
2,使用App公鑰對簽名進(jìn)行解密,得到摘要2
3,判斷摘要1和2是否相等,如果相等那么認(rèn)證成功.否者安裝失敗
開發(fā)者
以上流程可以滿足一個普通用戶的需求,但是無法滿足開發(fā)者的需求.因為開發(fā)者為了調(diào)試需要無數(shù)次的安裝app,如果每次都需要上傳蘋果簽名,大家會瘋的!!!!!所以蘋果為開發(fā)者建立了本地簽名系統(tǒng).
開發(fā)者會在自己的電腦上生成用于簽名認(rèn)證的公鑰和私鑰洪燥,以后安裝 app 到手機(jī)上時會在本地進(jìn)行認(rèn)證梆靖,而無需將 app 上傳到蘋果的服務(wù)器上簽名抖格。但是蘋果也必須要維護(hù)自己控制 app 安裝的權(quán)利汞幢,那么蘋果會怎么做呢?答案就是使用數(shù)字證書质帅。
證書
開發(fā)者通過 鑰匙串訪問->證書助理->從證書頒發(fā)機(jī)構(gòu)請求證書 生成 Certificate Signing Request 文件(CSR 文件)想鹰,同時也在本地自動生成了相應(yīng)的公鑰和私鑰欲低,在填好必要的信息后,開發(fā)者將 CSR 文件上傳給蘋果用于生成數(shù)字證書韭畸。
CSR 文件記錄了開發(fā)者的個人信息宇智、公鑰蔓搞、加密算法以及 Hash 算法等內(nèi)容,可以使用以下命令來查看文件內(nèi)容:
openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
蘋果收到 CSR 文件后随橘,會使用自己的私鑰對開發(fā)者的公鑰進(jìn)行簽名喂分,最終生成一個數(shù)字證書(包含開發(fā)者賬號信息、公鑰以及相應(yīng)的簽名)返回給開發(fā)者机蔗,查看證書信息的命令如下
openssl x509 -inform der -in ios_development.cer -noout -text
點(diǎn)擊安裝證書后蒲祈,鑰匙串會自動將證書和相應(yīng)的私鑰對應(yīng)起來,同時你還需要在 Xcode 中將簽名證書設(shè)置為你剛剛安裝的證書萝嘁。此后在編譯完 app 時梆掸,系統(tǒng)會使用數(shù)字證書對應(yīng)的本地私鑰對 app 進(jìn)行簽名,然后同數(shù)字證書一起安裝到手機(jī)上牙言,接下來 iOS 設(shè)備會通過 Apple 公鑰來驗證數(shù)字證書是否有效酸钦,驗證通過后會使用數(shù)字證書中的公鑰來驗證 app 是否有效,最終判斷 app 是否可以被安裝
Provisioning Profile
僅有數(shù)字證書是不夠的嬉挡,為了防止權(quán)限被濫用钝鸽,開發(fā)者還需要在蘋果官網(wǎng)上注冊用于開發(fā)的設(shè)備,僅有注冊后的設(shè)備才被允許按照以上流程安裝 app,官方限制最多100臺.
除此之外庞钢,蘋果還需要對 app 的權(quán)限進(jìn)行控制拔恰,例如是否能夠使用 iCloud、Wallet基括、Maps 等颜懊,蘋果將這些功能授權(quán)統(tǒng)稱為 Entitlements。開發(fā)者將上述權(quán)限配置完成后风皿,需要從蘋果后臺下載并安裝相應(yīng)的 mobileprovision 文件河爹,該文件包含:
1,AppId
2,功能授權(quán)列表
3,已注冊的設(shè)備列表
4,數(shù)字證書
5,蘋果簽名
當(dāng)然,如果有需要的話桐款,你可以使用以下命令來查看 mobileprovision 文件內(nèi)容
security cms -D -i embedded.mobileprovision
圖3
1.開發(fā)者在本地生成公鑰和私鑰,然后把公鑰上傳給蘋果并獲取數(shù)字證書
2,開發(fā)者在后臺配置Appid,開發(fā)設(shè)備,功能權(quán)限,最后下載描述文件
3,開發(fā)者用本地私鑰簽名app,并將描述文件隨app安裝到ios設(shè)備
4,iOS 設(shè)備使用 Apple 公鑰驗證 mobileprovision 文件的簽名以及數(shù)字證書的簽名
5,使用數(shù)字證書包含的公鑰來驗證 app 的簽名
6,驗證安裝 app 的設(shè)備是否在設(shè)備列表中咸这,AppId 是否一致,Entitlements 和 app 中的權(quán)限是否對的上等等