爲何有的網站域名是http開頭而有的網站是https開頭呢?html
HTTP是一種超文本傳輸協定,HTTPS : 就是HTTP + Security。算法
那是否是HTTP就是不安全的呢?安全
是的 HTTP是不安全的;從HTTP的規定上來看整個傳輸的過程都是明文傳輸的。HTTP包在服務器發出到客戶端的過程當中至關於「裸奔」,被攔截後可對數據包進行解析並讀取就能夠獲得該發送請求裏面的任何數據。服務器
運用抓包工具,抓取請求數據包能夠看見:
網絡
」Hypertext Transfer Protocol」(超文本傳輸協定)就是HTTP協議。能夠看到這是一個GET請求:其中GET請求的地址,Host等請求頭的具體信息所有均可以看到。
甚至能夠知道Cookie的信息(通常存儲用戶的會話信息,截取後去模仿用戶的登陸狀況,就能夠去請求用戶的登陸數據;若是能夠在中間層抓取某一個網站的全部請求和返回的數據,就徹底能夠拿到用戶在這個網站上的全部數據),這是很危險的。併發
這是請求的返回:dom
依然能夠看到全部的頭信息。
因此HTTP自己是沒有安全屬性的,它是一個明文傳輸的過程,一旦被截取就有可能致使信息泄露,故推薦不要把重要信息用HTTP明文傳輸(信用卡密碼等)ide
是加了安全屬性的HTTP,它有公鑰和私鑰的概念,傳輸過程是安全的。工具
當使用用公鑰加密的數據傳輸到服務器以後,只有服務器經過私鑰進行解密才能把公鑰加密過的數據解密出來。傳輸過程當中任何人都拿不到私鑰,由於私鑰只放在服務器上。
這樣即便HTTP請求數據包被截取了,沒有私鑰也不能解密包中的數據。這樣數據傳輸過程就變得安全了。(抓包軟件抓到的數據也沒法解密)網站
公鑰和私鑰主要用於TCP進行「握手」時進行的數據傳輸,握手的時候公鑰和私鑰傳輸的內容其實是一個加密字符串。在後續數據傳輸的過程當中兩邊使用這個加密字符串進行數據的加密傳輸。
只有客戶端和服務器端兩邊知道這個加密字符串,並能夠經過該字符串對加密的數據進行解密。在這個過程當中中間人即便截取了數據包也是沒有辦法對數據進行解密的。
HTTP的「三次握手」過程是很是簡單的,僅僅是用來確認網絡是否連通。HTTPS的「四次握手」過程會相對複雜一點,由於須要有加密傳輸的過程,而且客戶端和服務器之間還須要肯定最後數據傳輸時真正使用的祕鑰。
(1)在傳輸的過程當中,客戶端先生成一個隨機數(客戶端隨機數),而後傳輸到服務器端,中間會帶上客戶端這邊支持的加密套件(存在許多不一樣的加密方法)
(2)服務器端拿到這個隨機數以後先存着,服務器端也生成一個隨機數(客戶端隨機數),這個隨機數會伴隨着公鑰(服務器端證書),一塊兒傳輸給客戶端。
(3)客戶端經過服務器端傳過來的公鑰(服務端證書)生成一個新的隨機數(預主祕鑰),總共有三個隨機數。生成的第三個隨機數(預主密鑰)用公鑰加密以後再傳輸到服務器端。
在這個過程當中因爲客戶端使用了公鑰對數據進行加密,即便中間人截取到了數據包沒有私鑰便沒法對數據進行解密,只有服務器端有私鑰才能夠對數據進行解密。
(4)而後服務器端經過私鑰解密拿到了預主祕鑰(就是第三個隨機數),而後客戶端和服務器端同時對這三個隨機數進行算法操做生成一個主密鑰。
這裏的算法會涉及到一個加密套件,由於最終服務器端會選擇一個客戶端發送過來的加密套件,而後兩邊同時使用這個加密套件對三個隨機數進行一個算法的操做纔會生成一個主密鑰。
有了這個主密鑰以後,兩邊傳輸的數據都經過這個主密鑰進行加密。因爲兩邊主密鑰是同樣的因此兩邊都可以對加密的數據進行機密,獲得真正的數據。而中間人由於沒辦法知道主密鑰,即便截取了數據包也沒有辦法對數據進行解密。
因此這中間的數據傳輸就是安全的。
這是對一個用HTTPS加密的網站進行的數據抓取:
咱們看到在」123 Application Data」中,抓包工具是沒有辦法顯示出這個請求的地址的。看到的只有一個」Secure Sockets Layer」(安全套接層),裏面有一個加密的內容,加密的內容由於沒有主密鑰因此沒法進行解密。
故中間的抓取工具沒有辦法顯示任何實際傳輸的數據,只能看到請求發起的ip和傳輸目標的ip。實際傳輸的數據只有客戶端和服務器端經過主密鑰解密才能獲得。
再來看看HTTPS的「四次握手」
(1)首先客戶端會發起一個」Client Hello」,能夠看到這邊傳輸了一個」Random」:客戶端隨機數(第一個隨機數)。中間有一個」Cipher Suites」選項:
這是客戶端這邊支持的加密套件,連同客戶端隨機數一併發送給服務器端。
(2)客戶端發送以後服務器端會返回一個」Server Hello」數據,其中包含了一個」Random」:服務器端隨機數(第二個隨機數),還包含了服務器端選擇的一個」Cipher Suites」:這就是剛纔客戶端列出來的多種」Cipher Suites」中服務器認爲最後的一種。客戶端和服務器端最終生成主密鑰的過程就會用到這個加密套件。
(3)而後服務器端還會繼續發送一個返回,這個返回會告訴客戶端,服務器端的公鑰(服務端證書)是怎麼樣的:
(4)客戶端拿到這個公鑰(服務端證書)以後,運用這個公鑰對」服務器端隨機數」進行加密獲得預主祕鑰,再用公鑰對預主祕鑰進行加密併發送到服務器端:
能夠看到這個數據是顯示不出來的,「handshake Protocol:Encrypted Handshake Message」(握手協議:加密握手消息),表示是加密過的數據。而後服務器端拿到以後經過私鑰解密才能真正拿到預主祕鑰。
隨後兩邊使用服務器端挑選出來的加密套件(Cipher Suites)同時對:客戶端隨機數、服務器端隨機數和預主祕鑰這三個隨機數進行算法操做,最終兩邊都獲得了主密鑰。以後經過主密鑰對數據進行加密傳輸,整個過程就是安全的。
這就是HTTPS能保證安全的原理。
與HTTP中TCP的「三次握手」不一樣,HTTPS須要進行「四次握手」,而且在客戶端和服務器端傳輸的數據也比HTTP多,同時消耗也比HTTP大,可是HTTPS是安全的。如今只有部分網站使用HTTPS協議,可是未來全部的網站都會使用HTTPS,這是大勢所趨。
並且網站使用HTTP/2協議的前提就是域名要以」https」開頭。
本文做者:AhuntSun
原文連接:http://www.javashuo.com/article/p-zrpvzhna-mt.html