數(shù)字簽名
數(shù)字簽名(又稱(chēng)公鑰數(shù)字簽名题画、電子簽章等)是一種類(lèi)似寫(xiě)在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實(shí)現(xiàn)德频,用于鑒別數(shù)字信息的方法苍息。一套數(shù)字簽名通常定義兩種互補(bǔ)的運(yùn)算,一個(gè)用于簽名壹置,另一個(gè)用于驗(yàn)證竞思。
數(shù)字簽名,就是只有信息的發(fā)送者才能產(chǎn)生的別人無(wú)法偽造的一段數(shù)字串钞护,這段數(shù)字串同時(shí)也是對(duì)信息的發(fā)送者發(fā)送信息真實(shí)性的一個(gè)有效證明盖喷。
數(shù)字簽名技術(shù)是將摘要信息用發(fā)送者的私鑰加密,與原文一起傳送給接收者难咕。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息课梳,然后用Hash函數(shù)對(duì)收到的原文產(chǎn)生一個(gè)摘要信息,與解密的摘要信息對(duì)比余佃。如果相同暮刃,則說(shuō)明收到的信息是完整的,在傳輸過(guò)程中沒(méi)有被修改爆土,否則說(shuō)明信息被修改過(guò)椭懊,因此數(shù)字簽名能夠驗(yàn)證信息的完整性。
舉個(gè)例子:移動(dòng)客戶端向服務(wù)器發(fā)送數(shù)據(jù)
如果不做任何處理步势,可能會(huì)遭到中間人的竊取攻擊氧猬,后果如何嚴(yán)重就不說(shuō)了。那么我們?nèi)绾畏乐怪虚g人攔截坏瘩,或者檢查數(shù)據(jù)是否被篡改呢盅抚?
直接用RSA(RSA加密原理)進(jìn)行加密應(yīng)該是不滿足我們的需求,RSA只適合對(duì)小數(shù)據(jù)進(jìn)行加密桑腮,我們知道驗(yàn)證數(shù)據(jù)的完整性可以用Hash(Hash概述)來(lái)驗(yàn)證泉哈,可以對(duì)數(shù)據(jù)進(jìn)行Hash,把Hash值和原始數(shù)據(jù)一起打包發(fā)送給服務(wù)器破讨,服務(wù)器將原始數(shù)據(jù)進(jìn)行Hash,得到的hash值和客戶端發(fā)送的Hash值做對(duì)比奕纫,如果一致則保證數(shù)據(jù)有效性提陶。但是這樣會(huì)有安全隱患,如果中間人篡改了客戶端發(fā)送的數(shù)據(jù)匹层,當(dāng)然也可以修改客戶端發(fā)送的Hash值隙笆,所以這樣操作不可行锌蓄。
這時(shí)我們可以用RSA來(lái)對(duì)hash值進(jìn)行保護(hù),此時(shí)客戶端發(fā)送原始數(shù)據(jù)撑柔,和經(jīng)RSA加密后的該數(shù)據(jù)的hash值瘸爽。
服務(wù)器對(duì)RSA加密的數(shù)據(jù)進(jìn)行解密,得到原始數(shù)據(jù)的hash值铅忿,接下來(lái)對(duì)原始數(shù)據(jù)進(jìn)行通過(guò)同樣的Hash算法剪决,將得到的Hash值和解密后的Hash值做對(duì)比,如果一致則保證數(shù)據(jù)有效性檀训,整個(gè)過(guò)程中柑潦,如果解密的Hash值和原始的Hash值不一致,或者無(wú)法解密RSA的數(shù)據(jù)峻凫,說(shuō)明數(shù)據(jù)被篡改了渗鬼。
現(xiàn)在我們解決了服務(wù)端收到客戶端發(fā)送數(shù)據(jù)的有效性,此時(shí)我們稱(chēng)荧琼,對(duì)原始數(shù)據(jù)Hash值進(jìn)行RSA加密后的數(shù)據(jù)譬胎,是原始數(shù)據(jù)的數(shù)字簽名。簡(jiǎn)單解釋數(shù)字簽名也就是對(duì)原始數(shù)據(jù)的Hash值進(jìn)行非對(duì)稱(chēng)加密命锄。
代碼簽名
代碼簽名是對(duì)可執(zhí)行文件或腳本進(jìn)行數(shù)字簽名银择,用來(lái)標(biāo)識(shí)軟件來(lái)源以及軟件開(kāi)發(fā)者的真實(shí)身份,確認(rèn)軟件在簽名后未被修改或損壞的措施累舷。和數(shù)字簽名原來(lái)一樣浩考,只不過(guò)簽名的數(shù)據(jù)是代碼而已。
蘋(píng)果也是通過(guò)代碼簽名來(lái)保證每一個(gè)安裝到iOS上的APP都是經(jīng)過(guò)蘋(píng)果官方允許的被盈,防止盜版軟件析孽、病毒入侵、靜默安裝等。如果想要實(shí)現(xiàn)驗(yàn)證侈咕,最簡(jiǎn)單的方式就是通過(guò)蘋(píng)果官方生成非對(duì)稱(chēng)加密的一對(duì)公私鑰霍衫,在iOS系統(tǒng)中內(nèi)置一個(gè)與服務(wù)器對(duì)應(yīng)的公鑰,私鑰由蘋(píng)果后臺(tái)來(lái)保存邓尤,我們傳APP到App Store時(shí),蘋(píng)果后來(lái)用私鑰對(duì)APP數(shù)據(jù)進(jìn)行簽名贴谎,iOS系統(tǒng)下載這個(gè)APP后汞扎,用公鑰驗(yàn)證這個(gè)簽名,如果簽名正確則這個(gè)APP肯定是由蘋(píng)果后臺(tái)認(rèn)證的擅这,并且沒(méi)有被修改或損壞澈魄。
整個(gè)過(guò)程很簡(jiǎn)單,這樣就保證了蘋(píng)果安裝的每一個(gè)APP都是經(jīng)過(guò)蘋(píng)果官方允許的仲翎。對(duì)于大部分普通用戶而言痹扇,這樣一個(gè)數(shù)字簽名就解決了安全隱患問(wèn)題铛漓,但是實(shí)際上iOS設(shè)備安裝APP并不是只有App Store這一個(gè)渠道,比如對(duì)于我們iOSer來(lái)說(shuō)鲫构,我們?cè)陂_(kāi)發(fā)APP時(shí)還在真機(jī)調(diào)試浓恶,當(dāng)然蘋(píng)果還開(kāi)放了企業(yè)內(nèi)部分發(fā)的渠道,這時(shí)就無(wú)法通過(guò)簡(jiǎn)單的代碼簽名來(lái)滿足這些需求了结笨。
蘋(píng)果為了實(shí)現(xiàn)這些需求包晰,iOS簽名的復(fù)雜度也就開(kāi)始增加了,這樣雙層代碼簽名就出現(xiàn)了禀梳。前提杜窄,我們都知道描述文件,但是描述文件具體是干嘛的呢
描述文件
在真機(jī)調(diào)試時(shí)候算途,都會(huì)有一個(gè)描述文件塞耕,描述文件就是在developer.apple.com創(chuàng)建的,在Xcode中填入AppID后會(huì)代辦創(chuàng)建嘴瓤,Xcode運(yùn)行時(shí)會(huì)打包進(jìn)APP中扫外。為了系統(tǒng)安全,蘋(píng)果除了控制APP濫用問(wèn)題還控制了推送廓脆、iCloud筛谚、調(diào)試器等附加這些權(quán)限,蘋(píng)果把這些權(quán)限開(kāi)關(guān)統(tǒng)一稱(chēng)為Entitlements(授權(quán)文件)停忿。并將這個(gè)文件放在了一個(gè)叫做Provisioning Profile(描述文件)文件中驾讲,描述文件里面就包括權(quán)限、證書(shū)等配置相關(guān)文件席赂。
通常吮铭,描述文件會(huì)保存在~/Library/MobileDevice/Provisioning Profiles/這個(gè)文件中,可以在終端用 security cms -D -i + [名稱(chēng)]命令查看描述文件里面的信息颅停,我們會(huì)發(fā)現(xiàn)谓晌,描述文件是一個(gè)plist文件,下面是個(gè)人描述文件信息演示癞揉,并對(duì)一些信息做出了注釋?zhuān)糠株P(guān)鍵內(nèi)容被隱藏纸肉,Base64(了解Base64編碼解碼)內(nèi)容被刪減
$ security cms -D -i 294b2de0-a877-4f33-9825-9a8***.mobileprovision
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AppIDName</key>
<string>com *** </string>
<key>ApplicationIdentifierPrefix</key>
<array>
<string>***GCDB</string>
</array>
<key>CreationDate</key>
<date>2019-03-06T08:54:06Z</date>
<key>Platform</key>
<array>
<string>iOS</string>
</array>
<key>IsXcodeManaged</key>
<true/>
<key>DeveloperCertificates</key>
<array>
<data>***vcNAQELBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgwNzEwMDIzNsb3BtZW50IENvLixMdGQuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO4xNm+/SXHwULul2Am4b+2/a919AfaDSy6Jw+nC3599RNhUlY+/PNTudcsBUsSw53+flAh6dVVGO77lebM1GaveXMLr65l9aZe2a6ewR0QOpSkvoBZBXlRA14WpyfdMbU7VlWutKiFHsuxA4KSQyoagY8GJ3tB5vSlxRtfix0TKtOCMx9v1iYdCztmhmtt5J6GZn8jKszkPgKxMNvm4MD9N/pr7/Z0gX06oywYb3DpS7uQKdffsLZyj05H0HvSg6V4nHZw5HNIf8qd1VjOiI7NGcvsOwltfGmiOhmxQjaESwalgX7vWg7ij8fh9ke1on8veQgptIxutKjLWG9JnJ2LPOeP7w3PJC03Yl89qJ6F0VAyA1+ck1ieimrG0yXkd9z/YWMd/puDoW7SmEQ/WdKyQkyld0iSnkQ90511uOAp0/yDgaaouyUDZlcIjL2/4JzdEJEiRkZEdmw63uYe4dwXSyTyLlA+ntka2QlKEiJmy8oyPTqjEuqcWWQmnFYWiEBqPaeEXlXT9uuGjqn9aN3MaTgD8QFIyOhonc6ReQHtx8apXGEzhVNAQXCLuKSB04JiCbL3YE2XT42QlygBL+7ROxC00pAIltrPkFfuoyBbpnj9pWQ==</data>
<data>***GVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgwNTI1MTMxMjA4WhcNMTkwNTI1MTMxMjA4WjCBrjEaMBgGCgmSJomT8ixkAQEMCjVFVE45NEpBNlUxMTAvBgNVBAMMKGlQaG9uZSBEZXZlbG9wZXI6IFhpbiBDaGVuZyAoNEU4Mk5RVzZDMikxEzARBgNVBAsMClpFV0pNSEdDREIxOzA5BgNVBAoMMlNoYW5naGFpIFJpc2VuIEVsZWN0cmljIFBvd2VyIERldmVsb3BtZW50IENvMDYGCCsGAQUFBwIBFipodHRwOi8dEU39NyqZsQBCA/P1txkkx9sI7JsMcMnjwa/N5QCg+gJLvMEh1ZvQ/rroTtyvDxFuuMrQkiZeeBGs8qBO2Jre6ma32mMo5kSjc9w9AtnFwlQHrW3+HPwwqlThRrMeNvbLZAvZhoENb04HE26sH4k1tk8CrNvutsjl+K3GGnuvWCnZy/dT57wrGAMrlkQZRWXomSxr9y+F4ArsMj+4UsA==</data>
<data>***sZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgwNTEzMDQ1OTQ0WhcNMTkwNTEzMDQ1OTQ0WjCBrjEaMBgGCgmSJomT8ixkAQEMCjVFVE45NEpBNlUxMTAvBgNVBAMMKGlQaG9uZSBEZXZlbG9wZXI6IFhpbiBDaGVuZyAoNEU4Mk5RVzZDMikxEzARBgNVBAsMClpFV0pNSEdDREIxOzA5BgNVBAoMMlNoYW5naGFpIFJpc2VuIEVsZWN0cmljIFBByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipodHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwMwHQYzizUHwwrgDSFxwfGfc71fr4hz3PmN6o7XqtGcNO4Af49JdDMZv6VQ5mr/plPBSDdun0D5ZfNDr9cXopDCzy+XPZB/H1ARmy1MT4vuKvdsGuUKBvJX/HinDi38G6AuwZ0alfPY9xqJ7WB7K14kaVdaaqOHMThOA7b7b1Stu+MjAKYJ6aUkrf9vvDbDAkQFi8lfh4L3Vya9MoXEpDpCNxQrUJhc6sy2eMf1NT5Q==</data>
<data>***zA5BgNVBAoMMlNoYW5naGFpIFJpc2VuIEVsZWN0cmljIFBvd2VyIERldmVsb3BtZW50IENvLixMdGQuMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKIWs9nQdTq3yqKLYVmjrGrgh6MhaWlkZb5MeHWKwGfky3/n/FaXmrLNxFFFWeFihdg4zmFjSjRl8ccvPF3afdZU2qW4Co1aKu459CnPhknFNbFtcrs0V1T6u6p3RJn6togsWn1z33IakruJPYtwY7k4S5jb20vb2NzcDAzLXd3ZHIwMTCCAR0GA1UdIASCARQwggEQMIIBDAYJKoZIhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGVAFqGwKrYTc+8/GyszOm3u4/mn5s5b58ORnITE+A9bNtDGv6Qz46ev3ZMCrQZFwye//Tk+BI7ms4++jkj/pcmUCULtZw178cTRBpMT4P7tzgH5mRP/BpcSd/rv8994UXYPYdpXa4epFhchlCvu8dT8sQ38fFeahyd85nS30c4RxyW32bzKnzzRSedr/j4Y1qIIvzKdWPcnwkA5RYH8naxYfzEXL2321tdwfR5skvApeP/S2oX9WC+18XBk8Yy693rJoqrKdwkOzQSVGcA==</data>
<data>***3NjZOMlBGS00xMzAxBgNVBAMMKmlQaG9uZSBEZXZlbG9wZXI6IEhhb3lhbmcgWmh1IChLTU5VVTI4QlBaKTETMBEGA1UECwwKWkVXSk1IR0NEQjE7MDkGA1UECgwyU2hhbmdoYWkgUmlzZW4gRWxlY3RyaWMgUG93ZXIgRGV2ZWxvcG1lbnQgQ28uLEx0ZC4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA19bNzMNJ0uSYvwNygYH8b4GQY11UmNvbS9vY3NwMDMtd3dkcjAxMIIBHQYDVR0gBIIBFDCCARAwggEMBgkqhkiG92NkBQEwgf4wgcMGCY2QGAQIBAf8EAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQCJw3MoEbhJNVyc1PFG6FtY7QZAy+gmqRz9YiwnFh3y5Qj5lnC2n0WdG8SrlZA+TKQgfwRZNEB6ZIfDZOJAFsqpBMAauC1V0CDzP8UWBDfluoVCU89Ns5juag8ffk/ulEQfEN1NakgiSwihy+QEmd2PWBTn4dfGVSV9mYRjPppFdM6kik1WLgMDZfLRmNzZ0MzMZMAPy8gdMmQiM7uBY1v+EnUXfyjKnK7Y28AB9c6oQHPoTGmVQxZjJgkejyOlBPWwVPbNvvzNRPuBaHI8muX2HzjsA9SJowEBXKICinqLSFZ8NDQVBrw2fgDs5MD5vaDHXtrz9t6Ahw6/7nUB240U</data>
<data>***LDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgwOTI1MDIxMzA4WhcNMTkwOTI1MDIxMzA4WjCBrzEaMBgGCgmSJomT8ixkAQEMCjIzVDNTWlo0WjQxMjAwBgNVBAMMKWlQaG9uZSBEZXZlbG9wZXI6IOS9s+a7qCDnjosgKDN1UdDgQWBBT7im/bw3RlTv0soM/RVB2mmh9e4zAOBgNVHQ8BAf8EBAMCB4AwEwYKKoZIhvdjZAYBAgEB/wQCBQAwDQYJKoZIhvcNAQELBQADggEBACErmsYfmt/qn5yj86poEkDsDWhznabHVn1CJprtzyHbXNcbKJE1pY99ACzSUVW9iGaxXJ9m5dWmZsd+2gxOBthFDq4mSpU50OHQgg9AjjugvsQ+OH1r1qgqcJMPdLN4stJtkAC9Mb/rt3AYA5eEdHOXbhrsE3TXWmWfJzYS9PFyarGcJ9xFAWg76jTtFA6nlzYtl/YyMDS6Z075oMzKG/pRfCI13P4AqRKdx/DBtz4x0Wv59LVMVrXa4bfePLKMBJrBFdiiyCy4k4BIx4weG/Y/8OsEkmWkN0fDWmi4MZjy3I+FCNkv9tUzI/vRvDEiNR7qo5rGRKnAi+X1QbdLYcU=</data>
<data>***o0WjQxMjAwBgNVBAMMKWlQaG9uZSBEZXZlbG9wZXI6IOS9s+a7qCDnjosgKDNYTDJNRFdWOUcpMRMwEQYDVQQLDApaRVdKTUhHQ0RCMTswOQYDVQQKDDJTaGFuZ2hhaSBSaXNlbiBFbGVjdHJpYyBQb3dlciBEZXZlbG9wbWVudCBDby4sTHRkLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC35nKt/AoSiANJn9e9H96rol/85zSEAjAAMB8GA1UdIwQYMBaAFIgnFwmpthhgi+zruvZHWcVSVKO3MD8GCCsGAQUFBwEBBDMwMTAvBggr1UdJQEB/wQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBSIeBiIaX4EyW39H2laObRLnSyWVjAOBgNVHQ8BAf8EBAMCB4AwEwYKKoZIhvdjZAYBAgEB/wQCyETSZ/FOr8EBZBVLmMGXz03x6f2Hpd7QsmoJJM5+6hHu4qgstgXNg0RRsa0B4jScKTMlRxmdZuLjm3plaX+P+yo0ylAnvGWm1sx9mxPTgrDbUg7Rg0n1bhrBtkX47+r8SUz4+E6dHnqZ7x48hZlhv6SFkj4PQ/apeAvITvnLeq7bj586gkpwS30bjmrsqSO8aEnysvyxq6Xx3+seH9Uihmjb7XdnV25mKfbf5ms6sm+HrN6ifrDb0LePX8YAsSH4=</data>
</array>
<key>Entitlements</key> // 權(quán)限
<dict>
<key>keychain-access-groups</key>
<array>
<string> *** .*</string>
</array>
<key>get-task-allow</key> // APP是否允許調(diào)試
<true/>
<key>application-identifier</key> // appID
<string> *** </string>
<key>com.apple.developer.associated-domains</key>
<string>*</string>
<key>com.apple.developer.team-identifier</key>
<string> *** </string>
<key>aps-environment</key>
<string>development</string>
</dict>
<key>ExpirationDate</key> // 過(guò)期時(shí)間
<date>2020-03-05T08:54:06Z</date>
<key>Name</key>
<string>iOS Team Provisioning Profile: *** </string>
<key>ProvisionedDevices</key> // 設(shè)備列表
<array>
<string>476c21e91700a0605a11a***3de7705a</string>
<string>98a1263783fb5538ec292f0***9d05690ffb</string>
<string>bc9144d7496e5337e1f***cb653dc42e</string>
<string>254fbcad0126f989b8980***d1dd8169b6ca</string>
<string>349f7aeb300473cc30c28***025d</string>
</array>
<key>TeamIdentifier</key>
<array>
<string> *** </string>
</array>
<key>TeamName</key>
<string> *** Co.,Ltd.</string>
<key>TimeToLive</key>
<integer>365</integer>
<key>UUID</key> // 描述文件的UUID
<string> *** </string>
<key>Version</key>
<integer>1</integer>
</dict>
雙層代碼簽名
- 請(qǐng)求證書(shū)
開(kāi)發(fā)過(guò)程中,首先Mac電腦(比如Xcode)會(huì)自動(dòng)生成一對(duì)公私鑰
圖中的證書(shū)就是公鑰M喊熟,專(zhuān)用密鑰就是私鑰M(也就是我們導(dǎo)出的P12文件)
用一個(gè)CSR文件(就是在鑰匙串訪問(wèn)中柏肪,證書(shū)助理,從證書(shū)頒發(fā)機(jī)構(gòu)中獲取的)向蘋(píng)果申請(qǐng)一個(gè)證書(shū)逊移,這個(gè)CSR文件主要包含了一個(gè)公鑰文件预吆,還有一些信息,比如郵箱胳泉、名字拐叉、簽名信息、Hash值等等扇商,蘋(píng)果收到請(qǐng)求后凤瘦,會(huì)用私鑰A將公鑰M進(jìn)行簽名,以供蘋(píng)果設(shè)備進(jìn)行驗(yàn)證(用公鑰A進(jìn)行驗(yàn)證)案铺。蘋(píng)果服務(wù)器將公鑰M和簽名信息打包成證書(shū)蔬芥,并把a(bǔ)ppID、證書(shū)控汉、設(shè)備IDs笔诵、權(quán)限文件等放入描述文件一并返回給Mac電腦,以備Mac電腦用這個(gè)描述文件中的證書(shū)到iOS設(shè)備去驗(yàn)證姑子。
- 生成IPA文件乎婿,發(fā)送到iOS設(shè)備上
iOS設(shè)備上的APP其實(shí)都是文件夾,最重要的是可執(zhí)行文件MachO和framework街佑,APP簽名也就是對(duì)它倆進(jìn)行簽名谢翎,通過(guò)Mac電腦的私鑰M對(duì)文件進(jìn)行簽名,把這個(gè)簽名和從蘋(píng)果申請(qǐng)的描述文件一并放入到APP中沐旨。當(dāng)安裝APP時(shí)森逮,iOS設(shè)備用公鑰A來(lái)解析描述文件中的證書(shū)進(jìn)行驗(yàn)證證書(shū)的有效性,通過(guò)之后將證書(shū)中的公鑰M拿出來(lái)磁携,再去驗(yàn)證APP簽名的有效性褒侧,這樣就可以驗(yàn)證當(dāng)前APP是否是蘋(píng)果官方允許的。
在開(kāi)發(fā)階段谊迄,我們需要頻繁的改動(dòng)程序跑真機(jī)闷供,蘋(píng)果不需要關(guān)心這些,所以iOS設(shè)備沒(méi)有對(duì)APP的更改進(jìn)行驗(yàn)證鳞上,只是驗(yàn)證證書(shū)(公鑰M是不是合法的这吻,APP簽名的有效性)。這樣解決了安裝問(wèn)題篙议,但是如果這樣的話唾糯,可以在任何一部iOS設(shè)備上安裝APP,蘋(píng)果防止開(kāi)發(fā)者濫用鬼贱,又加了兩個(gè)限制:
- 要在蘋(píng)果后臺(tái)注冊(cè)過(guò)的設(shè)備才可以安裝
- 簽名只能針對(duì)具體的某一個(gè)APP進(jìn)行簽名
關(guān)于APP簽名
在開(kāi)發(fā)中移怯,編譯一個(gè)APP后,用本地的私鑰M對(duì)APP進(jìn)行簽名这难,同時(shí)把從蘋(píng)果服務(wù)器得到的Provisioning Profile文件打包進(jìn)APP中舟误,文件名為embedded.mobileprovision,把APP安裝到iOS設(shè)備后姻乓,系統(tǒng)進(jìn)行驗(yàn)證嵌溢。
查看APP的包內(nèi)容眯牧,里面會(huì)有_CodeSignature文件夾(里面的就是資源文件的簽名),還有個(gè)可執(zhí)行文件赖草,可以用MachO查看学少,里面的Code signature就是應(yīng)用簽名。
該文章為記錄本人的學(xué)習(xí)路程秧骑,希望能夠幫助大家版确,也歡迎大家點(diǎn)贊留言交流!:跽邸绒疗!文章地址:http://www.reibang.com/p/4307de384a50