1. 加密:
對稱加密:
用對稱密鑰及算法進行加密。對稱密鑰,加解密使用相同的密鑰。
非對稱加密:
用非對稱密鑰及算法進行加密。非對稱密鑰,加解密使用不同的密鑰。
2. MD5:
(Message Digest Algorithm)消息摘要加密算法,即將原始數(shù)據(jù)運算為固定長度的值。
作用:確保信息傳輸過程中完整一致。
特點:壓縮性,任意長度的數(shù)據(jù),算出的MD5值長度都是固定的;容易計算,從原始數(shù)據(jù)計算出MD5值很容易;抗修改性,對原始數(shù)據(jù)做任何修改,計算的MD5值都是不一樣的;強抗碰撞,已知原始數(shù)據(jù)和MD5值,找出具有相同MD5值的數(shù)據(jù)是很困難的。
3. 數(shù)字簽名:
首先,生成一對非對稱密鑰(公私鑰),私鑰自己保留,公鑰公布出去;
計算出原始數(shù)據(jù)的MD5值(摘要),然后利用私鑰對MD5進行簽名(加密),然后將原始數(shù)據(jù)和簽名一起發(fā)送給用戶;
用戶用公鑰對簽名進行解密得到摘要,然后再計算原始數(shù)據(jù)MD5值并與解密得到的摘要進行比較,得到原始數(shù)據(jù)是否被修改;

4. iOS 數(shù)字簽名及證書:
主要有兩對非對稱密鑰,Mac本地一對(local),Apple自己有一對(apple);Mac本地一對是通過keychain.app "從證書頒發(fā)機構(gòu)獲取證書" 獲得的,私鑰保存在本地 keychain.app 中,公鑰為 certificateSigningRequest。
將certificateSigningRequest文件(公鑰local)上傳給apple后臺,會用apple私鑰對其進行簽名,簽名和公鑰local組成證書,下載到本地,就會與本地私鑰local關(guān)聯(lián)起來,在Xcode中選中證書,就會用私鑰local對App進行簽名。
Apple后臺會利用私鑰apple對上述生成的證書及device IDs、AppID、entitlement組成的數(shù)據(jù)進行簽名,然后與數(shù)據(jù)組成provisioning prpfile文件,下載到本地。
編譯完app,會用私鑰local對app進行簽名,然后將provisioning profile打包到app中,在iOS設(shè)備中安裝時,就會用iOS設(shè)備中的公鑰apple對provisioning profile文件中的兩個私鑰apple的簽名進行驗證,如果驗證通過就從provisioning profile取出AppID等信息進行驗證,如果都通過,就可以安裝了。

5. 涉及的相關(guān)概念:
證書:包含公鑰或者私鑰及其他機構(gòu)對其的簽名。
Entitlements:App的權(quán)限列表(推送、內(nèi)購、后臺運行等)。
CertificateSigningRequest:本地公鑰。
p12文件:本地私鑰??梢詫肫渌娔X對App進行簽名。
Provisioning profile:包含證書、Entitlements等數(shù)據(jù)及蘋果私鑰簽名的數(shù)據(jù)包。
6. iOS 生成證書、簽名整個流程:
- 在 Mac 上通過 keychain.app 生成一對公私鑰: Local_Public、Local_Private,保存的 CertificateSigningRequest 文件就是公鑰,私鑰自動保存在 keychain.app 中;
- 將 Local_Public 上傳到蘋果后臺,蘋果利用 Apple_Private 對其進行簽名,然后簽名和 Local_Public 組成證書 cer,下載到本地,雙擊安裝就會 cer 與 Local_Private 關(guān)聯(lián)起來;
- 創(chuàng)建 Provisioning Profile,在蘋果后臺利用 Apple_Private 私鑰對 AppId、DeviceIds、第2步創(chuàng)建的證書 cer 和 Entitlements(在 Apple 后臺創(chuàng)建 AppId 指定的)等信息進行數(shù)字簽名,然后簽名與上述信息組成 Provisioning Profile 文件,下載到本地,雙擊安裝,與證書進行關(guān)聯(lián);
- 在 Xcode 中設(shè)置打包證書,編譯完后,會用證書對應的 Local_Private 私鑰對 App 進行簽名,并將證書對應的 Provisioning Profile 一起打入包中;
- 在 iOS 設(shè)備中安裝 App,每一個 iOS 設(shè)備中都內(nèi)置了一個 Apple_Public 公鑰,使用 Apple_Public 公鑰進行驗證即可;