兩種密鑰協商和交換的方法及解析

        進行安全通信之前,各用戶間需要確立加密程序的細節,尤其是密鑰。在對稱密鑰加密系統,各用戶間需要確立共同使用的單一密鑰,此步驟即密鑰交換。交換對稱密鑰必須透過另一安全的通信管道進行;否則,如果以明文形式在網絡發送,將使竊聽者能夠立即得知密鑰以及據其加密的數據。以前,交換密稱密鑰是非常麻煩的,可能需要使外交郵袋等安全渠道。

         公開密鑰加密的出現大大減輕了交換對稱密鑰的困難,公鑰可以公開(透過不安全、可被竊聽的渠道)發送,用以加密明文。不過,公鑰加密在在計算上相當複雜,性能欠佳、遠遠不比對稱加密。

         因此,在一般實際情況下,往往通過公鑰加密來隨機創建臨時的對稱祕鑰,亦即對話鍵,然後才通過對稱加密來傳輸大量、主體的數據。(也叫混合加密算法)

密鑰交換/協商機制的幾種類型

  • 依靠非對稱加密算法
  • 原理:拿到公鑰的一方先生成隨機的會話密鑰,然後利用公鑰加密它;再把加密結果發給對方,對方用私鑰解密;於是雙方都得到了會話密鑰。

  • 舉例:RSA

  • 依靠專門的密鑰交換算法
  • 原理:這個原理比較複雜,一兩句話說不清楚,待會兒聊到 DH 的那個章節會詳談。

  • 舉例:DH 算法及其變種(ECDH算法

基於 RSA 的密鑰協商

概述:這大概是 SSL 最古老的密鑰協商方式——早期的 SSLv2 只支持一種密鑰協商機制。

RSA 是一種【非】對稱加密算法。特點是:加密和解密用使用【不同的】密鑰。

並且“非對稱加密算法”既可以用來做“加密/解密”,還可以用來做“數字簽名”。

密鑰協商的步驟

  1. 客戶端連上服務端
  2. 服務端發送 CA 證書給客戶端
  3. 客戶端驗證該證書的可靠性
  4. 客戶端從 CA 證書中取出公鑰
  5. 客戶端生成一個隨機密鑰 k,並用這個公鑰加密得到 k’
  6. 客戶端把 k’ 發送給服務端
  7. 服務端收到 k’ 後用自己的私鑰解密得到 k
  8. 此時雙方都得到了密鑰 k,協商完成

如何防範偷窺(嗅探)

  • 攻擊方式1

    攻擊者雖然可以監視網絡流量並拿到公鑰,但是【無法】通過公鑰推算出私鑰(這點由 RSA 算法保證)

  • 攻擊方式2

    攻擊者雖然可以監視網絡流量並拿到 k’,但是攻擊者沒有私鑰,【無法解密】 k’,因此也就無法得到 k

如何防範篡改(假冒身份)

  • 攻擊方式1

    如果攻擊者在第2步篡改數據,僞造了證書,那麼客戶端在第3步會發現(這點由證書體系保證)

  • 攻擊方式2

    如果攻擊者在第6步篡改數據,僞造了k’,那麼服務端收到假的k’之後,解密會失敗(這點由 RSA 算法保證)。服務端就知道被攻擊了。

基於 DH 的密鑰協商

概述:DH 算法又稱“Diffie–Hellman 算法”。這是兩位數學牛人的名稱,他們創立了這個算法。該算法用來實現【安全的】“密鑰交換”。它可以做到——“通訊雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰”。這句話比較繞口,通俗地說,可以歸結爲兩個優點:

  1. 通訊雙方事先【不】需要有共享的祕密。
  2. 用該算法協商密碼,即使協商過程中被別人全程偷窺(比如“網絡嗅探”),偷窺者也【無法】知道協商得出的密鑰是啥。

但是 DH 算法本身也有缺點——它不支持認證。

也就是說:它雖然可以對抗“偷窺”,卻無法對抗“篡改”,自然也就無法對抗“中間人攻擊/MITM”(前一篇已經強調過——缺乏身份認證,【必定會】遭到“中間人攻擊/MITM”)。

爲了避免遭遇 MITM 攻擊,DH 需要與其它簽名算法(比如 RSA、DSA、ECDSA)配合——靠簽名算法幫忙來進行身份認證。當 DH 與 RSA 配合使用,稱之爲“DH-RSA”,與 DSA 配合則稱爲“DH-DSA”,以此類推。

反之,如果 DH 【沒有】配合某種簽名算法,則稱爲“DH-ANON”(ANON 是“anonymous”(匿名)的簡寫)。此時會遭遇“中間人攻擊/MITM”。

關於該算法具體數學原理,可以參見迪菲-赫爾曼密鑰交換

密鑰協商的步驟

  1. 客戶端先連上服務端
  2. 服務端生成一個隨機數 s 作爲自己的私鑰,然後根據算法參數計算出公鑰 S(算法參數通常是固定的)
  3. 服務端使用某種簽名算法把“算法參數(模數p,基數g)和服務端公鑰S”作爲一個整體進行簽名
  4. 服務端把“算法參數(模數p,基數g)、服務端公鑰S、簽名”發送給客戶端
  5. 客戶端收到後驗證簽名是否有效
  6. 客戶端生成一個隨機數 c 作爲自己的私鑰,然後根據算法參數計算出公鑰 C
  7. 客戶端把 C 發送給服務端
  8. 客戶端和服務端(根據上述 DH 算法)各自計算出 k 作爲會話密鑰

如何防範偷窺(嗅探)

嗅探者可以通過監視網絡傳輸,得到算法參數(模數p,基數g)以及雙方的公鑰,但是【無法】推算出雙方的私鑰,也【無法】推算出會話密鑰(這是由 DH 算法在數學上保證的)

如何防範篡改(假冒身份)

  • 攻擊方式1

    攻擊者可以第4步篡改數據(修改算法參數或服務端公鑰)。但因爲這些信息已經進行過數字簽名。篡改之後會被客戶端發現。

  • 攻擊方式2

    攻擊者可以在第7步篡改客戶端公鑰。這步沒有簽名,服務端收到數據後不會發現被篡改。但是,攻擊者篡改之後會導致“服務端與客戶端生成的會話密鑰【不一致】”。在後續的通訊步驟中會發現這點,並導致通訊終止。

    (協議初始化/握手階段的末尾,雙方都會向對方發送一段“驗證性的密文”,這段密文用各自的會話密鑰進行【對稱】加密,如果雙方的會話密鑰不一致,這一步就會失敗,進而導致握手失敗,連接終止)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章