《HTTPS權威指南》- SSL、TLS和密碼學學習筆記

lyxia_iOS發表於2016-12-18

iOS要開始強制推行HTTPS了,大家都開始學習HTTPS的相關知識,網上很多博文一上來就講對稱加密,非對稱加密,AES,RSA,和TLS和SSL協議。對於我這種沒怎麼深入過網路層的人來說全靠背!理解起來相當痛苦。尤其是對稱加密,非對稱加密,私鑰加密,公鑰加密,證書,數字簽名,TLS和SSL是用來幹嘛的,他們之間的關係,協議握手為啥要那麼多,繞來繞去的,真是傻傻分不清楚。

這篇筆記就是為了理解上面所說的那些概念,知道上面提到的名詞到底是啥意思,之間啥關係,以及最重要最重要的,為什麼協議要那麼多步驟,這些步驟存在的意思是什麼,他為什麼就能實現安全性?他又是怎樣實現安全性的?

目錄:

網路層:


OSI模型層:

層號 OSI層 描述 協議示例
7 應用層 應用資料 HTTP、SMTP、IMAP
6 表示層 資料表示、轉換和加密 SSL/TLS
5 會話層 多連線管理 -
4 傳輸層 包或流的可靠傳輸 TCP、UDP
3 網路層 網路節點間的路由與資料分發 IP、IPSec
2 資料鏈路層 可靠的本地資料連線(LAN) 乙太網
1 物理層 直接物理資料連線(電纜) CAT5

TLS和SSL之間的關係:


SSL協議由Netscape公司開發
1995年年底釋出SSL3
1996年5月TLS工作組成立,開始講SLL從Netscape遷移至IETF
1999年1月TLS1.0面市,為了取悅Microsoft,協議進行了更名(從SSL更成TLS)
2006年4月,TLS1.1問世
...

對稱加密(私鑰加密)


概念:是一種混淆演算法,能讓資料在非安全通道上進行安全通訊。為了保證通訊安全,首先要得到雙方都認可的加密演算法和金鑰(雙方的金鑰相同)
金鑰與加密演算法:
資料在非安全通道上進行安全通訊。為了保證通訊安全,要用到金鑰加密演算法
為何要金鑰?
即使攻擊者知曉了整個密碼系統除金鑰以外的所有情報,系統仍然應當能保證安全

  • 如果加密演算法要得到廣泛使用,就必須讓其他人知道,當越來越多的人知道,那敵人知道的可能性就會增加。
  • 沒有金鑰的簡單演算法不便於在大群體中使用,每個人都可以解密所有人的通訊。
  • 設計出優秀的加密演算法非常困難,一種演算法想要更安全,就得經過更多的曝光和審視。

如果加密演算法足夠優秀,攻擊者只有一種方法,那就是嘗試所有可能的解碼金鑰,俗稱窮舉金鑰搜尋(exhaustive key search),基於這一點,我們可以說密文的安全性完全取決於金鑰,我們通過金鑰長度來衡量加密強度,如128位的金鑰有34*10^37種可能的組合。

密碼:

  • 序列密碼
    核心:生成一串稱為金鑰序列的無窮序列
    加密過程:將金鑰序列中的1位元組與明文序列中的1位元組進行異或操作
    解密過程:因為異或操作可逆,將密文序列中的1位元組與金鑰序列中的相同位元組進行異或操作。
    關鍵點:序列密碼決不能第二次相同的金鑰
    熟知的序列密碼:RC4(簡單,但以不再安全)
  • 分組密碼
    核心:每次加密一整塊資料,只要使用相同的金鑰,每一個可能的輸入組合都有唯一的輸出。因此在輸入上製造一個小變化(例如在任意一處變換1位),從而得到大量變體。
    加密過程:接受輸入並生成看似雜亂無章的輸出。
    問題1:只能使用它們加密長度等於加密塊大小的資料。因此需要一個方法處理任意長度的資料(填充
    問題2:對於相同的輸入,輸出是相同的,這種特性使許多攻擊成為可能。
    實踐中的應用:使用分組密碼模式的加密方案(後面有說明)來使用分組密碼,來避免分組演算法的問題,作為其他加密基元的基礎來使用(例如雜湊函式,訊息驗證,偽隨機數生成器,甚至序列密碼)
    熟知的分組密碼:AES
    • 填充
      追加額外的資料到明文的結尾,在TLS中,加密塊的最後1位元組包含填充長度,指示填充多少位元組(不包含填充長度位元組)

雜湊函式:
定義:任意長度的輸入轉化為定長度的輸出,雜湊函式的結果成為雜湊,適用於密碼學的雜湊函式有以下特性:

  • 單向性:給定一個雜湊,無法找到或者構造出生成它的資訊。
  • 弱抗碰撞性:給定一條訊息和雜湊,無法找到一條不同的訊息具有相同的雜湊。
  • 強抗碰撞性:計算上無法找到兩條雜湊相同的資訊。

使用場合:以緊湊的方式表示比較大量資料,例如比較兩個檔案。經常被稱為指紋,資訊摘要(簡單稱為摘要)
熟知的雜湊函式:SHA1,SHA256

雜湊函式的強度最多隻是雜湊長度的一半

訊息驗證程式碼:
在資料的雜湊與資料本身分開傳輸時(以防攻擊者可以同時修改資料和雜湊),雜湊函式可以用於驗證資料完整性。
用身份驗證擴充套件了雜湊函式的密碼學函式:

  • MAC:只有擁有雜湊金鑰,才能生成合法的MAC
    通常與加密演算法一起使用,如果沒有MAC,那攔截者即使無法解碼密文,也能修改密文。
  • 金鑰的雜湊(keyed-hash):HMAC,將雜湊金鑰和訊息以一種安全的方式交織在一起。

分組密碼模式:
為了加密任意長度的資料而設定的密碼學方案。是分組密碼的擴充套件。所以的分組密碼模式都支援機密性。不過有些將其與身份驗證連線在一起,有些模式會將分組密碼直接轉成序列密碼。
它有多種輸出模式(以下只舉出2個):

  • 電碼本模式(ECB)
    核心:是最簡單的分組密碼模式,它只支援資料長度正好是塊大小的整數倍的情況,如果資料不滿足這個條件就要事先填充。加密就是將資料按塊大小切分,然後分別加密每一塊。
    劣勢:因為分組密碼是確定的(輸入相同,輸出也相同),1、密文中出現的模式對應明文中出現的模式。2、攻擊者可以發現資訊是否重複。3、攻擊者可以觀察密文,並提交任意明文進行加密
  • 加密塊連結模式(CBC)
    基於ECB,SSl和TLS的主要模式,整個過程開始於生成一個隨機初始向量IV,長度與加密塊相等,加密前,明文的第一塊內容與IV進行異或操作,這一步對明文做了掩飾,並保證密文不盡相同。對於下一個加密塊使用上一個塊的密文作為IV,以此類推。

    必須通過線路傳輸到接收端,這是解密必須的。

非對稱加密(公鑰加密)


為什麼要有非對稱加密?
對稱加密無法滿足以下條件:

  • 隨著使用它的團體成員增加,團體中的成員要共享同一個金鑰,因此出現問題的機率變大了
  • 我們可以兩兩一個金鑰,這樣3個人就需要3個金鑰,10個人就需要45個金鑰,1000個人就需要49500個金鑰!

而非對稱加密可以解決以上問題。
使用兩個金鑰,公鑰和私鑰,兩個金鑰之間存在一定的數學關係。
使用公鑰加密,只有對應的私鑰能解。
使用私鑰加密,任何人都可以用他們相應的公鑰解密(不提供機密性,可以用作數字簽名)。
使用說明:你可以廣泛並安全的分享你的公鑰,那麼任何人都可以想你傳送資訊,只有你可以閱讀。如果他們使用各自的私鑰簽名,你還可以精確的知道訊息出自何人之手。

注意:雖然公鑰密碼的屬性非常有趣,但它非常緩慢,不適用於資料量大的場景,因此往往部署於身份驗證和共享祕密的協商,這些祕密後續用於快速的對稱加密。

數字簽名


前面說過MAC就是一種電子簽名,它可以使用事先安全交換的雜湊金鑰驗證真實性,雖然這種校驗非常有用,但仍有不足,因為它仍然依賴於一個私有金鑰。
藉助於公鑰密碼,數字簽名可以實現與現實生活中的手寫簽名類似,我們可以利用公鑰密碼的非對稱性設計出一種演算法,使用私鑰對資訊進行簽名,並使用對應的公鑰驗證它。
實際的方式依照選擇公鑰的驗證密碼而不同,下面以RSA為例:
簽名過程:
1、將需要簽名的文件用雜湊函式得到雜湊。
2、將雜湊和一些後設資料進行編碼,例如使用的雜湊演算法。
3、將編碼使用私鑰加密,其結果就是簽名。
4、追加到文件中作為驗證的依據。
驗證過程:
1、接收方接收文件,並用相同的雜湊演算法算出雜湊。
2、使用公鑰解密,將雜湊解碼出來。
3、對比雜湊演算法是否正確,雜湊的值是否一致。
RSA的強度取決於加密,雜湊以及編碼元件各自的強度。

協議


加密基元本身沒有什麼用,例如加密和雜湊演算法。我們只有將這些元素組合成方案和協議才能滿足複雜的安全需求。

例項場景:
Alice和Bob要通訊。Mallory是個攻擊者。
我們假設協議允許交換任意數量的訊息。因為對稱加密擅長對大量資料進行加密,所以選取我們最喜歡的AES演算法來進行資料加密。使用AES,Alice和Bob可以安全的交換訊息,Malloc看不到他們通訊的內容。但是這還不夠,因為Malloc還可以幹其它事情,例如神不知鬼不覺的修改訊息。為了解決這個問題,我們使用只有Alice和Bob知道的雜湊金鑰計算每個訊息的MAC,在傳送訊息的同時,也傳送訊息的MAC。這時Mallory再也不能修改訊息了,然而他仍然可以丟棄或者重發任意訊息。為了解決這個問題,我們擴充套件協議,為每條訊息標記指定序號。最為重要的是,我們將序號作為MAC計算資料的一部分。如果發現序號出現空缺,就能知道訊息丟了。如果發現序號重複,就檢測重放攻擊。為了得到最佳效果,我們使用某個特殊訊息來標記會話結束。如果沒有這個訊息,Mallory能夠悄悄的結束(截斷)會話。如果所有措施以到位,Mallory最多隻能做到阻止Alice和Bob與其他人通訊。我們對此無能為力。

到目前為止,有一大塊缺失:Alice和Bob如何協商得到需要的兩個金鑰(一個用於加密(AES的金鑰),一個用於檢測完整性(MAC的金鑰)),同時還要當心Mallory?我們通過為協議新增兩個步驟來解決這個問題:

  • 使用公鑰密碼對會話進行身份驗證。
    舉個例子,Alice生成一個隨機數,要求Bob對其簽名以證明真的是他,Bob也要求Alice做同樣的事情。
  • 使用金鑰交換方案對加密金鑰進行祕密協商。
    舉個例子,Alice可以生成所有金鑰,使用Bob的公鑰加密,再傳送給Bob,這就是RSA金鑰交換的工作方式。

最後我們協議完工時的狀態是:

  • 以握手階段開始,包括身份驗證和金鑰交換
  • 資料交換階段,儲存機密性和完整性
  • 以關閉序列結束。

站在巨集觀的角度看,我們的協議與SSL和TLS完成的工作相似。

名詞簡寫及全稱:


SSL:secure socket layer 安全套接字層
TLS:transport layer security 傳輸層安全
IP:internet protocol 網路協議
TCP:transmission control protocol 傳輸控制協議
PKI:public key infrastructure 公鑰基礎設施
OSI:open systems interconnection 開放系統互聯模型
AES:advanced encryption standard 高階加密標準
MAC:message authentication code 訊息驗證程式碼
HMAC:hash-based message authentication 基於雜湊的訊息驗證程式碼
CBC:cipher block chaining 加密塊連結
RSA:en.wikipedia.org/wiki/RSA
ECB:electromic codebook 電碼本
CBC:cipher block chaining 加密塊連結
IV:initialization vector 初始向量

我的簡書主頁:www.jianshu.com/users/b92ab…

相關文章