蘋果App雙向簽名驗證原理

雙向簽名:

手機和蘋果服務器還有開發人員的MAC電腦,他們一共維護着2對公私鑰,利用這兩對公私鑰分別完成雙向簽名與驗證,從而已到達蘋果服務器對蘋果手機裏的appstore的控制權,辨別此app是不是通過受權的。安全


Mac電腦做爲開發者的電腦,本身有一組公私鑰M,而後蘋果服務器本身有一個私鑰A,而後手機端保存了一份蘋果服務器的公鑰A。公鑰加密的文件只有對應的私鑰才能解開,反之私鑰加密的文件只有對應的公鑰才能解開。bash

第一步:從蘋果服務器獲取開發者證書過程

1.Mac先發送本身的公鑰M向服務器,請求證書。

這裏的公鑰M CSR文件從哪來呢?他其實就是咱們要生成證書以前從「鑰匙串訪問>證書助理」獲取的那個文件:
公鑰M.png

這個文件很熟悉吧,這就是MAC端的公鑰M,固然口說無憑,咱們能夠打開看一下。服務器

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
複製代碼

結果以下:


注意這個紅圈的位置,他指定了採用sha256 RSA加密方式。 這就是你與蘋果服務器之間的加密方式。app

2.蘋果下發證書

蘋果拿到公鑰M以後,會採用本身的私鑰A對你的公鑰M和CSR文件裏面的hash值進行加密而後發送給你,這個就是你申請到的開發者證書。
iphone

這裏有個小tip:


爲何請求證書的MAC電腦能夠直接打包編譯,而給另外一臺MAC就必需要給他P12文件才能編譯app? 其實就是由於你給別人P12文件裏面包含了私鑰M,而直接給證書是不包含私鑰M的。就是圖上的那個小鑰匙。

第二步:Mac電腦拿到證書後生成App


生成應用的時候,Mac用本身的私鑰M對咱們的App進行了一次簽名,而後將真正的可執行文件Macho+App的簽名+蘋果下發的證書共同打包生成了咱們的app包,這個就是安裝在手機的上的文件。
固然口說無憑,咱們能夠對app包打開看一下編碼



這裏三個劃紅線的地方分別就是咱們的APP簽名信息、Macho能夠行文件、證書。加密

第三步:驗證App是否有效


1.獲取公鑰M

咱們的iphone利用本身的公鑰A,解開蘋果服務器私鑰A簽名的證書,獲取到裏面的公鑰M。spa

2.利用公鑰M驗證簽名

利用獲得的公鑰M繼續解開Mac電腦私鑰M的App簽名,從而驗證APP是否有效。
這就是蘋果的APP的雙向簽名原理。3d


有了上面那個流程後,看似安全了,但是他真的完美了嗎?其實仍是有一個缺陷的,開發者徹底能夠拿到證書後直接給手機安裝上,這樣作不是就繞開Appstore了嗎,那怎麼才能讓開發者在調試的時候能夠直接安裝在手機上,而發佈的時候必須在Appstore上呢?答案只有一個:描述文件.調試

描述文件


還記得我們在申請證書以後想要成功的真機調試,還有一個重要步驟吧,就是分別配置開發模式、發佈模式的描述文件吧"AAA.mobileprovision".你必需要在描述文件內部指定你的設備號,才能調試你對應的app吧。
描述文件是什麼?其實就是一組權限控制的文件,它裏面記錄了能夠被運行的設備、你的應用的appid、等其餘權限類控制。口說無憑,我這裏打開一個開發者模式的描述文件看一看。

security cms -Di test.mobileprovision 
複製代碼

咱們挑重要的看,它裏面就直接記錄了指定運行的手機設備號、這個證書日期、還有你開發者的相關信息,固然,你不要嘗試着你手動更改他就可以繞過監控,看到那個<key>UIDI<key>了嗎?這個描述文件也自帶一組惟一編碼的,也是會通過效驗的,你想要更改信息,只能從蘋果服務器去申請,他會隨着你xocode打包的時候一塊兒放入App。

簽名信息

1.簽名究竟是什麼?

舉一個小小的例子。你消費了100元,並將此消息發送到服務器執行對應操做。這個時候徹底有可能出現一個第三方截獲這個信息,將100元改成1000元再發給服務器啊。這時候,服務器只要將這個1000元進行一下hash,而後和你發過來的hash比較一下就知道了,由於你發過來的是對100元的hash。
hash是什麼?消息摘要,簽名是什麼?就是對你的app的消息摘要!

2.簽名信息

仍是口說無憑,下面我來看一看。



解壓你的app後這個文件夾裏面就是你的簽名,裏面記錄的是對你的資源類文件的簽名:好比圖片、音視頻等。



找到你的macho文件,瀏覽一下,紅圈的位置就是你二進制文件的消息簽名。有了這兩組簽名,就保證了資源和二進制文件的一致性。 這就是咱們常說的簽名。

相關文章
相關標籤/搜索