ios簽名
iOS 企業證書測試的具體原理分析
現在知道了有非對稱加密這東西那數字簽名是怎么回事呢
數字簽名的作用是我對某一份數據打個標記表示我認可了這份數據簽了個名然后我發送給其他人其他人可以知道這份數據是經過我認證的數據沒有被篡改過。
有了上述非對稱加密算法就可以實現這個需求
首先用一種算法算出原始數據的摘要。需滿足 a.若原始數據有任何變化計算出來的摘要值都會變化。 b.摘要要夠短。這里最常用的算法是MD5。
生成一份非對稱加密的公鑰和私鑰私鑰我自己拿著公鑰公布出去。
對一份數據算出摘要后用私鑰加密這個摘要得到一份加密后的數據稱為原始數據的簽名。把它跟原始數據一起發送給用戶。
用戶收到數據和簽名后用公鑰解密得到摘要。同時用戶用同樣的算法計算原始數據的摘要對比這里計算出來的摘要和用公鑰解密簽名得到的摘要是否相等若相等則表示這份數據中途沒有被篡改過因為如果篡改過摘要會變化。
之所以要有第一步計算摘要是因為非對稱加密的原理限制可加密的內容不能太大不能大于上述 n 的位數也就是一般不能大于 1024 位 / 2048 位于是若要對任意大的數據簽名就需要改成對它的特征值簽名效果是一樣的。
好了有了非對稱加密的基礎知道了數字簽名是什么怎樣可以保證一份數據是經過某個地方認證的來看看怎樣通過數字簽名的機制保證每一個安裝到 iOS 上的 APP 都是經過蘋果認證允許的。
如果我們 iOS 設備安裝 APP 只有從 AppStore 下載這一種方式的線c;這件事就結束了沒有任何復雜的東西只有一個數字簽名非常簡單地解決問題。
蘋果要對用這三種方式安裝的 App 進行控制就有了新的需求無法像上面這樣簡單了。
蘋果這里給出的方案是使用了雙層簽名會比較繞流程大概是這樣的
上述流程只解決了上面第一個需求也就是需要經過蘋果允許才可以安裝還未解決第二個避免被濫用的問題。怎么解決呢蘋果再加了兩個限制一是限制在蘋果后臺注冊過的設備才可以安裝二是限制簽名只能針對某一個具體的 APP。
怎么加的在上述第三步蘋果用私鑰 A 簽名我們本地公鑰 L 時實際上除了簽名公鑰 L還可以加上無限多數據這些數據都可以保證是經過蘋果官方認證的不會有被篡改的可能。
可以想到把 允許安裝的設備 ID 列表 和 App對應的 AppID 等數據都在第三步這里跟公鑰L一起組成證書再用蘋果私鑰 A 對這個證書簽名。在最后第 5 步驗證時就可以拿到設備 ID 列表判斷當前設備是否符合要求。根據數字簽名的原理只要數字簽名通過驗證第 5 步這里的設備 IDs / AppID / 公鑰 L 就都是經過蘋果認證的無法被修改蘋果就可以限制可安裝的設備和 APP避免濫用。
實際上一個“證書”本來就有規定的格式規范上面我們把各種額外信息塞入證書里是不合適的于是蘋果另外搞了個東西叫 Provisioning Profile一個 Provisioning Profile 里就包含了證書以及上述提到的所有額外信息以及所有信息的簽名。
因為步驟有小變動這里我們不辭啰嗦重新再列一遍整個流程
開發者證書從簽名到認證最終蘋果采用的流程大致是這樣還有一些細節像證書有效期/證書類型等就不細說了。
第 6 – 7 步的打包和驗證都是 Xcode 和 iOS 系統自動做的事。
前面以開發包為例子說了簽名和驗證的流程另外兩種方式 In-House 企業簽名和 AD-Hoc 流程也是差不多的只是企業簽名不限制安裝的設備數另外需要用戶在 iOS 系統設置上手動點擊信任這個企業才能通過驗證。
而 AppStore 的簽名驗證方式有些不一樣前面我們說到最簡單的簽名方式蘋果在后臺直接用私鑰簽名 App 就可以了實際上蘋果確實是這樣做的如果去下載一個 AppStore 的安裝包會發現它里面是沒有 embedded.mobileprovision 文件的也就是它安裝和啟動的流程是不依賴這個文件驗證流程也就跟上述幾種類型不一樣了。
到這里 iOS 簽名機制的原理和主流程大致說完了希望能對理解蘋果簽名和排查日常簽名問題有所幫助。
企業證書簽名因為限制少小飛魚 /等測試平臺都是通過企業證書分發國內一些市場像 PP 助手愛思助手一部分安裝手段也是通過企業證書重簽名。通過企業證書簽名安裝的 App啟動時都會驗證證書的有效期并且不定期請求蘋果服務器看證書是否被吊銷若已過期或被吊銷就會無法啟動 App。
另一個問題是我們把 App 傳上 AppStore 后蘋果會對 App 進行加密導致 App 體積增大不少這個加密實際上是沒卵用的只是讓破解的人要多做一個步驟運行 App 去內存 dump 出可執行文件而已無論怎樣加密都可以用這種方式拿出加密前的可執行文件。所以為什么要做這樣的加密呢想不到有什么好處。
能想到的一個原因是 Provisioning Profile 在非 AppStore 安裝時會打包進安裝包第三方拿到這個 Provisioning Profile 文件就能直接用起來給他自己的 App 簽名了。但這種問題也挺好解決只需要打包時去掉文件里的私鑰就行了所以仍不明白為什么這樣設計。