你們都知道,在客戶端與服務器數據傳輸的過程當中,http協議的傳輸是不安全的,也就是通常狀況下http是明文傳輸的。但https協議的數據傳輸是安全的,也就是說https數據的傳輸是通過加密。算法
在客戶端與服務器這兩個徹底沒有見過面的陌生人交流中,https是如何保證數據傳輸的安全性的呢?安全
下面我將帶你們一步步瞭解https是如何加密才得以保證數據傳輸的安全性的。咱們先把客戶端稱爲小客,服務器稱爲小服。而後一步步探索在小客與小服的交流中(就是一方請求一方響應),https是如何保證他們的交流不會被中間人竊聽的。服務器
假如如今小客與小服要進行一次私密的對話,他們不但願此次對話內容被其餘外人知道。但是,咱們平時的數據傳輸過程當中又是明文傳輸的,萬一被某個黑客把他們的對話內容給竊取了,那就難受了。網絡
爲了解決這個問題,小服這傢伙想到了一個方法來加密數據,讓黑客看不到具體的內容。該方法是這樣子的:post
在每次數據傳輸以前,小服會先傳輸小客一把密鑰,而後小服在以後給小客發消息的過程當中,會用這把密鑰對這些消息進行加密。小客在收到這些消息後,會用以前小服給的那把密鑰對這些消息進行解密,這樣,小客就能獲得密文裏面真正的數據了。若是小客要給小服發消息,也一樣用這把密鑰來對消息進行加密,小服收到後也用這把密鑰進行解密。 這樣,就保證了數據傳輸的安全性。如圖所示:加密
這時,小服想着本身的策咯,仍是挺得意的。3d
但是,這時候問題來了。這個策略安全的前提是,小客擁有小服的那把密鑰。可問題是,小服是以明文的方式把這把密鑰傳輸給小客的,這個時候,若是黑客截取了這把密鑰,那就難受了。小服與小客就算是加密了內容,在截取了密鑰的黑客老哥眼裏,這和明文沒啥區別。日誌
小服仍是挺聰明的,得意了一會以後,小服意識到了密鑰會被截取這個問題。倔強的小服又想到了另一種方法:用非對稱加密的方法來加密數據。該方法是這樣的:cdn
小服和小客都擁有兩把鑰匙,一把鑰匙的公開的(全世界都知道也不要緊),稱之爲公鑰;而另外一把鑰匙是保密(也就是隻有本身才知道),稱之爲私鑰。而且,用公鑰加密的數據,只有對應的私鑰才能解密;用私鑰加密的數據,只有對應的公鑰才能解密。blog
因此在傳輸數據的過程當中,小服在給小客傳輸數據的過程當中,會用小客給他的公鑰進行加密,而後小客收到後,再用本身的私鑰進行解密。小客給小服發消息的時候,也同樣會用小服給他的公鑰進行加密,而後小服再用本身的私鑰進行解密。 這樣,數據就能安全着到達雙方。如圖:
想着這麼複雜的策略都能想出來,小服但是得意的不能在得意了.....
看着那麼得意的小服,小客這時心情就不得好了。還沒等小服得意多久,小客就給它潑了一波冷水了。
小客嚴肅着說:其實,你的這種方法也不是那麼的安全啊。仍是存在被黑客截取的危險啊。例如:
你在給我傳輸公鑰的過程當中,若是黑客截取了你的公鑰,而且拿着本身的公鑰來冒充你的公鑰來發給我。我收到公鑰以後,會用公鑰進行加密傳輸(這時用的公鑰其實是黑客的公鑰)。黑客截取了加密的消息以後,能夠用他本身的私鑰來進行解密來獲取消息內容。而後在用你(小服)的公鑰來對消息進行加密,以後再發給你(小服)。 這樣子,咱們的對話內容仍是被黑客給截取了啊。(倒過來小客給小服傳輸公鑰的時候也同樣)。
我靠,這麼精妙的想法竟然也不行,小服這波,滿臉無神。
其實在傳輸數據的過程當中,在速度上用對稱加密的方法會比非對稱加密的方法快不少。因此在傳輸數據的時候,通常不僅僅只用非對稱加密這種方法(咱們先假設非對稱密碼這種方法很安全),而是會用非對稱加密 + 對稱加密這兩種結合的方法。 你想啊,對於對稱加密這種方法來講,之因此不安全是由於密鑰在傳輸的過程當中,被別人知道了。基於這個,咱們能夠用非對稱加密方法來安全着傳輸密鑰,以後在用對稱加密的方法來傳輸消息內容(固然,我這裏假定了非對稱加密傳輸是安全的,下面會講如何使之安全)。
咱們回頭想一下,是什麼緣由致使非對稱加密這種方法的不安全性呢?它和對稱加密方法的不安全性不一樣。非對稱加密之因此不安全,是由於小客收到了公鑰以後,沒法肯定這把公鑰是否真的是小服。
也就是說,咱們須要找到一種策略來證實這把公鑰就是小服的,而不是別人冒充的。
爲了解決這個問題,小服和小客經過絞盡腦汁想出了一種終極策略:數字證書:
咱們須要找到一個擁有公信力、你們都承認的認證中心(CA)
小服再給小客發公鑰的過程當中,會把公鑰以及小服的我的信息經過Hash算法生成消息摘要。如圖:
爲了防止摘要被人調換,小服還會用CA提供的私鑰對消息摘要進行加密來造成數字簽名。如圖:
而且,最後還會把原來沒Hash算法以前的信息和數字簽名合併在一塊兒,造成數字證書。如圖:
當小客拿到這份數字證書以後,就會用CA提供的公鑰來對數字證書裏面的數字簽名進行解密獲得消息摘要,而後對數字證書裏面小服的公鑰和我的信息進行Hash獲得另外一份消息摘要,而後把兩份消息摘要進行對比,若是同樣,則證實這些東西確實是小服的,不然就不是。如圖:
這時可能有人會有疑問,CA的公鑰是怎麼拿給小客的呢?小服又怎麼有CA的私鑰呢?其實,(有些)服務器在一開始就向認證中心申請了這些證書,而客戶端裏,也會內置這些證書。如圖(此圖來元阮一峯的網絡日誌)
當客戶端收到服務器返回來的數據時,就會在內置的證書列表裏,查看是否有有解開該數字證書的公鑰,若是有則.....不然.....
講到這裏,就大概結束了。但願對你有所幫助勒。若是有哪裏寫得不對的地方,歡迎你們指出。
推薦閱讀: