細讀HTTPS -- SSL/TLS歷史,密碼學

細讀HTTPS – SSL/TLS歷史,密碼學

SSL/TLS協議歷史

SSL協議由Netscape公司開發,歷史可以追溯到Netscape Navigator瀏覽器統治互聯網的時代。

  • 第一個版本從未發佈過
  • 第二版即SSL2則於1994年11月發佈。SSL2的開發基本上沒有與Netscape以外的安全專家進行過商討,所以有嚴重的弱點,被認爲
    是失敗的協議,最終退出了歷史的舞臺
  • SSL3於1995年年底發佈,雖然名稱與早先的協議版本相同,但SSL 3是完全重新設計的協議。該設計一直沿用到今天。
  • TLS 1.0於1999年1月問世。儘管與SSL3相比,版本修改並不大,但是爲了取悅Microsoft,協議還是進行了更名,SSL更名爲TLS
  • TLS 1.1於2006年4月發佈,僅僅修復了一些關鍵的安全問題.
  • TLS 1.2於2008年8月發佈,。該版本添加了對已驗證加密的支持,並且基本上刪除了協議說明中所有硬編碼的安全基元,使協議完全彈性化。
  • 協議的下一個版本正在開發過程中。

密碼學

討論密碼學時,我們爲了方便起見,通常會使用Alice和Bob這兩個名,Eve爲一位具備竊聽能力的攻擊者命名,Mallory爲另一位能夠妨礙網絡流量的主動攻擊者命名.

對稱加密

對稱加密(symmetric encryption)又稱私鑰加密(private-key cryptography),是一種混淆算法,能夠讓數據在非安全信道上進行安全通信。爲了保證通信安全,Alice和Bob首先得到雙方都認可的加密算法和密鑰。當Alice需要向Bob發送數據時,她使用這個密鑰加密數據。Bob使用相同的密鑰解密。Eve能夠訪問信道,所以可以看到加密數據;但因爲沒有密鑰,所以看不到原始數據。Alice和Bob只要能保證密鑰安全,就能一直安全地通信,如圖1-1所示。
duicheng
對稱加密的密碼分爲兩大類:序列密碼和分組密碼

  • 序列密碼
    序列密碼的核心是生成一串稱爲密鑰序列(keystream)的無窮序列,看似雜亂無章。加密就是將密鑰序列中的1字節與明文序列中的1字節進行異或操作。因爲異或操作是可逆的,所以解密就是將密文序列中的1字節與密鑰序列中的相同字節進行異或操作。如下圖所示:
    jiami
    RC4是最爲人熟知的序列密碼①。因爲它很快很簡單,所以一度非常流行。但是它已經不再安全。
    只要攻擊者無法預測密鑰序列中對應位置的字節,就可以認爲加密過程是安全的。基於這個理由,序列密碼絕不能第二次使用相同的密鑰,這一點非常關鍵。這是因爲在實際使用中,攻擊者知道或者可以預測特定區域的明文(請思考加密HTTP請求的情景;許多請求的請求法、協議版本、請求頭名稱都是一樣的)。當你知道明文,又觀察到密文時,就可以解析一部分密鑰序列。如果使用了相同的密鑰,那麼就可以解密後續的部分密文。爲了解決這個問題,序列密碼都與從長期密鑰中提取出來的一次性密鑰一同使用。
  • 分組密碼
    一種分組密碼就是一個變換函數:接受輸入並生成看似雜亂無章的輸出。只要使用相同的密鑰,每一個可能的輸入組合都有唯一的輸出。分組密碼的關鍵特性是在輸入上製造一個小變化(比如,在任意一處變換1位),從而得到大量輸出變體。
    分組密碼本身不是非常有用,因爲它們自身有一些限制:
    • 只能使用它們加密長度等於加密塊大小的數據。因此在實際使用分組算法時,需要一個方法處理任意長度的數據。
    • 分組密碼是確定的。對於相同的輸入,輸出也是相同的。這個特性會使許多攻擊成爲可能,需要解決。
    • 實踐中,人們通過稱爲分組密碼模式(block cipher mode)的加密方案來使用分組密碼。
    • 世界上最流行的分組密碼是高級加密標準(advanced encryption standard,AES),可以使用128位、192位和256位的加密強度.
  • 填充
    分組密碼的挑戰之一是處理數據長度小於加密塊大小的數據加密。舉個例子,128位的AES需要16字節的輸入數據並且產出相同長度的出。如果你的數據剛好能歸入16字節的塊中,那正好。但如果不足16字節,怎麼辦?一種方法是追加額外的數據到明文的尾部。這些額外的數據就被稱爲填充(padding)。
    在TLS中,加密塊的最後1字節包含填充長度,指示填充有多少字節(不包含填充長度字節)。填充的每字節都被設置成與填充長度字節同的值,如圖下圖所示。這種方式使得接收方能夠檢查填充是否正確。爲了在解密後丟棄填充,接收方檢查數據塊的最後1字節,刪除它。接着,接收方刪除指定長度的字節數,同時檢查它們是否都是相同的值。
    TLS

分組密碼模式

分組密碼模式是爲了加密任意長度的數據而設計的密碼學方案,是對分組密碼的擴展。所有分組密碼模式都支持機密性,不過有些將其與身份驗證聯繫起來。一些模式會將分組密碼轉換成序列密碼。
它有許多輸出模式,通常以首字母縮寫來引用:ECB、CBC、CFB、OFB、CTR、GCM,諸如此類(不用擔心這些縮寫都代表什麼)。我在這裏只會介紹ECB和CBC:ECB是設計一種分組加密模式的反面例子,而CBC則仍是SSL和TLS的主要模式。GCM是TLS中相對較新的模式,從1.2版本開始才能使用。它提供了機密性和完整性,是當前可用的最好模式。

ECB

電碼本模式(electronic codebook)是最簡單的分組密碼模式。它只支持數據長度正好是塊大小的整數倍的情況,如果數據長度不滿足這個條件,就得事先實施填充。加密就是將數據按塊大小切分,再分別加密每一塊。

CBC

加密塊鏈接(cipher block chaining,CBC)模式是從ECB發展而來的下一步。爲了解決ECB天生的確定性,CBC引入了初始向量(initialization vector,IV)的概念。即使輸入相同,IV也可以使每次的輸出都不相同。
如圖下圖所示,整個過程開始於生成一個隨機IV(因此不可預測),長度與加密塊相等。加密前,明文第一塊內容與IV進行異或操作。這一步對明文進行了掩飾,並保證密文總是不盡相同。對於下一個加密塊,使用上一塊的密文作爲IV,以此類推。這樣一來,每次加密操作都是同一個加密鏈條中的一部分,這也是這種模式名稱的由來。至關重要的是,IV必須通過線路傳送到接收端,這個信息是成功解密所必需的。
CBC

非對稱加密

對稱加密在高速處理大量數據方面做得非常好,然而隨着使用它的團體增加,產生了更多的需求,使得對稱加密無法滿足。

  • 相同團體的成員必須共享相同的密鑰。越多人加入,團體密鑰出現問題的次數就越多。
  • 爲了更好的安全性,你可以在每兩個人之間使用不同的密鑰,但是這個方法不可擴展
  • 對稱加密不能用於訪問安全數據的無人系統。因爲使用相同的密鑰可以反轉整個過程,這樣的系統出現任何問題都會影響到存儲在系統中的所有數據。
    非對稱加密(asymmetric encryption)又稱爲公鑰加密(public key cryptography),它是另一種方法,使用兩個密鑰,而不是一個;其中一個密鑰是私密的,另一個是公開的。顧名思義,一個密鑰用於私人,另一個密鑰將會被所有人共享。這兩個密鑰之間存在一些特殊的數學關係,使得密鑰具備一些有用的特性。如果你利用某人的公鑰加密數據,那麼只有他們對應的私鑰能夠解密。從另一個方面講,如果某人用私鑰加密數據,任何人都可以利用對應的公鑰解開消息。後面這種操作不提供機密性,但可以用作數字簽名。
    moxiang
    RSA(得名於三個人的姓氏首字母:Ron Rivest、Adi Shamir和Leonard Adleman)是目前最普遍部署的非對稱加密算法①。現在推薦的RSA強度是2048位,強度等同於112位的對稱密鑰。

消息驗證代碼

消息驗證代碼(messageauthentication code,MAC)是以身份驗證擴展了散列函數的密碼學函數。只有擁有散列密鑰,才能生成合法的MAC。
((原始消息) + 祕鑰) * 散列函數 = 散列值(消息認證碼)

散列函數

散列函數(hash function)是將任意長度的輸入轉化爲定長輸出的算法。散列函數的結果經常被簡稱爲散列(hash)。編程中普遍使用散列函數,但並非所有散列函數都適用於密碼學。密碼學散列函數有以下幾個額外特性:

  • 抗原像性(單向性)
    給定一個散列,計算上無法找到或者構造出生成它的消息。
  • 抗第二原像性(弱抗碰撞性)
    給定一條消息和它的散列,計算上無法找到一條不同的消息具有相同的散列。
  • 強抗碰撞性
    計算上無法找到兩條散列相同的消息。

散列函數最常用的使用場合是以緊湊的方式表示比較大量數據。比如,爲了避免直接比較兩個文件(可能很難,比方說,它們存放於世界上不同的位置),你可以比較它們的散列。散列函數經常被稱爲指紋、消息摘要,或者簡單稱爲摘要。
現在使用最爲廣泛的散列函數SHA1,它的輸出是160位。因爲SHA1已經變弱,所以建議升級爲SHA256的變種.

數字簽名

數字簽名(digital signature)是一個密碼學方案。它使得驗證一條電子消息或者一篇電子文檔的真實性成爲可能。前面描述的MAC就是一種電子簽名,它可以利用事先安全交換的散列密鑰驗證真實性。
以RSA爲例。RSA可以用於加密,也可以用於解密。如果使用RSA私鑰加密,那麼僅能通過對應的公鑰解密。我們可以利用這個性質,並且結合散列函數,實現數字簽名。

  1. 計算希望簽名的文檔的散列。不論輸入文檔的長度如何,輸出長度總是固定的。比如,使用SHA256就是256位。
  2. 對結果散列和一些額外的元數據進行編碼。比如,接收方需要知道你使用的散列算法,否則不能處理簽名。
  3. 使用私鑰加密編碼過的結果散列,其結果就是簽名,可以追加到文檔中作爲身份驗證的依據。
  4. 接收方接收文檔並使用相同的散列算法獨立計算文檔散列。接着,她使用公鑰對消息進行解密,將散列解碼出來,再確認使用的散列算法是否正確,解密出的散列是否與本地計算的相同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章