iOS App簽名原理
在學習iOS簽名以前,須要對密碼學有必定的瞭解,好比RSA加密、HASH哈希函數
參考:https://www.jianshu.com/p/003288dfb3b7ios
1、簡單的簽名原理:
-
目的:服務器
-
背景:由於手機和系統都是蘋果公司生產的,因此蘋果公司能夠在手機上內置公鑰,而後在App Store上放置私鑰app
-
原理:
1.App上傳到App Store時,蘋果公司拿到App的HASH(MD5,SHA等)值,而後用私鑰進行加密(簽名),這時候只有手機上的公鑰才能夠解密;
2.手機下載應用安裝App時,先用公鑰解密(驗證簽名),拿到HASH值,而後將此HASH值,與要安裝的App的HASH值進行校驗,若是App有被修改過,則校驗失敗。這樣就能夠有效的保證每一個App都是通過蘋果公司官方認證的。ide
弊端:
這樣的作法,須要全部的App上傳App Store,才能在手機上安裝使用,那麼當開發者要用真機調試時,則必須將開發階段的App上傳App Store,才能調試;另外企業帳號的App並不用上傳到App Store就能安裝使用。這樣的作法明顯不合理,因此蘋果公司在此基礎上再作修改。函數
簽名原理圖1:
![image.png](http://static.javashuo.com/static/loading.gif)
2、進階的簽名原理:
*目的:學習
- 沒上傳App Store的應用,要通過蘋果的容許才能安裝
- 背景:
- mac電腦:私鑰M和公鑰M(電腦生成)
- 蘋果服務器:私鑰A
- iPhone手機:公鑰A
- 原理:
1.mac電腦將公鑰M(生成的CSR文件)和開發者信息傳到蘋果服務器,這個過程叫作申請證書
2.蘋果服務器對公鑰M進行加密(用私鑰A來加密),生成證書文件(包含公鑰M和公鑰M的HASH值),發送給mac電腦安裝證書,存在本地鑰匙串
3.蘋果電腦安裝App到手機時,作了一件事情:用私鑰M對App的HASH值進行加密(簽名) ,這時的APP內部實際包含了APP的簽名(私鑰M加密App的HASH值)、第2步生成的證書文件(包含公鑰M和公鑰M的HASH值),App可執行文件以及其餘信息
4.兩次解密過程:
4.1. iPhone手機拿到證書文件(包含公鑰M和公鑰M的HASH值),由於手機裏有公鑰A,因此能解密證書文件,獲得公鑰M和公鑰M的HASH值,先驗證公鑰M生成的HASH值(MD5,SHA等)是否是和證書文件裏的公鑰M的HASH值一致,確保證書沒有被修改;
4.2. 驗證一致後,就能夠用公鑰M來解密第2步的APP的簽名,一樣道理能夠驗證App是否被修改過。 由於在開發階段App會常常修改,因此App就算是修改過,也能安裝。第4步主要是驗證證書是否是蘋果認證的,只要證書對就能夠安裝運行。
這種方式可以保證安裝的App是通過蘋果容許的,可是還有弊端。
弊端:
只要申請一個證書,就能夠安裝在全部的iOS設備。加密
簽名原理圖2:
![IMG_2817.JPG](http://static.javashuo.com/static/loading.gif)
3、終極的簽名原理:
*目的:3d
- 不能濫用安裝
- 背景:
- mac電腦:私鑰M和公鑰M(電腦生成)
- 蘋果服務器:私鑰A
- iPhone手機:公鑰A
- 原理:
加了兩個限制:
第一個:須要在蘋果服務器註冊過的設備才能安裝,證書對應的是有設備的(UUID)
第二個:簽名只能針對某一個App,而且還須要UUID、AppID、推送,後臺運行等權力描述信息,蘋果公司把這些權限統一輩子成一個文件,稱爲權限文件,專門用來描述App簽名的權限,並最生成Provision Profile(描述文件):包含設備IDs,AppID,Entitlements(權力文件包含是否可調試,推送,後臺運行等信息)。
1.在進階的簽名原理中的第2步,證書文件(包含公鑰M和公鑰M的HASH值)和Provision Profile(描述文件)傳給發送給mac電腦;
2.在進階的簽名原理中的第3步,Provision Profile(描述文件)也會和證書文件一塊兒打包進去 。調試
查看Provision Profile信息:code
cd ~/Library/MobileDevice/Provisioning\ Profiles/
ls
![image.png](http://static.javashuo.com/static/loading.gif)
打開文件夾:
open .
![image.png](http://static.javashuo.com/static/loading.gif)
在該目錄下用終端查看:
security cms -D -i 0ae1aea3-6094-5dc4dc867596.mobileprovision
![image.png](http://static.javashuo.com/static/loading.gif)
![image.png](http://static.javashuo.com/static/loading.gif)
其中包含了一些重要信息:
- TeamName
- AppIDName
- ProvisionedDevices 設備
- UUID 描述文件自己的UUID
- Entitlements:
- get-task-allow 是否能夠調試
- com.apple.developer.team-identifier
簽名原理圖3
![image.png](http://static.javashuo.com/static/loading.gif)