iOS App簽名原理
在學(xué)習(xí)iOS簽名之前,需要對(duì)密碼學(xué)有一定的了解,比如RSA加密、HASH哈希函數(shù)
參考:http://m.itdecent.cn/p/003288dfb3b7
一、簡(jiǎn)單的簽名原理:
-
目的:
- 保證每個(gè)App都是經(jīng)過(guò)蘋(píng)果公司官方認(rèn)證的
-
背景:因?yàn)槭謾C(jī)和系統(tǒng)都是蘋(píng)果公司生產(chǎn)的,所以蘋(píng)果公司可以在手機(jī)上內(nèi)置公鑰,然后在App Store上放置私鑰
- 蘋(píng)果手機(jī):公鑰
- App Store:私鑰
原理:
1.App上傳到App Store時(shí),蘋(píng)果公司拿到App的HASH(MD5,SHA等)值,然后用私鑰進(jìn)行加密(簽名),這時(shí)候只有手機(jī)上的公鑰才可以解密;
2.手機(jī)下載應(yīng)用安裝App時(shí),先用公鑰解密(驗(yàn)證簽名),拿到HASH值,然后將此HASH值,與要安裝的App的HASH值進(jìn)行校驗(yàn),如果App有被修改過(guò),則校驗(yàn)失敗。這樣就可以有效的保證每個(gè)App都是經(jīng)過(guò)蘋(píng)果公司官方認(rèn)證的。
弊端:
這樣的做法,需要所有的App上傳App Store,才能在手機(jī)上安裝使用,那么當(dāng)開(kāi)發(fā)者要用真機(jī)調(diào)試時(shí),則必須將開(kāi)發(fā)階段的App上傳App Store,才能調(diào)試;另外企業(yè)賬號(hào)的App并不用上傳到App Store就能安裝使用。這樣的做法明顯不合理,所以蘋(píng)果公司在此基礎(chǔ)上再做修改。
簽名原理圖1:

二、進(jìn)階的簽名原理:
*目的:
- 沒(méi)上傳App Store的應(yīng)用,要經(jīng)過(guò)蘋(píng)果的允許才能安裝
- 背景:
- mac電腦:私鑰M和公鑰M(電腦生成)
- 蘋(píng)果服務(wù)器:私鑰A
- iPhone手機(jī):公鑰A
- 原理:
1.mac電腦將公鑰M(生成的CSR文件)和開(kāi)發(fā)者信息傳到蘋(píng)果服務(wù)器,這個(gè)過(guò)程叫做申請(qǐng)證書(shū)
2.蘋(píng)果服務(wù)器對(duì)公鑰M進(jìn)行加密(用私鑰A來(lái)加密),生成證書(shū)文件(包含公鑰M和公鑰M的HASH值),發(fā)送給mac電腦安裝證書(shū),存在本地鑰匙串
3.蘋(píng)果電腦安裝App到手機(jī)時(shí),做了一件事情:用私鑰M對(duì)App的HASH值進(jìn)行加密(簽名) ,這時(shí)的APP內(nèi)部實(shí)際包含了APP的簽名(私鑰M加密App的HASH值)、第2步生成的證書(shū)文件(包含公鑰M和公鑰M的HASH值),App可執(zhí)行文件以及其他信息
4.兩次解密過(guò)程:
4.1. iPhone手機(jī)拿到證書(shū)文件(包含公鑰M和公鑰M的HASH值),因?yàn)槭謾C(jī)里有公鑰A,所以能解密證書(shū)文件,得到公鑰M和公鑰M的HASH值,先驗(yàn)證公鑰M生成的HASH值(MD5,SHA等)是不是和證書(shū)文件里的公鑰M的HASH值一致,確保證書(shū)沒(méi)有被修改;
4.2. 驗(yàn)證一致后,就可以用公鑰M來(lái)解密第2步的APP的簽名,同樣道理可以驗(yàn)證App是否被修改過(guò)。 因?yàn)樵陂_(kāi)發(fā)階段App會(huì)經(jīng)常修改,所以App就算是修改過(guò),也能安裝。第4步主要是驗(yàn)證證書(shū)是不是蘋(píng)果認(rèn)證的,只要證書(shū)對(duì)就可以安裝運(yùn)行。
這種方式能夠保證安裝的App是經(jīng)過(guò)蘋(píng)果允許的,但是還有弊端。
弊端:
只要申請(qǐng)一個(gè)證書(shū),就可以安裝在所有的iOS設(shè)備。
簽名原理圖2:
三、終極的簽名原理:
*目的:
- 不能濫用安裝
- 背景:
- mac電腦:私鑰M和公鑰M(電腦生成)
- 蘋(píng)果服務(wù)器:私鑰A
- iPhone手機(jī):公鑰A
- 原理:
加了兩個(gè)限制:
第一個(gè):需要在蘋(píng)果服務(wù)器注冊(cè)過(guò)的設(shè)備才能安裝,證書(shū)對(duì)應(yīng)的是有設(shè)備的(UUID)
第二個(gè):簽名只能針對(duì)某一個(gè)App,并且還需要UUID、AppID、推送,后臺(tái)運(yùn)行等權(quán)力描述信息,蘋(píng)果公司把這些權(quán)限統(tǒng)一生成一個(gè)文件,稱為權(quán)限文件,專門(mén)用來(lái)描述App簽名的權(quán)限,并最生成Provision Profile(描述文件):包含設(shè)備IDs,AppID,Entitlements(權(quán)力文件包含是否可調(diào)試,推送,后臺(tái)運(yùn)行等信息)。
1.在進(jìn)階的簽名原理中的第2步,證書(shū)文件(包含公鑰M和公鑰M的HASH值)和Provision Profile(描述文件)傳給發(fā)送給mac電腦;
2.在進(jìn)階的簽名原理中的第3步,Provision Profile(描述文件)也會(huì)和證書(shū)文件一起打包進(jìn)去 。
查看Provision Profile信息:
cd ~/Library/MobileDevice/Provisioning\ Profiles/
ls

打開(kāi)文件夾:
open .

在該目錄下用終端查看:
security cms -D -i 0ae1aea3-6094-5dc4dc867596.mobileprovision


其中包含了一些重要信息:
- TeamName
- AppIDName
- ProvisionedDevices 設(shè)備
- UUID 描述文件本身的UUID
- Entitlements:
- get-task-allow 是否可以調(diào)試
- com.apple.developer.team-identifier
簽名原理圖3
