iOS應用簽名(上)

關於iOS應用簽名我想一塊兒探討一下它的原理.首先咱們須要瞭解一個東西,叫作數字簽名git

數字簽名(digitally signed)

名詞解釋:爲何用簽名這個詞.由於老外喜歡用支票,支票上面的簽名可以證實這玩意是你的.那麼數字簽名顧名思義,就是用於鑑別數字信息的方法.算法

接下來咱們思考一下.想要證實數字信息(也就是二進制數據,計算機裏面的任意數據)的有效性,那麼使用什麼方式最合適呢? 咱們能夠想到有"信息指紋"之稱的HASH算法,在以前的文章中有講到HASH算法專門用來作文件數據的識別.那麼在網絡數據傳遞的過程當中,咱們能夠將明文數據,和數據的HASH值一塊兒傳遞給對方.對方能夠拿出HASH值來進行驗證. 可是在這個過程當中,如何作到數據的保護呢?明文數據和HASH值若是直接傳遞就有都被篡改的風險.因此這裏咱們要對數據進行加密.明文數據有時會比較大,不適合使用RSA非對稱加密算法,那麼數據的HASH值是比較小的.這個數據是用於校驗的,它徹底可使用RSA來加密.因此在數據傳遞的時候,咱們將明文數據加上經過RSA加密的校驗數據一併傳遞給對方.那麼這個經過RSA加密的校驗數據,咱們稱之爲簽名.安全

數字簽名的驗證過程 當對方拿到數據以後,如何進行驗證呢?網絡

  • 首先傳遞數據時會將原始的數據和數字簽名一塊兒發送
  • 對方拿到數據後,先進行校驗.拿到原始數據,經過一樣的HASH算法獲得數據的HASH值.
  • 而後經過非對稱加密,將數字簽名中的校驗HASH值解密出來.
  • 最後對比兩個HASH值是否一致.這樣能夠很好的判斷數據是否被篡改!

代碼簽名(Code signing)加密

名稱解釋:代碼簽名是對可執行文件或腳本進行數字簽名.用來確認軟件在簽名後未被修改或損壞的措施。和數字簽名原理同樣,只不過簽名的數據是代碼而已.操作系統

簡單的代碼簽名3d

在iOS出來以前,之前的主流操做系統(Mac/Windows)軟件隨便從哪裏下載都能運行,系統安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等.那麼蘋果但願解決這樣的問題,要保證每個安裝到 iOS 上的 APP 都是通過蘋果官方容許的,怎樣保證呢?就是經過代碼簽名調試

若是要實現驗證.其實最簡單的方式就是經過蘋果官方生成非對稱加密的一對公私鑰.在iOS的系統中內置一個公鑰,私鑰由蘋果後臺保存,咱們傳APP到AppStore時,蘋果後臺用私鑰對APP數據進行簽名,iOS系統下載這個APP後,用公鑰驗證這個簽名,若簽名正確,這個APP確定是由蘋果後臺認證的,而且沒有被修改過,也就達到了蘋果的需求:保證安裝的每個APP都是通過蘋果官方容許的.code

若是咱們iOS設備安裝APP只從App Store這一個入口這件事就簡單解決了,沒有任何複雜的東西,一個數字簽名搞定.可是實際上iOS安裝APP還有其餘渠道.好比對於咱們開發者iOSER而言,咱們是須要在開發APP時直接真機調試的.並且蘋果還開放了企業內部分發的渠道,企業證書籤名的APP也是須要順利安裝的.cdn

蘋果須要開放這些方式安裝APP,這些需求就沒法經過簡單的代碼簽名來辦到了.那麼咱們來分析一下,它有些什麼需求.

  • 安裝包不須要上傳到App Store,能夠直接安裝到手機上.
  • 蘋果爲了保證系統的安全性,又必須對安裝的APP有絕對的控制權
  • 通過蘋果容許才能夠安裝
  • 不能被濫用致使非開發APP也能被安裝

爲了實現這些需求,iOS簽名的複雜度也就開始增長了,蘋果這裏給出的方案是雙層簽名.

iOS的雙層代碼簽名

iOS的雙層代碼簽名流程這裏簡單梳理一下,這也不是最終的iOS簽名原理.iOS的最終簽名在這個基礎上還要稍微加點東西,文末會講. 首先這裏有兩個角色.一個是iOS系統 還有一個就是咱們的Mac系統.由於iOS的APP開發環境在Mac系統下.因此這個依賴關係成爲了蘋果雙層簽名的基礎.

  • 在Mac系統中生成非對稱加密算法的一對公鑰\私鑰(你的Xcode幫你代辦了).這裏稱爲公鑰M 私鑰M . M = Mac

  • 蘋果本身有固定的一對公私鑰,跟以前App Store原理同樣,私鑰在蘋果後臺,公鑰在每一個iOS系統中.這裏稱爲公鑰A , 私鑰A. A=Apple

  • 把公鑰M 以及一些你開發者的信息,傳到蘋果後臺(這個就是CSR文件),用蘋果後臺裏的私鑰 A 去簽名公鑰M。獲得一份數據包含了公鑰M 以及其簽名,把這份數據稱爲證書。

  • 在開發時,編譯完一個 APP 後,用本地的私鑰 M(從此你導出的P12) 對這個 APP 進行簽名,同時把第三步獲得的證書一塊兒打包進 APP 裏,安裝到手機上。

  • 在安裝時,iOS 系統取得證書,經過系統內置的公鑰 A,去驗證證書的數字簽名是否正確。

  • 驗證證書後確保了公鑰 M 是蘋果認證過的,再用公鑰 M 去驗證 APP 的簽名,這裏就間接驗證了這個 APP 安裝行爲是否通過蘋果官方容許。(這裏只驗證安裝行爲,不驗證APP 是否被改動,由於開發階段 APP 內容老是不斷變化的,蘋果不須要管。)

有了上面的過程,已經能夠保證開發者的認證,和程序的安全性了。 可是,你要知道iOS的程序,主要渠道是要經過APP Store才能分發到用戶設備的,若是隻有上述的過程,那豈不是隻要申請了一個證書,就能夠安裝到全部iOS設備了?那麼爲了防止濫用,蘋果再加了幾個限制.咱們下篇文章再詳細闡述.

原文地址:

相關文章
相關標籤/搜索