手機和蘋果服務器還有開發人員的MAC電腦,他們一共維護着2對公私鑰,利用這兩對公私鑰分別完成雙向簽名與驗證,從而已到達蘋果服務器對蘋果手機裏的appstore的控制權,辨別此app是不是通過受權的。安全
Mac電腦做爲開發者的電腦,本身有一組公私鑰M,而後蘋果服務器本身有一個私鑰A,而後手機端保存了一份蘋果服務器的公鑰A。公鑰加密的文件只有對應的私鑰才能解開,反之私鑰加密的文件只有對應的公鑰才能解開。bash
這個文件很熟悉吧,這就是MAC端的公鑰M,固然口說無憑,咱們能夠打開看一下。服務器
openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
複製代碼
結果以下:
注意這個紅圈的位置,他指定了採用sha256 RSA加密方式。 這就是你與蘋果服務器之間的加密方式。app
蘋果拿到公鑰M以後,會採用本身的私鑰A對你的公鑰M和CSR文件裏面的hash值進行加密而後發送給你,這個就是你申請到的開發者證書。
iphone
生成應用的時候,Mac用本身的私鑰M對咱們的App進行了一次簽名,而後將真正的可執行文件Macho+App的簽名+蘋果下發的證書共同打包生成了咱們的app包,這個就是安裝在手機的上的文件。
固然口說無憑,咱們能夠對app包打開看一下編碼
這裏三個劃紅線的地方分別就是咱們的APP簽名信息、Macho能夠行文件、證書。加密
咱們的iphone利用本身的公鑰A,解開蘋果服務器私鑰A簽名的證書,獲取到裏面的公鑰M。spa
利用獲得的公鑰M繼續解開Mac電腦私鑰M的App簽名,從而驗證APP是否有效。
這就是蘋果的APP的雙向簽名原理。3d
有了上面那個流程後,看似安全了,但是他真的完美了嗎?其實仍是有一個缺陷的,開發者徹底能夠拿到證書後直接給手機安裝上,這樣作不是就繞開Appstore了嗎,那怎麼才能讓開發者在調試的時候能夠直接安裝在手機上,而發佈的時候必須在Appstore上呢?答案只有一個:描述文件.調試
還記得我們在申請證書以後想要成功的真機調試,還有一個重要步驟吧,就是分別配置開發模式、發佈模式的描述文件吧"AAA.mobileprovision".你必需要在描述文件內部指定你的設備號,才能調試你對應的app吧。
描述文件是什麼?其實就是一組權限控制的文件,它裏面記錄了能夠被運行的設備、你的應用的appid、等其餘權限類控制。口說無憑,我這裏打開一個開發者模式的描述文件看一看。
security cms -Di test.mobileprovision
複製代碼
咱們挑重要的看,它裏面就直接記錄了指定運行的手機設備號、這個證書日期、還有你開發者的相關信息,固然,你不要嘗試着你手動更改他就可以繞過監控,看到那個<key>UIDI<key>了嗎?這個描述文件也自帶一組惟一編碼的,也是會通過效驗的,你想要更改信息,只能從蘋果服務器去申請,他會隨着你xocode打包的時候一塊兒放入App。
舉一個小小的例子。你消費了100元,並將此消息發送到服務器執行對應操做。這個時候徹底有可能出現一個第三方截獲這個信息,將100元改成1000元再發給服務器啊。這時候,服務器只要將這個1000元進行一下hash,而後和你發過來的hash比較一下就知道了,由於你發過來的是對100元的hash。
hash是什麼?消息摘要,簽名是什麼?就是對你的app的消息摘要!
仍是口說無憑,下面我來看一看。
解壓你的app後這個文件夾裏面就是你的簽名,裏面記錄的是對你的資源類文件的簽名:好比圖片、音視頻等。
找到你的macho文件,瀏覽一下,紅圈的位置就是你二進制文件的消息簽名。有了這兩組簽名,就保證了資源和二進制文件的一致性。 這就是咱們常說的簽名。