iOS中的App安全-應用簽名和重簽名

探討iOS應用簽名之前,首先我們需要了解一個東西,叫做數(shù)字簽名

數(shù)字簽名

名詞解釋:為什么用簽名這個詞,因為老外喜歡用支票,支票上面的簽名能夠證明這玩意是你的。那么數(shù)字簽名顧名思義,就是用于鑒別數(shù)字信息的方法。

我們來思考一下,想要證明數(shù)字信息(二進制數(shù)據(jù),或計算機里面的任意數(shù)據(jù))的有效性,那么使用什么方式最合適呢?

可以想到有信息指紋之稱的HASH算法。在網(wǎng)絡數(shù)據(jù)傳輸?shù)倪^程中,我們可以將明文數(shù)據(jù),和數(shù)據(jù)的HASH值一起傳輸給對方,對方可以拿出HASH值來進行驗證。

但是在這個過程中,明文數(shù)據(jù)和HASH值如果直接傳輸就都有被篡改的風險,所以我們需要對數(shù)據(jù)進行加密。

明文數(shù)據(jù)有時會比較大,不適合使用RSA非對稱加密算法,但是數(shù)據(jù)的HASH值是比較小的,用于校驗的,它完全可以使用RSA來加密。所以在數(shù)據(jù)傳輸時,我們將明文數(shù)據(jù)加上通過RSA加密的校驗數(shù)據(jù)一并傳輸給對方。這個通過RSA加密的校驗數(shù)據(jù),我們稱之為簽名

數(shù)字簽名

數(shù)字簽名的驗證過程

當對方拿到數(shù)據(jù)之后,如何進行驗證呢?

首先傳輸數(shù)據(jù)時會將原始的數(shù)據(jù)和數(shù)字簽名一起發(fā)送。

對方拿到數(shù)據(jù)后,先進行校驗。拿到原始數(shù)據(jù),通過同樣的HASH算法得到數(shù)據(jù)的HASH值。然后通過非對稱加密,將數(shù)字簽名中校驗HASH值解密出來。

最后對比兩個HASH值是否一致,這樣可以很好的判斷數(shù)據(jù)是否被篡改。

數(shù)字簽名驗證

代碼簽名

名詞解釋:代碼簽名是對可執(zhí)行文件或腳本進行數(shù)字簽名。用來確認軟件在簽名后未被修改或損壞的措施,和數(shù)字簽名原理一樣,只不過簽名的數(shù)據(jù)是代碼而已。

簡單的代碼簽名

在iOS出來之前,以前的主流操作系統(tǒng)(Mac/Windows)軟件隨便從哪里下載都能運行,系統(tǒng)安全存在隱患,盜版軟件,病毒入侵,靜默安裝等等。蘋果希望解決這樣的問題,保證每一個安裝到iOS上的App都是經(jīng)過蘋果官方允許的,怎樣保證呢?就是通過代碼簽名

如果要實現(xiàn)驗證,最簡單的方式就是通過蘋果官方生成非對稱加密的一對公私鑰。在iOS系統(tǒng)中內置一個公鑰,私鑰由蘋果后臺保存,我們傳App到App Store時,蘋果后臺用私鑰對App進行簽名,iOS系統(tǒng)下載這個App后,用公鑰驗證這個簽名,若簽名正確,這個App肯定是由蘋果后臺認證的,并且沒有被修改過,也就達到了蘋果的需求:保證安裝的每一個App都是經(jīng)過蘋果官方允許的。

如果我們iOS設備安裝App只有App Store這一個入口,這件事就解決了。但是實際上iOS安裝App還有其他渠道,比如對于iOS開發(fā)者而言,是需要在開發(fā)App時直接真機調試的。而且蘋果還開放了企業(yè)內部分發(fā)的渠道,企業(yè)證書簽名的App也是需要順利安裝的。

蘋果需要開發(fā)這些方式安裝App,這些需求就無法通過簡單的代碼簽名來做到了。

蘋果的需求:
1.安裝包不需要上傳到App Store,可以直接安裝到手機上。
2.蘋果為了保證系統(tǒng)的安全性,又必須對安裝的App有絕對的控制權。
3.經(jīng)過蘋果允許才可以安裝。
4.不能被濫用導致非開發(fā)App也能被安裝。

為了實現(xiàn)以上需求,iOS簽名的復雜度也就開始增加了,蘋果這里給出的方案是雙層代碼簽名。

雙層代碼簽名

iOS的雙層代碼簽名流程這里簡單梳理一下,這也不是最終的iOS簽名原理。iOS的最終簽名原理在這個基礎上還要稍微加點東西,文末會講。

首先這里有兩個角色,一個是iOS系統(tǒng),還有一個就是我們的Mac系統(tǒng)。因為iOS的App開發(fā)環(huán)境在Mac系統(tǒng)下。所以這個依賴關系成為了蘋果雙層簽名的基礎。

1.在Mac系統(tǒng)中生成非對稱加密算法的一對公鑰\私鑰(Xcode幫忙代辦了),這里稱為公鑰M、私鑰M。M=Mac

公鑰M私鑰M

2.蘋果自己有固定的一對公私鑰,跟之前App Store原理一樣,私鑰在蘋果后臺,公鑰在每個iOS系統(tǒng)中。這里稱之為公鑰A,私鑰A。A=Apple

image.png

3.把公鑰M以及一些你開發(fā)者的信息,傳到蘋果后臺(這個就是CSR文件),用蘋果后臺里的私鑰A去簽名公鑰M。得到一份數(shù)據(jù)包含了公鑰M以及其簽名,把這份數(shù)據(jù)稱為證書

申請證書

4.在開發(fā)時,編譯完一個App后,用本地的私鑰M(今后你導出的P12)對這個App進行簽名,同時把第三步得到的證書一起打包進App里,安裝到手機上。

image.png

5.在安裝時,iOS系統(tǒng)取得證書,通過系統(tǒng)內置的公鑰A,去驗證證書的數(shù)字簽名是否正確。

6.驗證證書后確保了公鑰M是蘋果認證過的,再用公鑰M去驗證App的簽名,這里就間接驗證了這個App安裝行為是否經(jīng)過蘋果官方允許。(這里只驗證安裝行為,不驗證App是否被改動,因為開發(fā)階段App內容總是不斷變化的,蘋果不需要管。)

image.png

有了上面的過程,已經(jīng)可以保證開發(fā)者的認證,以及程序的安全性了。但是,你要知道iOS的程序,主要渠道是要通過App Store才能分發(fā)到用戶設備的,如果只有上述的過程,那豈不是只要申請了一個證書,就可以安裝到所有的iOS設備了?所以為了防止濫用,蘋果再加了幾個限制。這就是我們后面要講的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容