4 加密服務(Cryptographic Services)
加密服務構成傳輸過程(安全通信)和數據靜止(安全存儲)中保護數據的基礎。使用復雜的數學運算,他們讓你:
- 加密和解密數據,以便它不能被外部觀察者理解
- 確認數據沒有被修改,因為它最初是由通過哈希(hashing),簽名(signing)和驗證(verifying)方法發送
本章描述了這些加密技術并簡要總結了OS X和iOS提供的技術,幫助您在自己的應用程序中使用加密。
4.1 加密和解密(Encryption and Decryption)
加密是一種保護數據的手段,將數據轉換成除了知道如何轉化回去的人之外的人攔截后不可讀。
加密通常用于在傳輸過程和存儲中保護數據。當信息必須通過一個不可信的通信通道發送,它的責任是兩個端點使用加密來保護通信。同樣,在本地磁盤的存儲信息,應用程序可以使用加密來確保信息對于第三方是不可讀即使是電腦被盜了。
有許多不同的加密技術,稱為密碼(ciphers),以不同的方式工作,能起到不同的作用。密碼一般工作結合原始信息(明文cleartext或純文本plaintext)與第二個信息(關鍵key)以某種方式生成一個加密的形式,稱為密文(ciphertext)。
現代加密技術可以分為三大類:對稱加密(symmetric encryption)、非對稱加密(asymmetric encryption)和速記式加密(steganography)。
4.1.1對稱加密(symmetric encryption)
在對稱加密,一個單獨的密鑰(通常是一個隨機字節的長串)用于數學變換信息,然后用于相反的取回原始信息。
對稱加密通常用于安全通信。然而,由于兩個端點必須知道相同的密鑰,對稱加密本身是不夠的。
4.1.2非對稱加密(asymmetric encryption)
在非對稱加密,用兩個數學相關密鑰來轉換的信息。使用一個密鑰加密的信息只能用另一個密鑰來解密,反之亦然。一般來說,其中一個密鑰(私鑰)是保密的,和其他密鑰(公鑰)是由廣泛可用。出于這個原因,非對稱加密也被稱為公鑰密碼學(public key cryptography)。
注意:雖然這兩個密鑰是數學相關,從一個密鑰導出另一個密鑰在計算上被認為是不可能的。公鑰加密的安全取決于這種情況。
非對稱加密通常用于建立一個共享的通信通道。因為非對稱加密計算昂貴,兩個端點(endpoints)通常使用非對稱加密交換對稱密鑰,然后使用較快的對稱加密算法對實際數據加密和解密。
非對稱加密也可以用來建立信任。通過你的私鑰加密的信息,別人能使用你的公鑰讀懂這些信息并確認信息是由你加密的。
4.1.3隱寫術(steganography)
隱寫術意思是隱藏信息在不太重要的另一個信息中。
隱寫術通常用于在照片中存儲版權信息以大量的不可識別的噪音的形式,除非你知道如何去尋找它。
隱寫術也可以用于存儲加密卷下面其他加密或不加密卷(通過使用未使用的塊或利用以微妙的方式誤差修正)。
4.2 哈希散列(Hashing)
散列值,或散列,是一小塊的數據來源于一塊較大的數據,可以作為一個較大的數據的代理。在密碼學中,哈希表用來驗證數據的真實性。加密散列算法本質上是一種(非常)有損數據壓縮,但是他們專門設計,因此兩個相似的數據不太可能散列到相同的值。
例如,兩個小學生經常通過來回傳遞筆記來決定何時一起走路回家。一天,一個惡霸攔截到筆記并且安排鮑勃早十分鐘到達,這樣他可以偷鮑勃的午餐錢。為了確保他們的信息以后沒有被修改,他們設計了一個方案,計算信息中字母的數量除以他們的年齡的總和的余數,然后寫了很多點在消息的角落里。通過計算字母的數量他們可以(粗糙)檢測到信息是否被修改。
當然,這是一個做作的例子。一個簡單的余數是一個很弱的散列算法。好的哈希算法 ,如果你在一塊數據上做一些小小的改變,碰撞時不太可能的。這種篡改,抵抗自然的好的散列算法制作一個關鍵的組件在代碼簽名,消息簽名和其他各種篡改檢測方案中。
在高級別上,哈希散列也類似于核對總和(checksumming)(檢測和糾正傳輸數據錯誤的技術)。然而,這些技術的目標是不同的,所以使用的算法也很不同。校驗和通常設計為允許檢測和修復一個改變或少量的變化。相比之下,密碼散列必須可靠地檢測一段數據的大量的更改但不需要告訴你數據如何改變。
例如,以下shell命令中演示了一個通常的散列算法:
$ echo "This is a test. This is only a test." | sha1sum
7679a5fb1320e69f4550c84560fc6ef10ace4550 -
OS X提供了許多C語言 api來執行散列。這些進一步描述本章結束的引用文章中。
4.3 簽名和驗證(Signing and Verifying)
簽名是一種證明消息真實性的方式,或者驗證服務器,用戶或其他實體的身份。
從前,人們有時用封蠟給信封蓋上郵戳。這種印章不僅證明誰發送消息,也證明了在運輸途中沒有人打開或者修改它。
現代簽署通過數學達到許多相同的好處。除了數據本身,簽名和驗證需要兩條信息:適當的一半的公私密鑰對和一個數字證書。
消息的發送方計算數據的哈希表然后用私鑰加密。收件人也計算哈希表,然后使用相應的公鑰解密發送方的哈希表和并進行比較。如果他們是相同的,在傳輸途中的數據沒有修改,您可以安全地相信數據是由密鑰的所有者發送的。
發送者的數字證書是數據的集合,其中包含公鑰和其他識別信息,在發送者的自由裁量權,例如一個人的名字,公司名稱,域名和郵政地址。證書的目的是把一個公鑰給一個特定的人。如果你信任的證書,那你也相信由那個人發送的使用發送方的私鑰簽名的消息。
提供一種確定證書合法性的方式 ,發送方的證書是由其他人簽名的,他的證書依次被另外的人簽名,等等,形成了一個收件人一直信任的證書的信任鏈,稱為錨證書(anchor certificate)。這個證書可能是根證書--自簽名證書代表一個已知的證書頒發機構,因此樹的根證書來自權威機構或它可能是用戶或應用程序開發人員已經明確指定為信任錨的任意證書,。
因為收件人信任錨證書,收件人知道證書是有效的,因此,發件人是他或她自稱的。收件人信任證書的程度由兩個因素決定:
- 每個證書都可以包含一個或多個證書擴展(certificate extensions)描述如何使用證書。例如,一個可信的證書簽署郵件可能不被信任簽署可執行代碼。
- 信任策略(trust policy)允許您信任證書,否則是不可信的,反之亦然。
證書還可以用于身份驗證。通過簽名一個隨機數(一個為這個目的特別創建的隨機生成的挑戰字符串),用戶或服務器可以證明他,她,或是它擁有與證書關聯的私鑰。如果證書是可信(通過評估其信任鏈),然后證書和簽名的隨機數證明用戶或服務器必須是他,她,或者它聲稱的。
4.4 安全存儲(Secure Storage)
OS X和iOS提供大量的技術安全存儲。其中,三個最常用的技術是鑰匙串,FileVault和數據保護。
4.4.1 鑰匙串(Keychains)
鑰匙串類似于物理概念的鑰匙串,它是一個存儲以后用來執行加密任務的密鑰和小塊數據的地方,但結局是相似的。物理的鑰匙環,主人可以用來掛鑰匙,用它來解鎖。使用鑰匙串,應用程序通常不訪問實際的關鍵數據本身,所以即使被入侵他們沒有暴露密鑰的風險。相反,他們使用一個惟一的標識符來標識這些密鑰,實際的加密算法執行在一個單獨的進程中被稱為安全服務器(Security Server)。
因此,鑰匙串在某種程度上更像是一個攜帶密匙環的全副武裝的守衛。你可以問衛兵為你開啟一扇你已經被授權進入的門,但你通常不能自己開門。
OS X還包括一個實用程序,允許用戶存儲和讀取的鑰匙串中的數據,稱為鑰匙串訪問(Keychain Access)。這個實用程序之后會有詳細描述,在鑰匙鏈訪問。
4.4.2 FileVault
OS X中,FileVault使用加密提供加密存儲用戶的文件。啟用FileVault時,磁盤只有授權用戶登錄后才進行解密。(注意,OS X v10.7之前,FileVault只保護一個用戶的主目錄)。
4.4.3 數據保護(Data Protection)
iOS提供的api允許應用程序文件只能在設備解鎖來保護自己的內容。與數據保護、文件存儲在加密和解密后才用戶輸入他或她的密碼。
應用程序在后臺運行,也有設置,使文件保持可用,直到用戶關閉設備。
附錄A:安全服務器和安全代理
OS X和iOS安全實現包含一個守護進程稱為安全服務器,實現幾個安全協議,如訪問密鑰鏈項和根證書信任管理。OS X還包括一個單獨的用戶代理,稱為安全代理,使用安全服務器顯示用戶界面。
本附錄簡要描述他們的作用。
安全服務器(Security Server)
安全服務器(securityd)是一個運行在OS X和iOS上的守護進程,實現幾個安全協議,如加密、解密和授權計算(在OS X)。
在OS X和iOS,安全服務器監聽各種安全api的消息并執行加密服務。因為開發人員通常使用引用密鑰而不是用自己的密鑰,安全服務器可以保留那些從客戶進程中分離出來的地址空間的密鑰,從而減少意外的信息泄露的風險。
作為一個額外的優勢,只要蘋果公司引入了新的身份驗證或加密技術,現有的使用OS X安全API的軟件可以不用更改代碼透明地支持它,提供軟件不需要直接導入或導出密鑰。
安全服務器沒有公共API。相反,你的代碼調用API,如鑰匙鏈服務(Keychain Services);證書(Certificate),密鑰(Key),信任服務(Trust Services);和授權服務(Authorization Services,只在OS X),依次與安全服務器進行通信。
安全代理(Security Agent)
安全代理是一個單獨的進程,提供了用戶界面在OS X安全服務器(不在iOS)。它的主要目的是請求身份驗證時應用程序請求額外的特權。
安全服務器要求用戶進行身份驗證時,安全代理顯示一個對話框,要求用戶名和密碼。執行此操作的優勢在一個單獨的過程是雙重的。首先,應用程序可以在沒有訪問用戶的憑證(例如,用戶名和密碼)時獲得授權。第二,它使蘋果能夠添加新的身份驗證的形式,而不需要每一個應用程序來了解它們。
安全代理要求用戶為了進行身份驗證必須在現場。因為圖形用戶界面元素不能通過命令行界面例如終端(Terminal)使用或安全shell(ssh)遠程會話,這一限制使惡意用戶攻擊應用程序的安全更加困難。
注意:iOS安全服務接口不提供身份驗證。因此,安全服務器沒有必要有用戶界面,因此,iOS不提供安全代理。