iOS簽名機制解析

來源:互聯網
上載者:User

標籤:包含   加密方式   對稱式加密   其他   rms   不可   機構   調用   它的   

最近遇到一個簽名的問題,藉機把iOS簽名相關知識點研究了一下。現總結如下:(研究過程中參考了這位仁兄的部落格。很全面,本文也有部分借鑒)

非對稱式加密

這個是簽名機制的演算法基礎。所謂非對稱式加密的是相對於對稱式加密來說的。對稱式加密是加密方和解密方約定一個相同的密鑰和加解密演算法。只要擷取了這個密鑰,則可以破譯加密內容。這種加密方法下,假如我要和3個人通訊,就需要和三個人分別約定好3個不同的密鑰,不然這三個人就沒辦法鑒別訊息是由我本人加密的。

而非對稱式加密則是採用了一對密鑰(私密金鑰和公開金鑰)。通過公開金鑰加密的內容只能通過私密金鑰解密,而通過私密金鑰加密的內容也只能通過公開金鑰解密。一般公開金鑰是公開的,私密金鑰自己儲存。通過這種加密方式,可以鑒別加密內容是否由私密金鑰持有人進行加密,從而驗證對方身份。這種加密方法下:假如我要和3個人通訊,只需要這三個人知道我的公開金鑰即可。只要能通過我的公開金鑰解密即可認為訊息是由我進行加密。而3個人中任何一個人加密的內容,只能由我來解密。當然這種情況下,我就沒辦法評鑑這三個人的真實身份了。

 

摘要(Hash)

摘要技術也稱為雜湊技術,是將任意長度的資料一一映射到一個固定長度資料的技術,並且得到的摘要資料是無法復原的。只要未經處理資料不一樣,則得到的摘要也會不一樣;未經處理資料一樣,摘要固然也一樣。因此摘要技術可以用來驗證資料是否被篡改。

常見的摘要演算法有SHA1(160bit),SHA256(256bit),SHA512(512bit)等等

數位簽章

數位簽章其實就是摘要技術和非對稱式加密的應用。當發送方要發送一段資料給別人時,為了讓接受者能對接受到的資料進行驗證,確保資料沒有被篡改過。

1. 發送方會同時為資料產生摘要,並用私密金鑰進行加密。

2. 接收方會同時受到資料和加過密的摘要,通過將密碼編譯摘要用公開金鑰進行解密

3. 接收方將資料也通過摘要演算法進行摘要,和第2步中得到的摘要進行對比,如果一致,可以證明資料沒有被篡改過。否則即資料被篡改。

描述了上面的情境

 

數位憑證

上面說過非對稱式加密機制裡公開金鑰是公開的,數位憑證就是其公開形式。私密金鑰持有人將其個人(或組織)資訊與公開金鑰資訊提交給憑證授權單位,憑證授權單位用自己的私密金鑰將所提交的資訊進行數位簽章,然後產生數位憑證。這個認證就是私密金鑰持有人在認證機構的體系下身份標示。也是擷取其公開金鑰的途徑。這裡其實還有點隱藏起來的知識點,憑證授權單位用他的私密金鑰簽名,那如何驗證這個簽名呢?只有驗證了簽名才能驗證認證的真偽啊。秘密就藏在作業系統的授信認證庫中。

1. 要驗證認證的簽名,需要憑證授權單位的公開金鑰

2. 憑證授權單位的公開金鑰一般會內建在作業系統中,或者自行匯入憑證授權單位認證(包含其公開金鑰)。

這樣一來,這個信任鏈結條就完整了。

普遍使用的數位憑證格式是X.509格式,檔案格式是.cer。還有一種包含了私密金鑰的認證.pfx(或.p12)。比如我們在key chain中把包含私密金鑰的認證匯出會產生.p12檔案,就是包含私密金鑰的。這種一般用於自己將認證和私密金鑰移植到別的機器。

好,上面已經把iOS簽名機制的基礎知識進行鋪墊了。接下來看看iOS開發過程中的簽名到底是怎麼回事。

蘋果開發人員數位憑證

要簽名,必須要有私密金鑰,公開金鑰對。因此做iOS開發首先要去蘋果開發人員中心去申請個人認證。申請方式是:

1. 通過Key Chain的Certificate Assistant產生一個CSR(Certificate Signing Request)檔案。在產生CSR的時候需要填寫郵箱和Common Name.這就是你的個人資訊。

2. 然後系統會產生一對金鑰組,私密金鑰儲存在key chain中,公開金鑰寫入CSR檔案。

3. 在蘋果開發人員中心將CSR檔案上傳,他會產生一個數位憑證(蘋果在認證中會添加Team相關的資訊)。這個認證就是你在蘋果認證體系中的個人身份了。在後續的簽名中也會用到該認證。當你下載並安裝該認證後,系統會自動將該認證的公開金鑰與系統中的私密金鑰配對。因此你再key chain中的認證列表中會看到認證關聯了一個私密金鑰。

 

認證的資訊長這樣:

 

  各種認證(App Store,Ad-Hoc,development)

Provisoning檔案

有了認證後可以用來簽名了,但是問題來了: 當我們對app簽名的時候,總不能允許任意一個的開發人員認證來簽名吧。因此蘋果的解決辦法是Provisioning檔案,該檔案中記錄了允許被用來簽名的認證列表。同時該檔案還記錄了app的bundle id,允許啟動並執行裝置列表(ad-hoc發布的時候有用),以及app可以使用的蘋果的一些服務列表。在產生該檔案時,蘋果會用自己的私密金鑰產生簽名。開發人員需要在開發人員中心產生該檔案然後下載到本地。在打包app的時候該檔案會一起打包進ipa檔案,在app啟動並執行時候根據他對app進行合法性檢查。

XCode簽名配置

1. 在Target的配置介面General/Signing節點中,可以選擇Automatically Manage Signing.勾選該選項後,XCode會去自動為你產生認證,Profile檔案,前提是你要在XCode中登入你的開發人員帳號(一般開發階段可以選擇此種方式)

2. 在Signing(Debug)/Signing(Release)節點中,可以選擇Provisioning檔案,前面說過該檔案裡面儲存了可用來簽名(簽名其實用的時認證中公開金鑰所對應的私密金鑰)的認證資訊。因此選擇了Provisioning檔案後,XCode會自動去key chain中尋找本地存在的認證和私密金鑰。(如果本地沒有對應的認證和私密金鑰,則會報錯)

如果本地有多個可用認證,可在BuildSetting配置 Tab裡面的Signing節點進行進一步選擇。

  Framework簽名配置

  項目中Framework Project是不需要設定簽名資訊的,因為他會在引用它的主專案中進行簽名,當然也是用的主專案的簽名配置資訊。

XCode簽名流程

XCode在簽名app時會:

1. 為每個檔案產生摘要資訊(這裡包括provisioning檔案),然後用簽署憑證對應的私密金鑰進行簽名

2. 將每個檔案對應的簽名資訊儲存在app包的_CodeSignature\CodeResources檔案內

3. 對於Framework,其本質其實也是一個包檔案(和app一樣)。XCode會對他裡面的所有檔案進行簽名然後簽名資訊放在Framework包檔案內的_CodeSignature\CodeResources檔案內。

 具體流程見:

 

 最後得到的ipa檔案內部是這個樣子的:

相關工具

上面XCode簽名流程中用到了兩個工具: codesign和zip

1. codesign是真正用來執行簽名工作的工具。它提供簽名,驗證簽名,顯示簽名資訊等等功能。XCode在執行簽名的時候其實是調用該工具。

2. zip是壓縮公用程式。用它可以將app包檔案進行壓縮。(ipa檔案格式只是將壓縮檔改了個副檔名而已)

3. 同時XCode Command Line Tool中提供了一個PackageApplication的可執行程式,這個程式接收provisioning file和認證作為參數,可以對app進行替換provisiong file和重簽名(只對app包進行重簽名,內建的Framework不會重簽)。具體用法可以

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication -man來查看。但是該工具在最新的XCode中已經被移除。推薦使用xcodebuild -exportArchive來產生ipa.

詳見https://developer.apple.com/library/content/technotes/tn2339/_index.html

蘋果裝置App合法性驗證

當iOS裝置安裝app時,會執行如下操作:

1. 解包ipa檔案

2. 拿出provisioning file,通過內建的蘋果公開金鑰驗證provisioning file的合法性。(Provisioning file是被蘋果用私密金鑰簽過名的)

3. 根據provisioning file中的資訊驗證app的合法性。確保provisoning file記錄的資訊和app資訊一致(比如bundle id)

4. 從provisioning file中獲得簽名的認證

5. 通過蘋果公開金鑰(iOS系統內建)來驗證認證合法性(認證是被蘋果私密金鑰簽名的)

6. 通過認證中的公開金鑰來驗證每個檔案的摘要資訊,確保每個檔案都沒有被篡改過。

重簽名工具

其實只要有了provisioning file,認證我們可以把一個ipa重簽名為任何其他名稱(provisioning file中定義)的app。只需將ipa解包,然後按照XCode的流程對app重新進行簽名即可。下面的工具即可實現。(通過這種途徑理論上可以修改ipa的檔案然後重新用新的bundle id安裝。這樣相當於hack了app。)

https://github.com/shusain93/ios-app-signer

iOS簽名機制解析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.