https方面知識的理解

eg756 9年前發布 | 18K 次閱讀 Web服務器 HTTPS

開篇

相信程序猿們都有所了解https,就我個人而言一個月前我只知道https連接是安全的,加密了的,但是具體怎么加密的,證書是怎么認證的,為什么安全,我說不出來一二三。如果你跟我有一樣的情況,那我們一起來探明它吧。

https連接過程

我們先來個簡明概要的:

超簡版

  1. 客戶端(瀏覽器) -> 服務器(網站): hello服務器 , 加密算法a,b,c,hash算法d,e,f,ssl版本x.x
  2. 服務器(網站) -> 客戶端(瀏覽器):選擇a加密算法 和e hahs算法,我的證書
  3. 客戶端 (瀏覽器)-> 服務器(網站):hash值hash1,消息message1,加密了的隨機數secret1
  4. 服務器(網站) ->客戶端(瀏覽器):hash值 hash2 消息message2
  5. 后續開始加密通信
  6. </ol> </blockquote>

    看完之后,是不是啥也沒懂,O(∩_∩)O哈哈~,不要急,接著看下更詳細的,記得要跟上面的對比下:

    詳細版

    1. 客戶端向服務器say hello

      客戶端(瀏覽器) -> 服務器(網站):hello服務器,我支持a,b,c 加密算法和 d,e,f hash算法,支持ssl版本是 x.x

      </blockquote> </li>

    2. 服務器收到后,選擇一組算法連帶著證明自己的證書一并發送給客戶端

      服務器(網站) -> 客戶端(瀏覽器):我選擇 a 加密算法 和 e hash算法 還有我的證書(表明公鑰,有效期,擁有者,簽名者 bla,bla)

      </blockquote> </li>

    3. 客戶端驗證證書的合法性,生成一個隨機數 123,將要發送的消息(hello)使用e hash算法,算好hash值 hash1 ,使用加密算法a ,用隨機數加密要發送的消息(hello)得消息message1,用證書中的公鑰加密隨機數得 secret1

      客戶端 (瀏覽器)-> 服務器(網站): hash值hash1,消息message1,加密了的隨機數secret1

      </blockquote> </li>

    4. 服務器用自己的私鑰將secret1解密得隨機數123,再使用隨機數123通過加密算法a 解密消息message1得到hello,再通過算法e 算出消息hello的hash值 hash1,與傳過來的hash值比對一致,正確。 一致之后,服務器自己選擇一條消息(hello,too),使用hash算法e 算出hash值 hash2,使用隨機數123加密消息(hello,too)得消息message2

      服務器(網站) ->客戶端(瀏覽器):hash值 hash2 消息message2

      </blockquote> </li>

    5. 驗證成功

      后續開始加密通信,使用的是隨機數123和加密算法 a 來加密要通信的信息,并用hash算法 e 來計算要通信的信息

      </blockquote> </li> </ol>

      好了,大致通信就是這個過程,當然上述還有很多地方需要解釋,只是想給大家一個宏觀上的流程,之后我會一一列舉解釋的。

      • 保護世界的算法-RSA算法
      • 對稱加密和hash算法
      • 偽隨機數,猜不透的偽隨機
      • 信任是根本-證書,CA認證
      • </ul>

        保護世界的算法-RSA算法

        這個標題起的太霸氣了,但對RSA來說真的是當之無愧。因為https的安全就是基于RSA算法不會被攻破的基礎上的,如果以后RSA算法可以被攻 破,那計算機的世界就沒有安全可言了。算法原理我自己還沒弄的十分懂,所以我就不班門弄斧了,我能理解的就是,RSA算法是一種非對稱算法,什么又是非對稱算法呢?就是加密和解密不用同一個密鑰,分公鑰和私鑰,你用公鑰加密只能用私鑰才能解密,反之同理私鑰加密只能用公鑰解密。如果想了解原理,附上,阮一峰的網絡日志-《RSA算法原理(一)》,話說解釋的已經很好了,但是我還是沒太懂o(╯□╰)o,數學真是捉急啊。

        對稱加密和hash算法

        對稱加密,相比于非對稱加密就是,加密解密都需要同一個密鑰,目前主流的有:DES、3DES、AES 等等。 hash算法,其實這個也好解釋,像我們編程語言中都會有hash算法,最常用的就是hashcode方法,其實hash的本質就是摘取原信息的一部分來 運算得到一個可以代表原信息的token串,當然hash算法都存在所謂的碰撞,hash的作用就是可以快速的來驗證信息的相等或不等(雖然有一定的碰撞 幾率,但是在很多情況下可以忽略),比較有名的hash算法:MD4、MD5、SHA-1等等。

        https中使用加密算法加密通信過程中信息,使用的密鑰是瀏覽器和服務器都擁有的隨機數,建立一次連接用一個隨機數,而hash的用處就是來保證信息在這個過程中完整性以及不被替換。

        偽隨機數,猜不透的偽隨機

        java中的random相信大家都用過,那就是一種偽隨機數。瀏覽器生成的偽隨機數一定要達到近似的隨機,否則被猜到每次生成的數那這https連接也就沒有意義了。 這里的隨機數,在握手之后就用來瀏覽器和服務器的通信的密鑰了,所以重要性可想而知。

        信任是根本-證書,CA認證

        最后,就是CA證書啦,這個我要多費點唾沫O(∩_∩)O~~。 我們先回顧上述的https建立連接的過程,其中服務器端將一個證書發送給客戶端,證書中包含公鑰和所屬的單位以及有效期。只有客戶端信任了這個證書,我們才能進行下面的步驟。 好關鍵的來了,首先這個證書是誰頒發的,我們怎么判斷證書為合法的呢?

        證書是CA頒發的,也就是認證機構,他們去負責驗證網站的合法性以及給網站生成證書。CA也就是這個過程中的第三方,說到底我們還是需要無條件的去信任這個第三方,如果沒有這個信任也就無從來判斷信息的合法性了。

        驗證合法性,瀏覽器中都會內置CA機構的根證書,如圖:  https方面知識的理解

        這些都是瀏覽器信任的根證書,服務器發過來的證書都是以根證書為基礎的后續枝葉。這個還要說一下,通過根來驗證后續的證書合法性的具體做法,也就是利用了RSA非對稱加密,CA在頒發證書的時候用自己的私鑰加密一條信息放在頒發的證書里,只有對應CA的公鑰才能解密。 我們來看看百度的https的證書

         https方面知識的理解

        那么問題又來了(好問的小孩),如果瀏覽器沒有內置某個認證機構的根證書呢?

        如圖:  https方面知識的理解  https方面知識的理解

        這就是咱們大名鼎鼎的12306,哈哈,讓我笑五分鐘,收。瀏覽器內置的證書都是對機構高度信任的,像咱這個人家都不認的,這也是為了我們安全,如果我們手動把證書安裝到瀏覽器中,以后12306隨便簽名一個證書,我們都會......。留下想象空間。

        關鍵點

        個人認為整個https通信中,有幾處至關重要的點,也是我們平時自己網站需要注意的。

        1. 私鑰:簡直是忒重要了,要是讓別人那到這個,那不就是想干啥干啥了,要是我一定鎖到小金庫中。整個https握手的過程中,私鑰只使用了一 次,之后就是用隨機數當做密鑰通信了。這樣就算讓你獲取到了密鑰,也只局限這一次,并且保證了私鑰沒有在網絡中傳輸,大大提高了安全性。

          </li>

        2. 隨機數的生成方式: 要是把瀏覽器的隨機數生成方式,那任你什么算法,通通都沒用了,所以隨機數生成的方式是一個很大的課題啊。

          </li>

        3. 證書,第三方,整個安全體系我們還是要取信任第三方,生活中也是這樣,我們整個社會的經濟也是建立在信用基礎上的。但是我用程序猿的思維想象,如果我取得一個著名CA的控制權,我豈不是取得了互聯網上大多數電腦的控制權?想想也挺爽的哈。

          </li> </ol>

          最后發言

          本想把本文寫的簡單點,但是能力有限,又寫成了一篇流水文了,抱歉抱歉。筆者花了大概三周的時間看了這方面的文章,感覺也學到了不少東西,就把自己所接受到的知識,轉成直白點的話,敘述了一遍。文中如果有什么理解不對的地方,還望指出,幫助學習。

          參考文章:

          《數字證書原理》(推薦) 《How does HTTPS actually work?》 阮一峰的網絡日志-《圖解SSL/TLS協議》 阮一峰的網絡日志-《SSL/TLS協議運行機制的概述》 阮一峰的網絡日志-《RSA算法原理》 伯樂在線-《HTTPS是如何保證連接安全:每位Web開發者都應知道的》 伯樂在線-《HTTPS連接的前幾毫秒發生了什么》 coodoing-《HTTPS工作原理和TCP握手機制》 果殼-《HTTPS那些事(一)HTTPS原理》 果殼-《HTTPS那些事(二)SSL證書》

          來自:http://my.oschina.net/OpenSourceBO/blog/488374

 本文由用戶 eg756 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!