4 加密服務(Cryptographic Services)
加密服務構成傳輸過程(安全通信)和數(shù)據(jù)靜止(安全存儲)中保護數(shù)據(jù)的基礎。使用復雜的數(shù)學運算,他們讓你:
- 加密和解密數(shù)據(jù),以便它不能被外部觀察者理解
- 確認數(shù)據(jù)沒有被修改,因為它最初是由通過哈希(hashing),簽名(signing)和驗證(verifying)方法發(fā)送
本章描述了這些加密技術并簡要總結了OS X和iOS提供的技術,幫助您在自己的應用程序中使用加密荞彼。
4.1 加密和解密(Encryption and Decryption)
加密是一種保護數(shù)據(jù)的手段茫孔,將數(shù)據(jù)轉換成除了知道如何轉化回去的人之外的人攔截后不可讀计呈。
加密通常用于在傳輸過程和存儲中保護數(shù)據(jù)当编。當信息必須通過一個不可信的通信通道發(fā)送,它的責任是兩個端點使用加密來保護通信。同樣,在本地磁盤的存儲信息,應用程序可以使用加密來確保信息對于第三方是不可讀即使是電腦被盜了陵像。
有許多不同的加密技術,稱為密碼(ciphers),以不同的方式工作,能起到不同的作用猖任。密碼一般工作結合原始信息(明文cleartext或純文本plaintext)與第二個信息(關鍵key)以某種方式生成一個加密的形式,稱為密文(ciphertext)你稚。
現(xiàn)代加密技術可以分為三大類:對稱加密(symmetric encryption)、非對稱加密(asymmetric encryption)和速記式加密(steganography)朱躺。
4.1.1對稱加密(symmetric encryption)
在對稱加密,一個單獨的密鑰(通常是一個隨機字節(jié)的長串)用于數(shù)學變換信息,然后用于相反的取回原始信息刁赖。
對稱加密通常用于安全通信。然而,由于兩個端點必須知道相同的密鑰,對稱加密本身是不夠的长搀。
4.1.2非對稱加密(asymmetric encryption)
在非對稱加密,用兩個數(shù)學相關密鑰來轉換的信息宇弛。使用一個密鑰加密的信息只能用另一個密鑰來解密,反之亦然。一般來說,其中一個密鑰(私鑰)是保密的,和其他密鑰(公鑰)是由廣泛可用源请。出于這個原因,非對稱加密也被稱為公鑰密碼學(public key cryptography)枪芒。
注意:雖然這兩個密鑰是數(shù)學相關,從一個密鑰導出另一個密鑰在計算上被認為是不可能的。公鑰加密的安全取決于這種情況谁尸。
非對稱加密通常用于建立一個共享的通信通道舅踪。因為非對稱加密計算昂貴,兩個端點(endpoints)通常使用非對稱加密交換對稱密鑰,然后使用較快的對稱加密算法對實際數(shù)據(jù)加密和解密。
非對稱加密也可以用來建立信任良蛮。通過你的私鑰加密的信息,別人能使用你的公鑰讀懂這些信息并確認信息是由你加密的抽碌。
4.1.3隱寫術(steganography)
隱寫術意思是隱藏信息在不太重要的另一個信息中。
隱寫術通常用于在照片中存儲版權信息以大量的不可識別的噪音的形式,除非你知道如何去尋找它决瞳。
隱寫術也可以用于存儲加密卷下面其他加密或不加密卷(通過使用未使用的塊或利用以微妙的方式誤差修正)货徙。
4.2 哈希散列(Hashing)
散列值,或散列,是一小塊的數(shù)據(jù)來源于一塊較大的數(shù)據(jù),可以作為一個較大的數(shù)據(jù)的代理泽裳。在密碼學中,哈希表用來驗證數(shù)據(jù)的真實性。加密散列算法本質上是一種(非常)有損數(shù)據(jù)壓縮,但是他們專門設計破婆,因此兩個相似的數(shù)據(jù)不太可能散列到相同的值。
例如,兩個小學生經常通過來回傳遞筆記來決定何時一起走路回家胸囱。一天,一個惡霸攔截到筆記并且安排鮑勃早十分鐘到達,這樣他可以偷鮑勃的午餐錢祷舀。為了確保他們的信息以后沒有被修改,他們設計了一個方案,計算信息中字母的數(shù)量除以他們的年齡的總和的余數(shù),然后寫了很多點在消息的角落里。通過計算字母的數(shù)量他們可以(粗糙)檢測到信息是否被修改烹笔。
當然,這是一個做作的例子裳扯。一個簡單的余數(shù)是一個很弱的散列算法。好的哈希算法 ,如果你在一塊數(shù)據(jù)上做一些小小的改變谤职,碰撞時不太可能的饰豺。這種篡改,抵抗自然的好的散列算法制作一個關鍵的組件在代碼簽名,消息簽名和其他各種篡改檢測方案中允蜈。
在高級別上,哈希散列也類似于核對總和(checksumming)(檢測和糾正傳輸數(shù)據(jù)錯誤的技術)冤吨。然而,這些技術的目標是不同的,所以使用的算法也很不同。校驗和通常設計為允許檢測和修復一個改變或少量的變化饶套。相比之下,密碼散列必須可靠地檢測一段數(shù)據(jù)的大量的更改但不需要告訴你數(shù)據(jù)如何改變漩蟆。
例如,以下shell命令中演示了一個通常的散列算法:
$ echo "This is a test. This is only a test." | sha1sum
7679a5fb1320e69f4550c84560fc6ef10ace4550 -
OS X提供了許多C語言 api來執(zhí)行散列。這些進一步描述本章結束的引用文章中妓蛮。
4.3 簽名和驗證(Signing and Verifying)
簽名是一種證明消息真實性的方式,或者驗證服務器,用戶或其他實體的身份怠李。
從前,人們有時用封蠟給信封蓋上郵戳。這種印章不僅證明誰發(fā)送消息,也證明了在運輸途中沒有人打開或者修改它蛤克。
現(xiàn)代簽署通過數(shù)學達到許多相同的好處捺癞。除了數(shù)據(jù)本身,簽名和驗證需要兩條信息:適當?shù)囊话氲墓矫荑€對和一個數(shù)字證書。
消息的發(fā)送方計算數(shù)據(jù)的哈希表然后用私鑰加密构挤。收件人也計算哈希表,然后使用相應的公鑰解密發(fā)送方的哈希表和并進行比較髓介。如果他們是相同的,在傳輸途中的數(shù)據(jù)沒有修改,您可以安全地相信數(shù)據(jù)是由密鑰的所有者發(fā)送的。
發(fā)送者的數(shù)字證書是數(shù)據(jù)的集合,其中包含公鑰和其他識別信息,在發(fā)送者的自由裁量權,例如一個人的名字,公司名稱,域名和郵政地址儿倒。證書的目的是把一個公鑰給一個特定的人版保。如果你信任的證書,那你也相信由那個人發(fā)送的使用發(fā)送方的私鑰簽名的消息。
提供一種確定證書合法性的方式 ,發(fā)送方的證書是由其他人簽名的,他的證書依次被另外的人簽名,等等,形成了一個收件人一直信任的證書的信任鏈,稱為錨證書(anchor certificate)夫否。這個證書可能是根證書--自簽名證書代表一個已知的證書頒發(fā)機構,因此樹的根證書來自權威機構或它可能是用戶或應用程序開發(fā)人員已經明確指定為信任錨的任意證書,彻犁。
因為收件人信任錨證書,收件人知道證書是有效的,因此,發(fā)件人是他或她自稱的。收件人信任證書的程度由兩個因素決定:
- 每個證書都可以包含一個或多個證書擴展(certificate extensions)描述如何使用證書凰慈。例如,一個可信的證書簽署郵件可能不被信任簽署可執(zhí)行代碼汞幢。
- 信任策略(trust policy)允許您信任證書,否則是不可信的,反之亦然。
證書還可以用于身份驗證微谓。通過簽名一個隨機數(shù)(一個為這個目的特別創(chuàng)建的隨機生成的挑戰(zhàn)字符串),用戶或服務器可以證明他,她,或是它擁有與證書關聯(lián)的私鑰森篷。如果證書是可信(通過評估其信任鏈),然后證書和簽名的隨機數(shù)證明用戶或服務器必須是他,她,或者它聲稱的输钩。
4.4 安全存儲(Secure Storage)
OS X和iOS提供大量的技術安全存儲。其中,三個最常用的技術是鑰匙串,FileVault和數(shù)據(jù)保護仲智。
4.4.1 鑰匙串(Keychains)
鑰匙串類似于物理概念的鑰匙串,它是一個存儲以后用來執(zhí)行加密任務的密鑰和小塊數(shù)據(jù)的地方,但結局是相似的买乃。物理的鑰匙環(huán),主人可以用來掛鑰匙,用它來解鎖。使用鑰匙串,應用程序通常不訪問實際的關鍵數(shù)據(jù)本身,所以即使被入侵他們沒有暴露密鑰的風險钓辆。相反,他們使用一個惟一的標識符來標識這些密鑰,實際的加密算法執(zhí)行在一個單獨的進程中被稱為安全服務器(Security Server)剪验。
因此,鑰匙串在某種程度上更像是一個攜帶密匙環(huán)的全副武裝的守衛(wèi)。你可以問衛(wèi)兵為你開啟一扇你已經被授權進入的門,但你通常不能自己開門前联。
OS X還包括一個實用程序,允許用戶存儲和讀取的鑰匙串中的數(shù)據(jù),稱為鑰匙串訪問(Keychain Access)功戚。這個實用程序之后會有詳細描述,在鑰匙鏈訪問。
4.4.2 FileVault
OS X中似嗤,F(xiàn)ileVault使用加密提供加密存儲用戶的文件啸臀。啟用FileVault時,磁盤只有授權用戶登錄后才進行解密。(注意,OS X v10.7之前,FileVault只保護一個用戶的主目錄)烁落。
4.4.3 數(shù)據(jù)保護(Data Protection)
iOS提供的api允許應用程序文件只能在設備解鎖來保護自己的內容乘粒。與數(shù)據(jù)保護、文件存儲在加密和解密后才用戶輸入他或她的密碼顽馋。
應用程序在后臺運行,也有設置,使文件保持可用,直到用戶關閉設備谓厘。
附錄A:安全服務器和安全代理
OS X和iOS安全實現(xiàn)包含一個守護進程稱為安全服務器,實現(xiàn)幾個安全協(xié)議,如訪問密鑰鏈項和根證書信任管理。OS X還包括一個單獨的用戶代理,稱為安全代理,使用安全服務器顯示用戶界面寸谜。
本附錄簡要描述他們的作用竟稳。
安全服務器(Security Server)
安全服務器(securityd)是一個運行在OS X和iOS上的守護進程,實現(xiàn)幾個安全協(xié)議,如加密熊痴、解密和授權計算(在OS X)他爸。
在OS X和iOS,安全服務器監(jiān)聽各種安全api的消息并執(zhí)行加密服務。因為開發(fā)人員通常使用引用密鑰而不是用自己的密鑰,安全服務器可以保留那些從客戶進程中分離出來的地址空間的密鑰,從而減少意外的信息泄露的風險果善。
作為一個額外的優(yōu)勢,只要蘋果公司引入了新的身份驗證或加密技術,現(xiàn)有的使用OS X安全API的軟件可以不用更改代碼透明地支持它,提供軟件不需要直接導入或導出密鑰诊笤。
安全服務器沒有公共API。相反,你的代碼調用API,如鑰匙鏈服務(Keychain Services);證書(Certificate),密鑰(Key),信任服務(Trust Services);和授權服務(Authorization Services巾陕,只在OS X),依次與安全服務器進行通信讨跟。
安全代理(Security Agent)
安全代理是一個單獨的進程,提供了用戶界面在OS X安全服務器(不在iOS)。它的主要目的是請求身份驗證時應用程序請求額外的特權鄙煤。
安全服務器要求用戶進行身份驗證時,安全代理顯示一個對話框,要求用戶名和密碼晾匠。執(zhí)行此操作的優(yōu)勢在一個單獨的過程是雙重的。首先,應用程序可以在沒有訪問用戶的憑證(例如,用戶名和密碼)時獲得授權梯刚。第二,它使蘋果能夠添加新的身份驗證的形式,而不需要每一個應用程序來了解它們凉馆。
安全代理要求用戶為了進行身份驗證必須在現(xiàn)場。因為圖形用戶界面元素不能通過命令行界面例如終端(Terminal)使用或安全shell(ssh)遠程會話,這一限制使惡意用戶攻擊應用程序的安全更加困難。
注意:iOS安全服務接口不提供身份驗證澜共。因此,安全服務器沒有必要有用戶界面,因此,iOS不提供安全代理向叉。