眾所周知,http協議是以明文形式傳遞資料,而https就是在http基礎上多了ssl加密。以往對https的了解也僅限於此了,沒有過多深入的**。最近實驗室小夥伴面試時關於https的問題出現頻率較高,那麼就來系統的整理下吧。開整!
參考資料
這個不必多說,自然是為了安全性。特別是一些對安全性要求比較高的資訊,如信用卡、電商購物資訊等。安全性具體來說還可以分為三點:
機密性:保證資料在網路上傳輸時的- 機密性,即使被第三方截獲,也不能獲取資料內容
完整性:保證服務端/客戶端獲取到的都是完整的資訊
蘋果也在2023年1月1日強制要求必須使用https協議,可見這也是未來的大勢所趨。
一般所熟知的加密方式有對稱加密和非對稱加密。那麼https使用的是哪種方式呢?
對稱加密,即加密和解密過程使用的是同乙個金鑰。比如服務端將資料加密,然後傳輸給客戶端。客戶端就需要用相同的金鑰對資料解密,這就存在乙個問題–如何把金鑰傳遞給客戶端?如果直接在網路上傳遞,就基本和不加密一樣了,因為第三方一樣可以截獲金鑰對資料解密。難道需要再用乙個【金鑰】來加密這個金鑰嗎?那就變成了乙個遞迴加密的過程。。。
可見直接使用對稱加密這種方式行不通。
對稱加密,即加密和解密使用的是不同的金鑰(公鑰和私鑰)。一般公鑰是可以發給別人的,私鑰必須保密。用公鑰加密的資料,可以用私鑰解密。用私鑰加密的資料可以使用公鑰解密。
如果伺服器把公鑰發個客戶端。客戶端將要傳送的資料使用公鑰加密後傳送給服務端,就能保證只有擁有私鑰的伺服器可以對資料解密。反過來的過程就不行了,因為公鑰在網上公開傳輸了,伺服器使用私鑰加密的資料,相當於還是在網上「公開」的。
用兩組公鑰私鑰似乎能解決這個問題。就是服務端和客戶端分別把自己的公鑰傳送給對方,然後每次傳送資料時使用對方的公鑰加密。對方收到後自己的私鑰解密。這樣看起來是可行的,但是存在的乙個問題是非對稱加密演算法對於大資料的加密非常耗時。
這種方式其實就是解決了第一種假設中的【金鑰如何安全傳輸】的問題。主要步驟如下:
客戶端向服務端發起請求;
服務端傳送【公鑰a】給客戶端;
客戶端使用【公鑰a】加密 【金鑰x】,然後傳輸給服務端;
服務端收到後,可以使用【私鑰a『】解密獲得【金鑰x】
其中【金鑰x】就是後續用於資料加密的金鑰(對稱加密)。這種方式就巧妙的把金鑰傳遞給了另一方,也避免了使用非對稱加密來對大量資料加解密。
上述的【非對稱 + 對稱】方式看起來已經是很完美了,但是其實還存在乙個嚴重的漏洞。其實在【非對稱加密】中就埋下了隱患,所以上文用的是「似乎」。假設這樣的場景:
服務端將【公鑰a】傳送給客戶端的過程中被【黑客】截獲。黑客將其替換為自己的【公鑰b】再傳送給客戶端
客戶端使用了假的公鑰–【公鑰b】加密【金鑰x】,然後傳送給服務端
再次被【黑客】截獲,並使用【私鑰b』】解密獲得【金鑰x】。再用【公鑰a】對其加密後傳送給服務端
服務端使用【私鑰a『】解密獲得【金鑰x】
整個場景下來,服務端和客戶端其實都沒有感知到中間有【黑客】的存在,他們確實都擁有了【金鑰x】。但是【金鑰x】同時也被【黑客】掌握了。那麼後續資料傳遞就沒有任何安全性可言了,【黑客】可以任意檢視資料,甚至篡改資料。
要解決這個問題的關鍵就是如何判斷客戶端收到的【公鑰】是服務端傳送的。套用我們生活中常用的概念,就是【身份證】–乙個由權威機構證明的證件。所以**在使用https之前,需要向ca機構申請乙份數字證書。證書中包含了**資訊、公鑰資訊等。
上文中提到了需要權威機構的【數字證書】,其實又牽扯到乙個問題:怎麼保證【數字證書】的沒有被篡改過呢?這裡就需要用到【數字簽名】
【數字證書】 = 【明文資訊】 + 【數字簽名】
數字簽名是ca機構經過如下過程製作的:
1.對明文進行hash;
2.對雜湊的結果使用私鑰加密,獲得【數字簽名】
後續瀏覽器可以這樣對【數字證書】驗證:
1.對【數字證書】中的【明文資訊】進行hash獲得t;
2.使用ca機構提供的公鑰解密【數字簽名】獲得s;
3.比較s是否等於t,若相等則說明證書可靠。
如此一來,由於【黑客】不具有【私鑰】無法篡改簽名,如果對明文部分做了修改,就無法通過校驗了。
聊一聊 Flask 的 jsonify
首先我們來看一段 python from flask import flask,jsonify tasks api v1.0 tasks methods get defget tasks return jsonify if name main true 在這段 裡面,我們看到了今天的主角jsonif...
聊一聊我的二 二
我是乙個二 二一年六月畢業的學軟體技術的大專生 也就是明年畢業 對於任何人來說,這一年裡是充滿挑戰的。可能乙個小小的想法,就會決定未來的走向。二 二 是對於所有人都是複雜的一年,特別是對於我.二 二 一年裡充滿了對於我是充滿悲傷的,疫情爆發,長輩離世,面臨就業問題等等,各種我不敢面對的事情。都出現在...
聊一聊PHP的global
眾所周知,在php的函式中,如果想使用全域性變數,一種是使用超全域性變數 globals,另一種是在函式中使用global關鍵字宣告,使用超全域性變數 globals的方式大家都知道了,今天來好好聊一聊使用global方式來宣告變數。我們來看如下例子 a 1 b 2 function test te...