基礎(chǔ)知識介紹會結(jié)合OpenSSL命令行工具實踐,iMac環(huán)境可以使用brew或其它方式安裝OpenSSL工具。
一,整個互聯(lián)網(wǎng)世界的安全基石。
整個互聯(lián)網(wǎng)的安全基石目前來說,個人認為是“非對稱加密算法”+“信息摘要算法”+“數(shù)字證書機制”,對于開發(fā)并運行在iOS系統(tǒng)上的App程序來說,蘋果公司也是采取以上方式來保證iOS系統(tǒng)上運行的App的合法性。因此,第一章節(jié)會介紹以上三種技術(shù)。
1,非對稱加密算法。
一般傳統(tǒng)的加密方式,通信的雙發(fā)均需要知曉加密的方法和密鑰,在相同規(guī)則下,對明文進行加解密。典型案例就是常見的諜戰(zhàn)片里面,使用圣經(jīng)的單詞序加解密、數(shù)學運算規(guī)則加解密等。這樣的方式常見的問題就是通信雙方都必須掌握到密鑰,有可能存在密鑰在交換途中被截獲,或者被有明文和密文的破解。
因為數(shù)論理論而發(fā)明的非對稱加密算法很好的解決了對稱加密算法的問題。非對稱加密的密鑰有兩個,一個私鑰,一個公鑰。私鑰僅能發(fā)信者自己持有,公鑰可以四處傳播,任何想和你加密通信的人,都可以使用公鑰加密,將密文傳遞給你,你可以通過私鑰來解密讀取密文。
通過公鑰,是無法計算出私鑰的(或者說現(xiàn)有計算能力需要很長時間才能破解,配合一定的安全策略,如定期更換密鑰就可以規(guī)避)。RSA加密算法是目前廣泛使用的非對稱加密算法,一般RSA算法私鑰的二進制位數(shù)超過1024位,現(xiàn)有計算能力的計算機需要超過幾十年才能通過公鑰來找到私鑰。
openssl工具能夠幫助我們生成RSA的公鑰和私鑰,我們通過一個實驗來看看如何使用公鑰和私鑰加解密明文。在安裝了openssl命令行工具的shell下面,執(zhí)行下面的操作,對sign.txt文本明文進行加解密操作:
(1)首先,使用openssl生成RSA的1024位二進制私鑰apri.key
#openssl genrsa -out apri.key 1024
(2)然后,openssl使用私有代碼生成對應(yīng)的共鑰apub.key
#openssl rsa -in apri.key -pubout -out apub.key
(3)公鑰一般發(fā)送給別人,讓別人使用公鑰加密,這里使用公鑰加密sign.txt,密文sign.en。
#openssl rsautl -encrypt -in sign.txt -inkey apub.key -pubin -out sign.en
(4)密文sign.en可以通過私鑰解密,得到明文sign.de。
#openssl rsautl -decrypt-in sign.en -inkey apri.key -out sign.de
2,信息摘要算法。
根據(jù)百度百科的說明
“摘要算法是一種能產(chǎn)生特殊輸出格式的算法,這種算法的特點是:無論用戶輸入什么長度的原始數(shù)據(jù),經(jīng)過計算后輸出的密文都是固定長度的,這種算法的原理是根據(jù)一定的運算規(guī)則對原數(shù)據(jù)進行某種形式的提取,這種提取就是摘要,被摘要的數(shù)據(jù)內(nèi)容與原數(shù)據(jù)有密切聯(lián)系,只要原數(shù)據(jù)稍有改變,輸出的“摘要”便完全不同,因此,基于這種原理的算法便能對數(shù)據(jù)完整性提供較為健全的保障。但是,由于輸出的密文是提取原數(shù)據(jù)經(jīng)過處理的定長值,所以它已經(jīng)不能還原為原數(shù)據(jù),即消息摘要算法是不可逆的,理論上無法通過反向運算取得原數(shù)據(jù)內(nèi)容,因此它通常只能被用來做數(shù)據(jù)完整性驗證。”
你只用了解兩點:
(1)輸入源的長短可以不同,輸出摘要信息長度相同。
(2)不同輸入源對應(yīng)不同的摘要信息。
因此,對于明文,摘要信息可以做為傳輸后的校驗使用。我們利用openssl工具,同樣來看看信息摘要算法:
//實際使用的sha1算法,從任何長度的文筆中,取得唯一的定長摘要信息sign.sha:
#openssl dgst -sha1 -out sign.sha sign.txt
如果我們修改了sign.txt的內(nèi)容,重復執(zhí)行以上命令,那么將得到不同的sign.sha。
3,數(shù)字證書。
數(shù)字證書是一個經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權(quán)中心的數(shù)字簽名。
簡單來說,證書就是證明非對稱算法里的公鑰的合法性,這一合法性,由發(fā)證機構(gòu)來保證(技術(shù)保證和管理保證)。我們只要使用合法數(shù)字證書上的公鑰,和證書里公鑰擁有者進行通信的話,就保證了這一通信通路的安全和可靠。關(guān)于數(shù)字證書的詳細技術(shù)細節(jié)這里不多做介紹,讀者可以根據(jù)非對稱加密,信息摘要算法的知識去學習了解證書的合法性技術(shù)保證過程。蘋果系統(tǒng)通過keychain應(yīng)用來管理數(shù)字證書。
二,iOS APP的代碼簽名機制。
這一章首先會介紹一下數(shù)字簽名機制,然后會介紹下iOS里面的代碼簽名機制。這里面會使用到第一章里面的知識和概念,請讀者先保證第一章熟練掌握的情況下,再進入這一章節(jié)的實踐和學習。
1,數(shù)字簽名機制。
數(shù)字簽名實際上由兩個過程組成,發(fā)送方簽名過程和接收方驗簽過程。這兩個過程使用了上面介紹的非對稱加密算法和信息摘要算法來實現(xiàn)。目的,就是保證發(fā)送方信息的完整性和真實性(沒有被中間者攻擊所偽造)。通過下圖數(shù)字簽名過程圖解,我們可以看看詳細的過程:
(1)發(fā)送方對于發(fā)送的信息進行簽名的過程。圖中藍色框里的發(fā)送信息,我們首先做信息摘要算法,計算出一個固定長度的摘要信息,然后使用非對稱加密算法的持有的私鑰進行加密(注意,這里是私鑰加密,與信息傳遞過程私鑰解密是不一樣的),得到加密后的數(shù)字簽名信息。
(2)該數(shù)字簽名信息和發(fā)送信息一起發(fā)送給接收方進行數(shù)字驗證簽名過程。接收方使用非對稱加密的公鑰對數(shù)字簽名信息進行解密,得到D‘,然后對發(fā)送過來的信息進行信息摘要,得到D。比對D和D‘,如果一致,就證明簽名通過。
以上過程,保證了發(fā)送的信息在傳播過程中,沒有發(fā)生變化或者被替換。我們同樣可以使用openssl工具來模擬這一過程,我們繼續(xù)使用第一章介紹的RSA加密得到的公鑰和私鑰進行試驗:
// 1 首先,使用私鑰apri.key對信息摘要sign.sha進行簽名加密得到signature.bin。
#openssl rsautl -sign -inkey apri.key -in sign.sha -out signature.bin
// 2 然后,使用公鑰apub.key對加密后的密文進行驗簽,會解密出摘要sign2.sha。
#openssl rsautl -verify -pubin -inkey apub.key -in signature.bin -out sign2.sha
// 3 最后,使用diff工具,比對一下前后兩個摘要是否一致。
#diff sign.sha sign2.sha
2,iOS的代碼簽名機制。
iOS系統(tǒng)使用數(shù)字簽名機制保證了運行在iOS系統(tǒng)中代碼的合法性和完整性。當使用XCode開發(fā)環(huán)境,編寫好APP后。所有的代碼或者圖片素材就是我們需要簽名的信息源,我們使用摘要算法對這些信息源進行摘要,然后使用私鑰對這些簽名進行簽名。這些程序和素材資源經(jīng)過簽名后會和公鑰一起打包成ipa包,在iOS系統(tǒng)載入運行的時候,使用公鑰對程序和素材驗簽,保證程序和信息的合法和完整,通過之后就能夠在iOS上運行了。這就是iOS的代碼簽名機制。
讀完以上的話,請稍微冷靜的思考一下,上面描述的這段過程所存在的問題。
(1)RSA的公鑰和私鑰從何而來?
(2)iOS設(shè)備如何保證該公鑰和私鑰有權(quán)限對代碼進行簽名和驗簽操作?
請結(jié)合蘋果的開發(fā)者證書獲取過程,來思考下iOS代碼簽名的過程,及以上兩個問題的答案,在本系列的第二篇文章會給出詳細解答和描述,這里考察下讀者的自學和專研能力。