一個故事讓你徹底理解 Https

飢人谷前端發表於2017-12-12

一些教程經常提到 POST 比 GET提交資料更安全,真正從安全的角度來說,只要是 Http 請求,都不安全 。(補充 @王泥煤 的回覆 post的確比get更安全,這一點與https無關。因為用get方式傳密碼會被日誌系統記錄下明文,或者被第三方的referer帶出去,即便你採用了https)

  • 如果你連一個公共場所的 wifi,連線該 wifi 的所有人都可以嗅探你發的網路請求的明文資料,包括使用者名稱和密碼
  • 即使你是在家上網,中間任何環節都能檢視、修改你網路請求的明文資料,比如你的路由器、小區的閘道器、ISP... 只要使用 Http協議,不論做任何安全措施都是徒勞的,只有Https 協議才保證資料在傳輸過程中的安全。

問題來了,什麼是安全?

資料傳輸的安全其實體現在以下幾個方面:

  1. 我發的資料,不該看的人看不懂

  2. 我發的資料,不該看的人不能偽造或者修改(修改後接收方可察覺)

  3. 我發的資料,過期之後不該看的人不能偷偷拿過來繼續用

Https 怎樣保證資料傳輸安全?再講講 Https的原理之前必須先聊一聊資料加密,目前有以下幾種加密方式:

  1. 對稱加密 : 加密和解密資料使用同一個金鑰。這種加密方式的優點是速度很快,常見對稱加密的演算法有 AES;
  2. 非對稱加密: 加密和解密使用不同的金鑰,叫公鑰和私鑰。資料用公鑰加密後必須用私鑰解密,資料用私鑰加密後必須用公鑰解密。一般來說私鑰自己保留好,把公鑰公開給別人,讓別人拿自己的公鑰加密資料後發給自己,這樣只有自己才能解密。 這種加密方式的特點是速度慢,CPU 開銷大,常見非對稱加密演算法有 RSA;
  3. Hash: hash 是把任意長度資料經過處理變成一個長度固定唯一的字串,但任何人拿到這個字串無法反向解密成原始資料(解開你就是密碼學專家了),Hash 常用來驗證資料的完整性。常見 Hash 演算法有 MD5(已經不安全了)、SHA1、SHA256

理解了加密方式後我們就能利用這些演算法實現安全資料傳輸。以一個故事開始:

班裡來了個新同學小美,長的特別漂亮,小谷暗戀小美很久,終於有一天小谷鼓起勇氣向小美表白。小谷寫了個紙條:“我是小谷,我喜歡你,你喜歡我嗎?” ,讓小王轉交給小美。

正常情況下,小王會把紙條轉給小美,小美看到後很開心,回覆了紙條:“我是小美,我也喜歡你”,讓小王再轉遞給小谷。

可是小王也暗戀小美,當然不願甘做嫁衣。這個時候小王可以有幾方法來搗亂:

  1. 收到小谷的紙條後扔掉紙條。但這樣做小谷收不到迴應下課會去單獨問小美,事情就敗露了
  2. 偷窺紙條的內容,然後舉報給老師
  3. 收到小谷的紙條後,小王立即給小谷發一個回覆紙條:“我不喜歡你,我喜歡小王”。同時小王給小美髮一個紙條:“我是小谷,你長的真醜,嘿嘿”
  4. 正常幫小谷和小美投遞紙條,成就美事。但影印一份小谷的紙條,過兩天小王把這個紙條發給了班裡的其他女生小花,這樣小美知道後必然會鬧分手

小谷很聰明,早就看出來小王心懷不軌,可是沒辦法,要傳信必然要經過小王,要怪就怪自己太靦腆不敢下課直接親手送上。怎麼辦呢?

有一種辦法是把紙條的資訊加密(AES 加密),小王就不知道紙條內容了。可是問題來了,小美也不知道金鑰,她收到信後也無法解密啊。倒是可以把金鑰放到紙條裡,可這樣小王也得到了金鑰等於白忙活一場。

再說說小美,小美很漂亮,在以前的學校被稱為數學女神,轉學到這裡後立即被小谷吸引了,她看出來小谷有點喜歡自己但又不十分確定,她不想主動。她猜到小谷會在上課的時候可能用寫紙條的方式表白,也猜到猥瑣的小王會在中間搗亂。如何讓小谷能順利向自己表白呢?小美在瘋狂的思考:

方案一: 我可以生成一對公鑰和私鑰,把公鑰公開給班裡所有的同學。這樣小谷就能得到公鑰,把要發的資訊用公鑰加密,只有我自己能用私鑰解密。可是我如何把我的回覆發出去呢?如果用我的私鑰加密,小谷倒是能用公鑰解密,但班裡任何同學都能解密,被其他同學看到就糗大了。而且如果小谷紙條的內容太多,他用公鑰加密需要花一整節課的時間,不能耽誤他學習

方案二:我可以生成一對公鑰和私鑰,把公鑰公開給班裡所有的同學,這樣小谷就能得到公鑰。如果小谷夠聰明的話,他得到公鑰後會生成一個對稱加密AES的金鑰,然後用我的公鑰把 AES 金鑰加密(AES 金鑰長度很短加密幾乎不需要時間),然後把加密後的金鑰發給我。我收到後用我的私鑰解密,得到小谷和我約定的對對稱加密金鑰,然後我們用這個只有我們倆知道的對稱金鑰加密資料進行交流。

下課休息的時候,小美給班裡的同學說:“快數學考試了,我的數學很好,考場上需要要我幫忙的同學可以找我,我公佈一下我的公鑰,為了安全起見大家用我的公鑰加密訊息。”

一切貌似天衣無縫,可是小美在班裡公佈自己公鑰的時候小谷正好拉肚子去了廁所,回來之後才知道這事,小谷於是問旁邊的同學小花小美公鑰是多少。小花以前是班裡受歡迎的女生被很多男生仰慕,在小美來之後立即被奪了風頭,一直懷恨在心。於是小花告訴了小谷一個假公鑰,其實是自己生成的公鑰。這樣萬一小谷找小美要小抄,自己可以冒充小美給一個錯答案。

一切被小美看到眼裡,這樣不行啊, 別到時候自己和小谷的好事沒成,反而同學考試被陷害栽贓到自己頭上。怎麼辦呢?對了,班長是班裡人品很正的人,可以用班長給自己做信用背書,正好前兩天班長在班裡通知了自己的公鑰。 於是小美找到班長,做了一個證照,證照上有自己的名字、學號、公鑰、公證人班長的名字,同時把這些資訊通過 Hash (sha256)處理後請求班長用自己的私鑰進行加密(為什麼用 Hash 處理?因為東西太多非對稱加密很費時),也放到證照上。於是小美再次把證照通報給班裡所有的同學。

小谷這次得到了證照,發現上面的公證人是班長,於是先用班長的公鑰對證照上被班長私鑰加密後的欄位進行解密,得到元素資料的 Hash。 再對元素資料進行 Hash和剛剛解密的 Hash 進行比對。如果比對成功表示證照上的資訊無誤,且是由班長擔保的。這時候小谷確信證照上的公鑰就是小美的。任何人因為沒有班長的私鑰都無法偽造證照。

你以為故事就這麼圓滿結束了嗎?其實沒有,班長前兩天在公佈自己的證照的時候小谷正好生病請假了。 他根本不知道班長的公鑰是不是他本人的。

這個時候他發現班長的證照上有班主任的擔保(班主任的公鑰做了簽名),班主任的證照上有校長的擔保,而小谷是有校長的的公鑰的,就印在學生證上。

終於,小谷收穫了女神的芳心。

故事完了。故事中 小谷是瀏覽器,小美是伺服器,小花和小王是壞蛋,班長是 CA 機構,班主任是上級 CA,校長是根 CA 伺服器。當一個網站要使用 https 時先需在一些國際認證的 CA 機構填寫網站資訊申請證照,而這些 CA機構往往還有上層 CA,最終有一個根 CA。一般來說瀏覽器都會內建根 CA 和一些頂級 CA 的證照,但需要驗證的時候會通過 CA 鏈逐級驗證。

本文是若愚老師辛苦創造,寫篇文章容易,講個好故事不容易,喜歡的點個贊,需要轉載的需要完整保留本文全部資訊包括廣告~

最近我的文章更新會比較頻繁,沒辦法,因為我的直播班又要開了,酒香也怕巷子深啊,不打點廣告不行

有人會說,BAT 出來做培訓的很多,你有什麼 NB 的

我的 NB 之處在於你覺得自己需要花一週才能學會的東西,我可以讓你一小時搞定,你覺得自己花三個月才能勉強掌握的東西,我可以讓你一週徹底搞定。可以看看我寫過的文章,以及我講的視訊

想轉行前端拿到8~18k 的 offer?找 飢人谷

想免費學前端做面試達人?前端3小時速成指南 - 寫程式碼啦!

相關文章