HTTPS和HTTP有什麼區別,到底安全在哪裡?
在上網獲取資訊的過程中,我們接觸最多的資訊加密傳輸方式也莫過於HTTPS了。每當訪問一個站點,瀏覽器的位址列中出現綠色圖示時,意味著該站點支援HTTPS資訊傳輸方式。HTTPS是我們常見的HTTP協議與某個加密協議的混合體,也就是HTTP+S。這個S可以是TLS(安全傳輸層協議)、也可以是SSL(安全套接層),不過我更認可另一個抽象概括的說法,HTTP+Security。
首先,HTTPS並不是這種加密技術的正式名稱,HTTPS代表的是“在TLS/SSL上實現的HTTP協議”,因此實現加密的其實是位於HTTP下面的TLS/SSL層。
我們看看TLS/SSL所實現的幾個主要機制:
1.證書:通過第三方權威證書頒發機構(如VeriSign)驗證和擔保網站的身份,防止他人偽造網站身份與不知情的使用者建立加密連線。
2.金鑰交換:通過公鑰(非對稱)加密在網站伺服器和使用者之間協商生成一個共同的會話金鑰。
3.會話加密:通過機制(2)協商的會話金鑰,用對稱加密演算法對會話的內容進行加密。
4.訊息校驗:通過訊息校驗演算法來防止加密資訊在傳輸過程中被篡改。
通過上述機制,使用者與網站之間的傳輸內容受到了保護,因此能夠獲得很高的安全性。不過,任何密碼學手段都不是絕對安全的,上面幾個機制中其實都存在可能的風險:
1.證書:如果有人偽造證書,瀏覽器會發出警告,提示使用者該網站的證書可能是偽造的,應該停止訪問,但如果你無視瀏覽器的警告,你的會話資訊就有可能被偽造者竊取。此外,如果第三方證書頒發機構遭到攻擊,攻擊者竊取了已頒發的證書金鑰,就可以偽造相應的網站證書,完全騙過瀏覽器的安全機制,這樣的例子的確曾經發生過。
2.金鑰交換:RSA,這是一種最普遍使用的公鑰加密演算法,一般來說安全性很高。
3.會話加密:AES-256(CBCMode),這是一種非常廣泛使用的加密演算法,採用256位金鑰代表其安全性很高,如果採用128位金鑰(AES-128)則安全性就差一些。
4.訊息校驗:SHA1,這是一種雜湊演算法,SHA1的安全性比MD5要好,但如果採用SHA256則安全性會更好一些。
上面很抽象是不是,我們用“傳紙條”這個人人小時候都做過的事來形象的說明一下。
HTTP
假設你現在正坐在教室裡上課,現在你非常想和走道旁的迷人的TA說一些話,一般這個時候你會用“傳紙條”的方式來交流。而這個方式和TCP/IP協議基本的工作模式十分相像:
- 通過小動作引起對方注意;
- 對方以多種可能的方式(注視、肢體語言等)迴應於你;
- 你確認對方感知到你後,將紙條傳給對方;
- 對方閱讀紙條;
- 對方給予你閱讀後的反應;
怎麼樣,這個流程是不是很熟悉?
如果你要傳遞紙條的TA距離你很遠怎麼辦?HTTP協議就是指你在紙條上寫明你要傳給的TA是誰,或者他的座位在哪,接著只需要途徑的同學拿到紙條後根據紙條上的指示依次將紙條傳過去就OK了。
這個時候問題來了:途徑的同學完全可以觀看並知道你在紙條上寫了什麼。
這就是HTTP傳輸所面臨的問題之一:中間人攻擊,指訊息傳遞的過程中,處在傳遞路徑上的攻擊者可以嗅探或者竊聽傳輸資料的內容。
HTTPS
HTTPS針對這個問題,採用了“加密”的方式來解決。最著名原始的加密方法就是對稱加密演算法了,就是雙方約定一個暗號,用什麼字母替換什麼字母之類的。現在一般採用一種叫AES(高階加密演算法)的對稱演算法。
對稱加密演算法既指加密和解密需要使用的金鑰key是一樣的。
AES在數學上保證了,只要你使用的key足夠長,破解幾乎是不可能的(除非光子計算機造出來了)
我們先假設在沒有金鑰key的情況下,密文是無法被破解的,然後再回到這個教室。你將用AES加密後的內容噌噌噌地寫在了紙條上,正要傳出去的時候你突然想到,TA沒有key怎麼解密內容呀,或者說,應該怎麼把key給TA?
如果把key也寫在紙條上,那麼中間人照樣可以破解竊聽紙條內容。也許在現實環境中你有其他辦法可以把key通過某種安全的渠道送到他的手裡,但是網際網路上的實現難度就比較大了,畢竟不管怎樣,資料都要經過那些路由。
於是聰明的人類發明了另一種加密演算法——非對稱加密演算法。這種加密演算法會生成兩個金鑰(key1和key2)。凡是key1加密的資料,key1自身不能解密,需要key2才能解密;凡事key2加密的資料,key2自身不能解密,只有key1才能解密。
目前這種演算法有很多中,最常用的是RSA。其基於的數學原理是:
兩個大素數的乘積很容易算,但是用這個乘積去算出是哪兩個素數相乘就很複雜了。好在以目前的技術,分解大數的素因確實比較困難,尤其是當這個大數足夠大的時候(通常使用2的10次方個二進位制位那麼大),就算是超級計算機,解密也需要非常長的時間。
現在就把這種非對稱加密的方法應用在我們教室傳紙條的場景裡。
你在寫紙條內容之前先用RSA技術生成了一對金鑰k1和k2.
你把k1用明文傳了出去,路經也許有人會擷取,但是沒有用,k1加密的資料需要k2才可以破解,而k2在你自己手中。
k1傳到了目的人,目的人會去準備一個接下來準備用於對稱加密(AES)的傳輸金鑰key,然後用收到的k1把key加密,傳給你。
你用手上的k2解出key後,全教室只有你和你的目的人擁有這個對稱加密的key,你們倆就可以盡情聊天不怕竊聽啦~
這裡也許你會有問題,為什麼不直接用非對稱加密來加密資訊,而是加密AES的key呢?因為非對稱加密和解密的平均消耗時間比較長,為了節省時間提高效率,我們通常只是用它來交換金鑰,而非直接傳輸資料。
然而使用非對稱加密真的可以防範中間人攻擊嗎?雖然看上去很安全,但是實際上卻擋不住可惡的中間人攻擊。
假設你是A,你的目的地是B,現在要途徑一個惡意同學M。中間人的惡意之處在於它會偽裝成你的目標。
當你要和B完成第一次金鑰交換的時候,M把紙條扣了下來,假裝自己是B並偽造了一個key,然後用你發來的k1加密了key發還給你。
你以為你和B完成了金鑰交換,實際上你是和M完成了金鑰交換。
同事M和B完成一次金鑰交換,讓B以為和A你完成了金鑰交換。
現在整體的加密流程變成了A(加密連結1)->M(明文)->B(加密連結2)的情況了,這時候M依然可以知道A和B傳輸的全部訊息。
這個時候就是體現HTTPS和傳紙條的區別了。在教室裡,你是和一位與你身份幾乎對等的的物件來通訊;而在訪問網站時,對方往往是一個比較大(或者知名)的服務者,他們有充沛的資源,或許他們可以向你證明他們的合法性。
此時我們需要引入一個非常權威的第三方,一個專門用來認證網站合法性的組織,可以叫做CA(Certificate Authority)。各個網站服務商可以向CA申請證書,使得他們在建立安全連線時可以帶上CA的簽名。而CA得安全性是由作業系統或者瀏覽器來認證的。
你的Windows、Mac、Linux、Chrome、Safari等會在安裝的時候帶上一個他們認為安全的CA證書列表,只有和你建立安全連線的網站帶有這些CA的簽名,作業系統和瀏覽器才會認為這個連結是安全的,否則就有可能遭到中間人攻擊。
一旦某個CA頒發的證書被用於的非法途徑,那麼這個CA之前頒發過的所有證書都將被視為不安全的,這讓所有CA在頒發證書時都十分小心,所以CA證書在通常情況下是值得信任的。
出品人:亞洲誠信
相關文章
- HTTP和HTTPS有什麼區別?HTTP
- HTTP和HTTPS有什麼主要的區別?HTTP
- 什麼是HTTP? HTTP 和 HTTPS 的區別?HTTP
- HTTP和HTTPS有什麼區別?如何實現網站的HTTPS?HTTP網站
- HTTP和HTTPS有哪些區別?HTTP
- HTTP和HTTPS的區別有哪些?HTTP
- VPS和HTTP有什麼區別?HTTP
- HTTP和HTTPS是什麼 二者區別是什麼HTTP
- Linux和Unix之間有什麼關聯?區別在哪裡?Linux
- HTTP 和 HTTPS 之間除了安全性區別外,還有哪些區別HTTP
- SSL證書是什麼?HTTP和HTTPS的區別HTTP
- https和http有什麼區別?看下面介紹就知道了!HTTP
- VIPER 和 MVVM 到底有什麼區別MVVM
- GET 和 POST 到底有什麼區別?
- 什麼是HTTPS證書?HTTP與HTTPS的區別HTTP
- http和https的區別HTTP
- http和https的區別?HTTP
- HTTPS 和 HTTP 的區別HTTP
- HTTPS和HTTP的區別HTTP
- 海外HTTP代理和VPN有什麼區別?哪一種更安全?HTTP
- HTTP與HTTPS:為什麼HTTPS比HTTP更安全?HTTP
- HTTP協議Cookie和Session有什麼區別HTTP協議CookieSession
- HTTPS 和 HTTP 的主要區別HTTP
- 徹底搞懂js裡的__proto__和prototype到底有什麼區別?JS
- Android中drawable和mipmap到底有什麼區別Android
- http和https的區別/get和post的區別HTTP
- Typescript 中的 interface 和 type 到底有什麼區別TypeScript
- 【Linux基礎】ftp、sftp和scp是什麼?區別在哪裡?LinuxFTP
- 為什麼 HTTPS 比 HTTP 更安全?HTTP
- 【Python小知識】什麼是HTTP和HTTPS?有什麼不同?PythonHTTP
- websocket和http2有什麼區別?http2能取代websocket嗎?為什麼?WebHTTP
- MySQL 中 int (10) 和 int (11) 到底有什麼區別?MySql
- Aliyun Java Initializr 和 Spring 官方的到底有什麼區別?JavaSpring
- 前端面試http和https的區別前端面試HTTP
- HTTP中Get與Post有什麼區別?HTTP
- SOCKS5代理和HTTP代理有什麼區別?HTTP
- 海外HTTP代理中全域性代理和區域性代理是什麼?有什麼區別?HTTP
- HTTP 與 HTTPS 的區別HTTP
- http與https的區別HTTP