SSL與TLS

第一章 與安全有關的概念

1.1 介紹
提供有關通信安全和密碼學的基本介紹。

1.2 因特網威脅模型
1.2.1 第一件事就是定義威脅模型(thread model)。它描述了攻擊者可望擁有的資源以及可
望採用的攻擊。幾乎每一種安全系統都受制於某種威脅。因此在定義安全威脅時,關心的不
止是定義所擔心的各種攻擊,還要定義我們不準備關心的攻擊。使得保障的安全的代價切合
實際,物有所值。採用的安全措施應當以實現它們的花費不超過預期的風險爲準。
1.2.2 判斷不出可接受風險,也就設計不出可接受的系統。
1.2.3 風險計算的部份工作就是評估攻擊者實施指定攻擊所花費的努力,而每阻止一種攻擊
類型通常都會增加開銷。沒有任何一種安全系統可以阻擋任何攻擊。安全模型的功能就是讓
設計者判斷哪些攻擊值得阻止。
1.2.4 準確估計所必須的安全需要對攻擊者能力的準確估算。如果一種原先以爲不切實際的
攻擊現在被發現實施起來很簡單,那麼就會存在一個暴露安全缺陷的窗口,需調整自身的安
全模型和實現以彌補相應的缺陷。

1.3 角色
通信雙方分別稱作Alice and Bob ,它是沿用RSA論文[Rivest1979]中的名字,攻擊者還是被
稱爲攻擊者(the attacker)。

1.4 安全目標
通信安全由許多不同的但卻又相互關聯的特性構成。最爲有用的劃分是將其分成以下三個主
要類別:
1、保密性(confidentiality)
2、信息完整性(message integrity)
3、端點認證(endpoint authentication)

1.5 必要的裝備
密碼學(Cryptology)是一種設計各種用以提供安全的算法的理論。
密碼術(Cryptography)研究使用這些算法來保證系統和協議的安全。

加密(Encryption)算法。其思想是簡單的,它接收一些數據(稱爲明文),並在密鑰(key)
的控制下將其轉換成密文(ciphertext)。它被視爲純粹提供保密性。好的加密算法完全應當
由可能的密鑰數量決定其安全與否。算法的安全應當只依賴於密鑰的保密,算法的保密不應
當是安全性的必要條件。
由於發送者和接收者使用同一密鑰(這個密鑰必須保密),所以也稱之爲祕密密鑰加密(secret
key cryptography),與公用密鑰加密
(public key cryptography)形成對照。
最爲流行的加密算法包括數據加密標準(DES)[NIST1993a],Triple-DES(三重DES)
[ANSI1985],RC2[Rivest1998]和RC4。

消息摘要
消息摘要(Message Digest)是一種函數,它接收一個任意長度消息爲輸入,併產生一個表
示消息特徵的定長字符串。它的最重要屬性就是不可逆性(irreversibility)。給字摘要什,要
想計算出它所對應的消息應當是極其困難的。第二個重要屬性就是要想產生具有相同的兩條
消息M and M'應當是困難的。該屬性被稱爲抗衝突性(collision resistance)。實際上,任何
抵禦衝突發生的消息摘要的強度只有摘要值的一半,因些一個128位的摘要值避免發生衝突
的強度只有64位,也就是說需要大約2的64次方次操作纔會產生一次衝突。因此,在選擇
摘要值長度時的限定常常是抵禦衝突的強度,而不是抵禦可逆性的強度。
消息摘要的首要用途是用於計算數字簽名(digital signature)和信息驗證碼(MAC)。
使用最廣泛的消息摘要算法爲消息摘要5(MD5)[Rivest1992]和安全散列算法1(SHA-1)
[NIST1994a]。

MAC(message authentication codes信息驗證碼)
假設Alice與Bob共享一個密鑰,Alice 想給 Bob發送一條消息,而Bob將會知道它是Alice
發送的,如果她加密的話,只需將他們共享的密鑰用做加密密鑰即可。但是,這種方法並不
能提供任何消息未被篡改的真正保證。只能保證消息來自Alice。我們需要一種新的工具。
這就是MAC。它類似於摘要算法,但它在計算的時候還要採用一個密鑰,因此MAC同進
依賴於所使用的密鑰以及要計算其MAC的信息。
儘管存在許多基於各種摘要算法來構造MAC的嘗試,但是因特網安全團體似乎就一種稱爲
HMAC[Krawczyk1997]的構造方法達成一致。這種方法描述瞭如何基於滿足某種合理假定摘
要來創建具有可證明的安全特性的MAC,SSLv3中使用的中一種HMAC的變種,真正的
HMAC在TLS中使用。

密鑰管理問題
Alice拿到我們的消息,使用共享密鑰對信息進行加密,添加一個也是基於該密鑰構造的
MAC並將其發送給Bob。Bob收到消息,知道發送這條消息的只有Alice,因爲只有Alice
才具有創建消息上的MAC時所需的密鑰。而且能確認信息沒有被篡改。
這種共享密鑰的方式存在問題,存在很多的密鑰,使用不方便。而且更重要的是需進行密鑰
交換,由於以電子方式交換密鑰是很不安全,所以你實際上必須與每一個與之通信的人會面。
這爲通過因特網購買商品設置了障礙。

KDC(密鑰分發中心)
針對密鑰管理問題最流行的解決方案就是公共密鑰加密(public key cryptography,PKC)。將
在下一節講述,不過也存在一種只使用目前爲止所討論的工具來解決密鑰管理問題的措施。
基本思想是利用受信任的第三方,我們委託它對與我們通信的各方進行認證。這種第三方通
常是由網絡上一種安全主機來實現的,這臺機器被稱爲密鑰分發中心KDC。每個需要保密
通信安全的個人都與KDC共享一個密鑰。當Alice 與 Bob通信時。她就給KDC發送消息,
該消息以其與KDC共享的密鑰加以保護,請求與Bob通信。KDC產生一個新的用於Alice
與Bob之間進行通信的加密密鑰,再將其放在一條稱爲許可證(ticket)的消息中返回。
一條許可證消息由兩條消息組成。一條給Alice,其中帶有新密鑰。另一條給Bob,其中也
包括新密鑰,通信時用Bob的密鑰加密。Alice將許可證中Bob的那部份轉交給Bob,現在
兩者共享密鑰。這種基礎版由Needham 和 Schroeder[Needham 1978]發明。但是部署最爲廣
泛的變種稱爲
Kerberos。在MIT及其它地方大量應用於認證與加密。

公共密鑰加密
在一篇名爲“密碼術新動向”[Diffie1976]的論文中,Whitfield Diffie and Martin Hellman提出
了現在稱之爲公用密鑰加密的方案,基本思想是設計一種在加密和解密時使用不同密鑰的函
數。你公共自已的加密密鑰(公鑰),但解密密角(私鑰)要保密。由於公用與私用密鑰不
同,公用密鑰加密也叫非對稱加密,而共享密鑰加密有時稱爲對稱加密)。
PKC在針對問題的認證部份也有一套解決方案。你的私鑰可用來創建數字簽名。它與MAC
的關係如同公共密鑰加密與祕密密鑰加密之間的關係一樣。你使用私鑰對消息進行簽名,而
接收方用你的公鑰來驗證你的簽名。數據字簽名有一項MAC所不具備的重要屬性,不可抵
賴性(nonrepudiation)。發送和接收雙方都可以產生MAC,但只有數字簽名者才能夠產生
簽名。這樣,接收者就可以證明發送方對消息進行了簽名而送方無法抵賴。

證書
公鑰密鑰加密也存在密鑰管理的問題,公鑰要如何交換?如果以電子方式交換,就會存在安
全問題,攻擊者能在公鑰傳遞過程中篡改。中間人攻擊(man-in-the-middle attack)就是其
中一種攻擊方式。如果物理方式印刷出來,則很不方便。解決方案是通過稱之爲證書授予權
的第三方(certificate authority,CA)。CA發佈以其私用密鑰簽名的目錄。在實際應用中,CA
不是對目錄進行簽名,而是對包含密鑰屬主及其公用密鑰的單一信息進行簽名。這些信息稱
爲證書(Certificate)。證書的主要標準爲X.509[ITU1988a]。rfc是rfc2459。
CA的公用密鑰以物理方式發佈。不過CA並不多而且不經常變換密鑰,因此這在實際應用
中是不成問題的。
證書的基本結構:
1、證書包含頒發者名稱(issuer name),也就是證書籤名者的名。
2、主體名稱(subject name),證書所擔保的密鑰的持有者。
3、主體公鑰(subject public key),即密鑰本身。
4、一組控制信息。諸如有效期限,序列號以及對整個數據對像的簽名。
涉及證書的公鑰解決方案仍然要包含受第三方,即CA。但修正的PDC的主要問題,由於
同一個證書可以用來向任何人證明其公鑰,所以CA沒有必要爲了讓雙方通信而始終處於聯
機狀態。同時因爲CA無法存取任何人的私鑰,所以也不能讀取任何信息。

DN標識名
證書中的主體名稱及頒發者名稱爲x.500標識名(Distinguished Name,DN)[ITU1988b]。標
識名的目的是爲每個網絡實體提供一個惟一的名字。爲了達到這個目的,DN具有一種分層
的結構,一個DN由一系列RDN(relative distinguished name,相對標識名)構成,RDN又由
一系列屬性-值斷言(attribute-value assertion,AVA)構成 。例如:C=CHINA O=COMPANY
OU=TIGERHEAD CN=IT。

擴展
證書包含一組標準值,但可擴展,其中最重要的擴展爲:
1、 subjectAltName,包含這個用戶的其它名稱。可能是其它DN,dNSName(dns hostname) and
2、 emailAddress。
2、keyUsgae,包含了該密鑰可接受用途的屏蔽位,這些用途包括簽名,加密等。
3、 extendedKeyUsage,允許包含一組任意對象標識(oid)的列表。這個列表具體描述該密鑰的
4、 用途。

證書的撤消
利用證書撤消列表(Certificate Reveocation List,CRL)。

ASN.1,BER AND DER
ASN.1是抽象語法記法1,其基本思想是爲描述數據結構而創建的一種允許通過機器來產生
數據編碼解碼器的系統。它可以將數據格式描述爲結構化類型的語言。這非常類似於C中
的struct和java中的類。與我們有關的ASN.1編碼規則爲BER(Basic Encoding Rules)基
本編碼規則和DER(Distinguished Encoding Rules)辯識編碼規則。DER是BER的子集。

OID(object identifiers,對象標識符)。它是分配給任何種類對象的全局惟一的字節字符串,
如算法,密鑰用途等。OID空間是邦聯性的----ISO將OID空間的各區段分配給各種不同的
實體,這些實體還可以進一步針對其它實體對空間進行劃分。

1.6 組合起來使用
所有通信安全技術都是根據加密,摘要計算,公用密鑰加密和數字簽名中的一種來構造。這
些技術常被稱爲安全原語(security primitive),組合使用這些原語可以構造出更爲複雜的結
構。

組合公用密鑰加密和對共享密鑰加密的方法提供了對消息的快速加密,同時又具有基於證書
的密鑰管理的好處。

組合使用信息摘要和數字簽名提供了消息完整性和發送方認證而不必共享密鑰。

1.7 簡單的安全消息系統
發送過程:
1、Alice計算出消息摘要。
2、對消息摘要進行簽名並將產生的數字簽名與其證書一起附在消息上。
3、產生一個隨機會話密鑰,使用它來加密經過簽名的消息,即證書和簽名。
5、 最後,用Bob的公用密鑰對會話密鑰進行加密並將處理過和會話密鑰附到消息上,現在
6、 就可把消息發給Bob。
接收過程:
1、Bob使用其私用密鑰對會話密鑰解密。
2、他使用會話密鑰對消息,即證書和數字簽名進行解密。
3、計算出消息的摘要值。
4、對Alice的證書進行驗證並取出Alice的公用密鑰。
5、使用Alice的公用密鑰來驗證Alice的數字簽名。

1.8 簡單的安全通道
剛纔的系統在發送單條消息的情況下工作得很好,如E_mail。但是如果我們要的是一條可
以在其上傳輸任意信息的通信通道的話,這個系統就不行了。我們希望能建立一組可以在整
個連接中使用的密鑰。這相就不必爲每個數據包動用開銷昂貴的公用密鑰操作。這對於交互
式應用猶爲重要。這種應用中的每次擊鍵都有可能產生數據包。

構建一個簡單協議,實現安全通道。
基本步驟:
握手(Handshake)。Alice 和 Bob使用他們的證書和私用密鑰來對對方進行認證並交換共享
密鑰。
導出密鑰(Key derivation)。Alice 和 Bob使用達成一致的共享密鑰導出一組加密密鑰,以用
於對傳輸進行保護。
數據傳輸(Data transfer)。將要傳輸的數據分割成一系統的記錄(recode),並對每條記錄單獨
加以保護。這樣使用數據一準備好就可以傳輸,一旦接收就可以進行處理。
關閉連接(Connection closure)。使用特殊的、經過保護的關閉信息,來安全地關閉連接。阻
止攻擊者僞造關閉操作而截斷正在傳輸的數據。

簡單握手
1、Alice產生一個隨機數作爲MS(master secret),用Bob的公用密鑰加密MS,產生EMS
(encryted master secret,加密主密鑰)。如果Bob不在意Alice的身份的話。就可以把EMS
發送給Bob了,繼而就可以開始進行通信了,這種方式稱做單向認證。如果Bob經營的是
因特網商店,且只要求Alice的信用卡信息的話,這種認證就可以了。如果需要確認Alice
的身份,Alice就要用其私鑰對EMS進行簽名。Bob會將一個nonce的隨機數連同他的證書
一起發送給Alice。這樣做是爲了阻止攻擊者重新傳送Alice發給Bob的所有信息。這種攻
擊叫重放攻擊(replay attack)。我們在製作密鑰時要用來這個nonce,以確保本次握手所產
生的密鑰與其它握手所產生的密鑰不同。

簡單的數據傳輸協議
在握手結束後,Alice 和 Bob就會共享一個主密鑰,但爲了讓他們能安全傳輸數據,我們
還需做一些工作。第一件就是製作一些密鑰。一般來說,使用同一種密鑰來完成不止一種類
型的加密操作是不安全的。如果使用不同密鑰,那麼即使加密被攻破,MAC也仍然是安全
的。在這種情況下,我們需要四個密鑰,一對用於完成在每個方向上的加密,一對用於完成
每個方向上的MAC。使用KDF(key derivation function,密鑰導出函數),從主密鑰及nonce
中創建相應的密鑰。
Ecs 用於將數據從客戶端發送到服務器端的加密密鑰。
Mcs 用於從客戶端發送到服務器端數據的MAC密鑰。
Esc 用於將數據從服務器端發送到客戶端的加密密鑰。
Msc 用於從服務器端發送到客戶端數據的MAC密鑰。

數據記錄
下一項任務是描述如何對數據打包。我們將數據分割成一系列的記錄,每條記錄攜帶有自已
的MAC,在讀取一條記錄並檢查其MAC時就可以知道數據是否完好。當我們從線路上將
數據讀取過來時,需要能夠知道哪些數據字節是加密的,哪些是MAC。所以需要確定記錄
的格式。定長記錄效率低,我們採用變長記錄。記錄的格式如下:長度|數據|MAC。

客戶端想要加密長度爲L的數據塊D的話,要經以下過程:
1、使用Mcs計算出數據的MAC。稱這爲MAC M。
2、使用Ecs加密D,我們稱之爲C。
3、傳輸。L||C||M。 長度||數據||MAC。

服務器端讀取數據則要經歷相反的過程:
1、從線路上讀取L,我們現在知道D爲L字節長。
2、從線路上讀取C和M。
3、使用Ecs對C進行解密從而得到D。
4、使用Mcs計算得出D的M'。
5、如果M'=M,那麼一切正常。對記錄進行處理,否則報告錯誤。

MAC的計算公式如下:
發送: M = MAC(Mx,D) x爲cs or sc
接收: M' = MAC(Mx,D)

序號
但這種簡單的協議存在一種安全漏洞,由於記錄並沒有按照傳輸的順序進行標註,因此攻擊
者可以從線路上拿掉一條記錄,轉而再發送給接收者(重放攻擊)。爲克服這種問題,我們
需要使用序號(sequence number)。每一方所傳送的第一條記錄都被編號爲1,第二條爲2。
當你收到一條記錄後,可通過檢查其序號,看是否你所期望的數據,如果不是,則報錯。序
號必須要成爲MAC輸入的一部份,以防止攻擊者對序號進行更改。最簡單的方法是把序號
添加到D的前面,然後再進行加密和計算MAC。不過,如果我們是在可靠的協議(TCP)
上進行通信,那麼序號是隱含的,甚至就不必再傳了。消息總是按序接收的。因此我們只需
在各方維護一個計數器,並使用它來作爲MAC計算的一部份。
M = MAC(Mx,Sequence||D)
數據記錄的格式變成了:長度|序號|數據|MAC
注意:序號並不能阻止攻擊者重新Alice的所有消息,但是,由於Bob每次同Alice握手都
生成一個新的nonce。如果攻擊者嘗試這種攻擊的話,Bob會產生一組不同的密鑰(由於nonce
不同),於是當攻擊者對數據進行解密時,所得到的不是明文,而是垃圾信息。

控制信息
還存在一個安全問題,攻擊者很容易僞造數據包,而tcp連接的關閉只不過是一個數據包而
已。因此攻擊者可以僞造連接關閉。實施截斷攻擊(tuncation attack)。在這種攻擊中,攻擊
者使一方或雙方確信數據這這麼多,卻比實際少。爲了克服這個問題,我們需要讓Alice告
訴Bob她已完成數據發送的方法。一種簡單的實現是根據每條記錄運載的數據,即普通信
息還是控制信息,規定其類型。並把它作爲MAC的輸入。這樣記錄格式就變爲:長度|序號
|類型|數據|MAC
M = MAC(Mx,Sequence||Type||D)

總結
以上內容複述了ssl的絕大部份核心功能。實現了握手,密鑰交換,相互認證以及保密數據
傳輸。但並不完整,它所沒有的最重要的一項內容就是磋商(negotiation)功能,我們需要
爲每種核心任務提供多種算法選擇。以便在一種算法被攻破的情況下切換至另一種算法。

1.9 出口形式
美國的出口政策由NSA(國家安全局)負責。NSA具有保證政府通信安全和竊聽他人通信
的職責。

1.10 實際的加密算法

1.11 對稱加密:序列密碼(stream cipher)
惟一受到廣泛關注和應用的序列密碼是RC4。

1.12 對稱加密:分組密碼(Block Cipher)
DES(數據加密標準)。具有56位密鑰的64位分組密碼。數據以8字節大小的分組進行加密,
且密鑰空間爲56位。DES是脆弱的,只適用於低價值或短生存期的信息。
3DES(三重數據加密標準)。
RC2
AES(高級加密標準)
總結:RC4速度最快,而3DES和RC2相當慢。

1.13 摘要算法
就協議設計而言,所有摘要算法都非常相似,唯一的區別是輸出尺寸的不同。兩種最流行的
算法爲由Ron Rivest設計的MD5。以及由NIST設計的SHA-1。兩者比較
MD5 輸出128位 65Mb/s
SHA-1 輸出160位 31Mb/s

1.14 密鑰的確立
RSA用來做爲一種密鑰傳輸算法。DH(Difie-Hellman)是一種密鑰磋商算法。

RSA算法在1977年由Ron Rivest,Adi Shamir and Len Adleman(RSA的由來)發明,從高層上
講,RSA非常簡單,每個用戶都有一個公用密鑰和一個私用密鑰。公鑰可自由發佈,而私
鑰則必須保密。
RSA公鑰由兩個數據組成。即模數(n)和公共指數(e)。模數爲兩個非常大的素數(p and
q)的乘積,而p and q也需要保密。RSA的安全性就是基於對n進行因數分解以得到p and
q的難度。
RSA私鑰爲另一個數字,通常稱爲d,且只有在知道p,q,e的情況下才能計算得到。當我們
談論RSA密鑰長度時,實際上是在談論模數的長度。RSA的公共指數e必須與e和p-1 ,q-1
互素。爲方便起見,通常挑選幾個小素數中的一個作爲e(常常是3,17或65537)。使用一
個小的e,可以使得公用密鑰的操作更快一些。選定e後,就可以像下面這樣計算得到d:
d = e^-1 mod((p-1)(q-1))

DH是首個公開發表的公用密鑰算法。它是一種密鑰磋商算法,而不是密鑰交換算法。

1.15 數字簽名
要進行簽名,就要計算出消息的摘要值,並使用其私鑰進行“加密”,接收方對摘要值進行
“解密”,並將其與根據消息獨立計算出的摘要值進行比較來驗證,如果匹配,則簽名就是
有效的。
RSA 和 DSS可用一數字簽名

1.16 MAC
MAC的唯一一種算法是HMAC。它使用散列算法來構造具有可證明安全特性的MAC。

1.17 密鑰長度
密鑰長度並不意味着一切。它只是一種通常的衡量方法。
對稱密鑰
攻擊一種設計良好的對稱密碼的惟一方法就是嘗試每個密鑰,直到找到能行的那個。
非對稱密鑰
攻擊RSA最好的方法是對模進行因數分解。一般來講,768或1024位長度的RSA密鑰是
最少可接受的密鑰長度。1024位的非對稱密鑰大約與80位對稱密鑰的強度一致。

1.18 總結
對於非交互系統(消息傳遞)應用來說,我們產生自主式的消息,使用公共密鑰加密來保護
用來加密消息的密鑰,並與數據簽名配合,使用消息摘要來提供消息完整性。
對於北交互系統應用來說,我們通過握手來確立密鑰,然後再使用對稱算法。在握手期間使
用公共密鑰加密對雙方進行認證,並實現密鑰交換,然後通過對稱密鑰加密技術使用那些密
鑰來保護單條數據記錄。

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章