NO IMAGE

最近在看到這麼一篇講解Https原理的文章,語言精煉,通俗易懂,特地將其翻譯下,原文在此how does https work

加密演算法簡介

正文開始之前,我先來解釋簡單的解釋下對稱加密和非對稱加密.

對稱加密採用對稱密碼編碼技術,也就是編碼和解碼採用相同描述字元,即加密和解密使用相同的金鑰,實現這種加密技術的演算法稱對稱加密演算法。對稱加密使用簡單,金鑰較短,加密和解密過程較快,耗時短,常見的對稱加密演算法有DES,3DES,lDEA,AES,RC4等。

非對稱加密與對稱加密不同,其加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(private),兩者是一對的。如果用公鑰加密,只能用私鑰才能解密。非對稱加密保密性好,但加密和解密花費的時間較長,不適合對大檔案加密而只適合對少量的資料加密。常見的非對稱加密演算法有RSA,ECC,DSA(數字簽名)等。

Hash演算法是一種單向演算法,通過Hash演算法可以對目標資料生成一段特定長度、唯一的hash值,但是不能通過這個hash值重新計算出原始的資料,因此也稱之為摘要演算法,經常被用在不需要資料還原的密碼加密以及資料完整性校驗上,常用的演算法有MD2,MD4,MD5,SHA等。

現在我們對對稱加密,非對稱加密及Hash演算法做了簡單的說明之後,就可以開始瞭解https的工作原理了。


https是如何工作的?

這篇文章是我在我團隊中分享的。很多人不理解https的好處,不理解https的原理,因此我將這篇文章也分享給大家。

加密(Cipher)

在java 1.2時,引入JCR(java 加密擴充套件)系統,用來負責java中的金鑰和證書。

我們都知道,如果我們想要加密或解密一些資訊,我們必須要有一個金鑰。這好比你想要開門或者鎖門,必須要有鑰匙一樣。

在java中,金鑰由KeyGenerator或KeyPairGenerator生成。前者用來生成對稱金鑰,後者用來生成非對稱金鑰。

  • 對稱金鑰:使用同一個金鑰進行加密和解密
  • 非對稱金鑰:使用不同的金鑰進行加密和解密,通常被稱為公鑰(public key)和私鑰(private key)。 公鑰可以廣泛傳播,但是私鑰只有其所有者知道。在一個安全的非對稱金鑰加密方案中,當資訊用公鑰加密後,只有用私鑰才能解密。所以,即使一個黑客拿到你公鑰加密過後的資訊,也無法解密它,因為它沒有配對的私鑰。這樣,傳輸的訊息就是安全的。

證書(Certificate)

在現實中,如果你進入到鑽石專賣店中想要買一顆鑽石,你怎麼知道鑽石是真的?作為一個普通人來說,我們沒有鑽石方面的知識,但是如果這鑽石有個由美國政府頒發的許可證,我們就會相信它是真的。(去過珠寶店的同學都知道,每件珠寶都有自己的鑑定書)

證書的作用也是如此。在計算機世界中,它可能是包含一些金鑰,是另一個證書(姑且稱之為證書B好了)。這些金鑰是我們需要的,而證書B是一個許可證,用來證明這個證書是可信賴的。

做個簡短的解釋,每個鑽石都有自己的“身份證書”,但是如何說明這個身份證書是合法的,而不是自己偽造的?因此,我們需要一個權威的機構來證明這個鑽石的身份證書是合法的,如果這個鑽石的身份是合法的,該權威機構就會為其頒發一個“許可證”,這個許可證就相當於上面我們說到的證書B。可以看到,證書B的目的就是證明這個身份證書是這個鑽石的身份證書,即證明某某東西是某某東西的東西

問題來了:我們怎麼確定證書B是可信賴的呢?這個問題非常棒。

Android已經把將近150個CA根證書(數字證書認證機構認證過的證書)內建在我們手機中。這150多個證書被全世界信賴,他們就像是美國的大法官。

這150多個證書類似我們剛才說的證書B,分別用來證明某某東西是某某東西的東西

B證書中裡有另外一個證書(姑且稱之為C證書),我們通過檢查C來確定C是否是可信任的。。。通過這個證書鏈,如果我們找到的最後一個或根證書 和手機中預置的150個證書中某個相同,我們就可以這個證書原件(此處就是B)

這裡我對證書鏈進行說明。證書之間的信任關係是可以巢狀的。比如,CA信任D,D信任C,C信任B
,B信任A。。。這就是證書鏈。只要我們信任證書鏈上的頭一個證書,那麼後續的證書都是可以信任的。這裡也就是如果我信任了證書CA,那麼後面的D,C,B,A都是可以信任的。這裡來打個比方,架設軍隊中的每個士兵都只認識自己的直接上級,那麼這時候總司令怎麼確認某個士兵是自己部隊 當中的呢?總司令(CA)會問的直接下級(D),而司令的直接下級又會找自己的直接下級,依次往下找…如果最後能找到這個士兵直屬上級,那就說明這個士兵是該部隊當中的。

附:證書有多種格式

  • x.509
    x.509證書通常用於包含一個公鑰

  • PKCS12
    PKCS12證書通常用來包含一個私鑰。因此,PKCS12需要密碼才能開啟。


Https

現在我們來了解https部分。Https(http over ssl)包含上面提到的加密和證書兩部分,被設計用來在Internet安全進行通訊。

如何安全的通訊?

如何安全通訊呢?對稱加密是我們最先想到的方案:將資料進行加密,然後將加密過的資料和金鑰同時傳到伺服器,伺服器使用這個金鑰解密加密過後的資料。
這裡寫圖片描述

現在,我們來看看這種可能的場景:黑客截獲了該通訊,這意味著黑客擁有了金鑰和密文。一旦黑客有了金鑰,那麼解密密文就是很簡單的事情了,我們的資料就這樣洩漏了。

如何使用非對稱加密?

上面的解決方案非常不安全。我們繼續往下看。使用非對稱加密怎麼樣?

這個想法非常棒:服務端傳送給你公鑰,你使用這個公鑰加密資料。因為服務端是唯一擁有私鑰的,
這意味著只有服務端能夠解密密文。即使黑客截獲了該通訊,但因為沒有私鑰也就無法解密密文。

但是,非對稱加密比對稱加密更加耗時。為了使用者體驗,不建議使用非對稱加密這種方式來加密/解密大量的資料

最終方案

前兩種方案都無法解決我們安全通訊,我們怎麼結合上面的兩種方案呢?來看看最終方案:
這裡寫圖片描述

上面這張圖片已經清楚的展示了HTTPS工作的流程。

1.[Server]生成一對金鑰:公鑰和私鑰,我們稱之為“KeyPub”,“KeyPri”
2.[Server]服務端將公鑰(KeyPub)傳送到客戶端
3.[Client]生成一個對稱金鑰(姑且稱之為key2),然後用key2加密資料。
4.[Client]使用公鑰(KeyPub)加密key2.這時,key2是安全的,因為只有服務度有私鑰KeyPri
5.[Client]傳送用key2加密後的資訊及用KeyPub加密過的key2到服務端
6.[Server]服務端使用KeyPri解密得到加密過的key2,得到真正的key2
7.[Server]使用key2解密訊息正文。這樣,資料就被安全的傳輸到了服務端。

結論

由於對稱加密比非對稱加密快,https決定使用對稱加密來加密資料,使用非對稱加密對稱加密生成的金鑰,以確保安全。

這篇文章最後並沒有很好的說明證書的作用,因此如果你以前沒了解過,到此可能產生一些困惑,後面我會再單獨寫一篇文章來說明下。