對稱加密、非對稱加密、RSA、訊息摘要、數字簽名、數字證書與HTTPS簡介

Dablelv發表於2019-02-27

1.加密演算法簡介

加密演算法一般分為兩種:對稱加密和非對稱加密。

1.1對稱加密(Symmetric Key Algorithms)

對稱加密演算法使用的加密和解密的金鑰一樣,比如用祕鑰123加密就需要用123解密。實際中祕鑰都是普通資料在網際網路傳輸的,這樣祕鑰可能會被中間人擷取,導致加密被破解。其過程如下:

//加密
E=ENC(M,K)

//解密
M=DEC(E,K)

其中M是訊息,K是金鑰,E是加密後的密文,ENC()和DEC()分別是加密和解密演算法。

常用的對稱加密演算法包括:
(1)DES(Data Encryption Standard):資料加密標準,速度較快,適用於加密大量資料的場合。
(2)3DES(Triple DES):是基於DES,對一塊資料用三個不同的金鑰進行三次加密,強度更高。
(3)AES(Advanced Encryption Standard):高階加密標準,是下一代的加密演算法標準,速度快,安全級別高;

對稱加密演算法的特點主要有:
(1)加密方和解密方使用同一個金鑰;
(2)加解密的速度比較快,適合資料比較長時使用;
(3)金鑰傳輸的過程不安全,且容易被破解,金鑰管理也比較麻煩。

1.2非對稱加密(Asymmetric Key Algorithms)

所謂非對稱,是指該演算法需要一對金鑰,使用其中一個加密,則需要用另一個才能解密。把金鑰分為公鑰和私鑰,公鑰是公開的所有人都可以認領,私鑰是保密的只有一個人知道。

非對稱加密演算法主要有:
(1)RSA:由 RSA 公司發明,是一個支援變長金鑰的公共金鑰演算法,需要加密的檔案塊的長度也是可變的;
(2)DSA(Digital Signature Algorithm):數字簽名演算法,是一種標準的 DSS(數字簽名標準);
(3)ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學。

假如傳送方有一對金鑰:私鑰(KA)和公鑰(KPA),接收方也生成一對金鑰:私鑰(KB)和公鑰(KPB),其中(KPA)和(KPB)是公開的。傳送方用接收方的公鑰對訊息加密,加密過程如下

E=ENC(M,KPB)

接收方接收到密文後使用自己的私鑰進行解密,解密過程如下:

M=ENC(E,KB)

這樣,即使密文被中間人截獲,由於其不知道接收方的私鑰,無法破解密文,所以訊息仍然是安全的。
在這裡插入圖片描述

1.3非對稱加密RSA

RSA加密演算法是最常用的非對稱加密演算法,由Ron Rivest、Adi Shamir、Leonard Adleman於1977年在麻省理工學院工作時提出,RSA是三者姓氏首字母的拼接。
在這裡插入圖片描述
RSA的安全性是基於極大整數因數分解的難度。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用RSA加密的資訊的可靠性就肯定會極度下降。但找到這樣的演算法的可能性是非常小的。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被解破的。

2.訊息摘要(Message Digest)

訊息摘要可以將訊息雜湊成一個長度固定的唯一值。值唯一的意思是不同的訊息轉換的摘要是不同的,並且能夠確保唯一。該過程不可逆,即不能通過摘要反推明文。常用的訊息摘要演算法有MD5、SHA1、SHA256、SHA512等。

3.數字簽名(Digital Signature)

有了RSA,我們可以將其用於網路傳輸資料的加密。比如A要傳送一封Email給B,他不想讓任何其他人在傳輸中看到Email的內容,做法就是使用B的公鑰對Email加密,只有B的私鑰能夠解密(B的私鑰唯一性保證信件不會洩露)。

某天出意外了,有黑客冒充A給B傳送Email,並且也用B的公鑰加密,導致B無法區分這封郵件是否來自A。怎麼辦?此時A可以用自己的私鑰加密Email,那麼B收到郵件後如果用A的公鑰可以解密郵件,那麼證明這封信肯定來自於A。

通過這個例子我想我們基本明白非對稱加密了的作用了。總結如下:
(1)公鑰的作用:對內容本身加密,保證不被其他人看到;
(2)私鑰的作用:證明內容的來源;
(3)公鑰和私鑰是配對關係,公鑰加密就用私鑰解密,反之亦然,用錯的金鑰來嘗試解密會報錯。

仔細思考會發現,假設A用自己的私鑰對Email加密傳送,會存在下面的問題:對檔案本身加密可能是個耗時過程,比如這封Email足夠大,那麼私鑰加密整個檔案以及拿到檔案後的解密無疑是巨大的開銷。使用數字簽名可以解決這個問題。
(1)A先對這封Email執行雜湊運算得到訊息摘要;
(2)然後A用自己的私鑰對訊息摘要加密,生成數字簽名;
(3)把數字簽名加在Email正文後面,一起傳送給B。當然,為了防止郵件被竊聽,對郵件內容使用B的公鑰進行加密,但這個不屬於數字簽名範疇;
(4)B收到郵件後用A的公鑰對數字簽名解密,成功則代表Email確實來自A,失敗說明有人冒充,此時數字簽名起到了身份認證的作用;
(5)B對郵件正文通過自己的私鑰解密後執行雜湊運算得到摘要;
(6)B會對比第4步數字簽名的Hash值和自己運算得到的Hash值,一致則說明郵件未被篡改。此時數字簽名用於資料完整性的驗證。

整個過程圖示如下:
在這裡插入圖片描述
通過上面的例子可以發現數字簽名是非對稱金鑰加密技術與數字摘要技術的實際應用,主要有兩個作用:
(1)對數字簽名使用傳送方的公鑰解密,根據解密是否成功用於身份認證;
(2)將解密後的訊息摘要與收到的訊息的摘要進行比對,用於訊息的完整性校驗。

4.數字證照(Digital Certificate)

4.1數字證照的由來

在瞭解數字簽名的由來和作用後,仔細想想你可能會存在如下問題:
公鑰是公開的並且可以自行匯入到電腦,如果有人比如C偷偷在B的電腦用自己公鑰替換了A的公鑰,然後用自己的私鑰給B傳送Email,這時B收到郵件其實是被C冒充的但是他無法察覺。確實存在這種情況,這裡問題的根源就在於,大家都可以生成公鑰、私鑰對,無法確認公鑰對到底是誰的。 如果能夠確定公鑰到底是誰的,就不會有這個問題了。例如如果經過某種檢查,能夠發現B獲取的公鑰不是“A”的就好了。解決辦法就是數字證照。

4.2數字證照的內容

先大概看下什麼是數字證照,一個證照包含的主要內容有(包含不限於):
(1)頒發者(Issuer)
指出是什麼機構釋出的這個證照,也就是指明這個證照是哪個機構建立的,常見的機構有CA(Certificate Authority,數字證照認證中心)。

(2)所有者(Subject)
這個證照是釋出給誰的,或者說證照的所有者,一般是某個人或者某個公司名稱、機構的名稱、公司網站的網址等。

(3)生效時間(Valid from)
證照的有效期起始時間。

(4)失效時間(Valid to)
證照的有效期的結束時間。 過了有效期限,證照就會作廢,不能使用了。

(5)公鑰(Public key)
這個非對稱加密演算法中的公鑰。

(6)指紋演算法(Thumbprint algorithm)
生成數字證照指紋的雜湊演算法,一般為SHA1 。

(7)指紋(Thumbprint )
根據數字證照中的指紋演算法對數字證照進行雜湊計算獲得數字證照的摘要。

(8)簽名演算法(Signature algorithm)
產生數字證照的數字簽名所使用的加密演算法。這樣就可以使用證照釋出機構的證照裡面的公鑰,根據這個演算法對數字證照的數字簽名進行解密,獲得數字證照的指紋。指紋的加密結果就是數字簽名。

注意:
(1)數字證照的數字簽名是如何產生的?
其過程是對數字證照摘要使用數字證照發行者的私鑰採用簽名演算法進行加密獲得,用來保證證照的完整性和確認該證照由數字證照發行者頒發。可見,數字證照發行者除了給別人釋出證照外,他自己本身也有自己的證照。

(2)證照釋出機構的證照是哪裡來的呢?
證照釋出機構的數字證照(一般由他自己生成)在我們的作業系統剛安裝好時(例如Windows 7等作業系統),這些證照釋出機構的數字證照就已經被微軟(或者其它作業系統的開發機構)安裝在作業系統中了,微軟等公司會根據一些權威安全機構的評估選取一些信譽很好並且通過一定的安全認證的證照釋出機構,把這些證照釋出機構的證照預設安裝在作業系統裡面,並且設定為作業系統信任的數字證照。這些證照釋出機構自己持有與他自己的數字證照對應的私鑰,他會用這個私鑰加密所有他釋出的證照的指紋作為數字簽名。

4.3數字證照的申請

舉個例子方便大家理解,假設我們公司"Dablelv Inc."花了1000塊錢,向數字證照認證中心CA為申請了一張證照。注意,這個證照釋出機構CA是一個大家公認並被一些權威機構接受的證照釋出機構,我們的作業系統裡面已經安裝了CA的證照。CA在給我們釋出證照時,把Issuer、Subject、Public key、Valid from、Valid to等資訊以明文的形式寫到證照裡面,然後用一個指紋演算法計算出這些數字證照內容的一個指紋,並把指紋和指紋演算法用自己的私鑰進行加密,然後和證照的內容一起釋出,同時"CA"還會給一個我們公司"Dablelv Company"的私鑰給到我們。我們花了1000塊錢買的這個證照的內容如下:

Issuer:CA
Subject:Dablelv Company
Valid from:某個日期
Valid to:某個日期
Public Key:一串很長的數字
{證照的指紋和計算指紋所使用的指紋演算法}[CA的私鑰|RSA]	//這個就是CA對這個證照的一個數字簽名,表示這個證照確實是他頒發的,有什麼問題他會負責
...證照其它內容...

其中{證照的指紋和計算指紋所使用的指紋演算法}[CA的私鑰|RSA]表示使用CA的私鑰,採用RSA對證照的指紋和計算指紋所使用的指紋演算法進行加密。

注意:
(1)如何確保證照的合法性且是我們"Dablelv Inc.“公司的證照呢?
使用者在開啟證照時,讀取證照中的Issuer為"CA” ,然後會在作業系統中受信任的釋出機構的證照中去找"CA"的證照,如果找不到,那說明證照的釋出機構是個不受信的釋出機構,證照可能有問題,程式會給出一個錯誤資訊。 如果在系統中找到了"CA"的證照,那麼應用程式就會從證照中取出"CA"的公鑰,然後對我們"Dablelv Inc."公司的證照裡面的指紋和指紋演算法用這個公鑰進行解密,然後使用這個指紋演算法計算"Dablelv Inc."證照的指紋,將這個計算的指紋與放在證照中的指紋對比,如果一致,說明"ABC Company"的證照肯定沒有被修改過並且證照是"CA"釋出的,證照中的公鑰肯定是"Dablelv Company"的。對方然後就可以放心的使用這個公鑰和我們"ABC Company"進行通訊了。

4.4數字證照的釋出機構

其實所有的公司都可以釋出證照,我們自己也可以去註冊一家公司來專門給別人釋出證照。但是很明顯,我們自己的專門釋出證照的公司是不會被那些國際上的權威機構認可的,人家怎麼知道你是不是個皮包公司?因此微軟在它的作業系統中,並不會信任我們這個證照釋出機構,當應用程式在檢查證照的合法信的時候,一看證照的釋出機構並不是作業系統所信任的釋出機構,就會丟擲錯誤資訊。也就是說Windows作業系統中不會預先安裝好我們這個證照釋出機構的證照,不信任我們這個釋出機構。

為什麼一個證照釋出機構受不受信任這麼重要?我們舉個例子。假設我們開了一個皮包公司來為別人釋出證照,並且我和微軟有一腿,微軟在他們的作業系統中把我設定為了受信任的證照釋出機構。現在如果有個小公司叫Wicrosoft 花了10塊錢讓我為他們公司申請了一個證照,並且公司慢慢壯大,證照的應用範圍也越來越廣。然後有個奸商公司JS Company想冒充Wicrosoft,於是給了我¥10000,讓我為他們頒佈一個證照,但是證照的名字(Subject)要寫Wicrosoft,假如我為了這¥10000,真的把證照給了他們,那麼他們以後就可以使用這個證照來冒充Wicrosoft了。

如果是一個受信合規的證照釋出機構,比如你要向他申請一個名字叫Wicrosoft的證照,它會讓你提供很多資料證明你確實可以代表Wicrosoft這個公司,也就是說他回去核實你的身份。證照釋出機構是要為他釋出出的證照負法律責任的。

到這裡,你可能會想,那我們自己不就可以釋出證照了嗎,為何還要花錢去申請?我們自己當然也可以成立證照釋出機構,但是需要通過一些安全認證等等,只是有點麻煩。另外,如果數字證照只是要在公司內部使用,公司可以自己給自己生成一個證照,在公司的所有機器上把這個證照設定為作業系統信任的證照釋出機構的證照(這句話仔細看清楚,有點繞口),這樣以後公司釋出的證照在公司內部的所有機器上就可以通過驗證了(在釋出證照時,把這些證照的Issuer(釋出機構)設定為我們自己的證照釋出機構的證照的Subject就可以了)。但是這隻限於內部應用,因為只有我們公司自己的機器上設定了信任我們自己這個所謂的證照釋出機構,而其它機器上並沒有事先信任我們這個證照釋出機構,所以在其它機器上,我們釋出的證照就無法通過安全驗證。

4.5數字證照解決公鑰的受信問題

瞭解了數字證照,我們就可以使用數字證照來保證公鑰是可信的。

還是以A給B傳送郵件為例。
(1)首先A去找證照中心(CA,Certificate Authority)申請數字證照,為公鑰做認證。證照中心用自己的私鑰,對A的數字證照做了數字簽名,生成A的數字證照。

(2)A在郵件正文下方除了數字簽名,另外加上這張數字證照。
在這裡插入圖片描述
(3)B收到Email後,從作業系統中受信任的釋出機構的證照中去找"CA"的數字證照,從"CA"的數字證照中拿到CA的公鑰,用CA的公鑰解密這份數字證照,拿到了受信的A的公鑰,然後驗證數字簽名,後面流程不再贅述,參見小節“3.數字簽名”。

注意:
(1)要是有1萬個人要給B發郵件,難道B要儲存1萬份不同的CA數字證照嗎?
不需要,CA中心給可以給B一份“根證照”,裡面儲存CA公鑰來驗證所有CA分中心頒發的數字證照。CA中心是分叉樹結構,類似於國務院公安部->省公安廳->市級公安局,不管A從哪個CA分支機構申請的證照,B只要預存根證照就可以驗證下級證照可靠性。

(2)如何保證CA的根證照的可靠性?
CA中心是獲得社會絕對認可和有絕對權威的第三方機構,這一點保證了CA根證照的絕對可靠。如果根證照都有問題那麼整個加密體系毫無意義。

5.HTTPS簡介

數字簽名和數字證照可以用於檔案,當然也能用於HTML網頁資料。HTTPS就是數字簽名和數字證照一個具體應用。

5.1HTTPS的由來

超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者擷取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密碼等支付資訊。此外,使用HTTP協議與服務端進行通訊時,也無法得知服務端的身份,以及傳輸資料是否被篡改。總的來說,HTTP的安全缺陷有:
(1)無法驗證服務端的身份;
(2)無法保證資料完整性;
(3)無法保證資料傳輸不被竊聽。

HTTPS的出現是為了解決HTTP協議的上述缺陷。HTTPS使用數字簽名+數字證照可以解決前兩個問題,很多大型網站比如baidu.com都會採用HTTPS協議進行網頁傳輸。
在這裡插入圖片描述
點選可以檢視證照,另外瀏覽器都會內建CA根證照,來對這些網站的伺服器證照進行校驗。

然後,再用SSL(Secure Sockets Layer)協議對傳輸通道加密,保證資料傳輸不被竊聽,解決了第三個問題。

5.2HTTPS通訊過程

HTTPS協議就是HTTP+SSL協議。HTTPS為了兼顧安全與效率,同時使用了對稱加密和非對稱加密。資料是被對稱加密傳輸的,對稱加密過程需要客戶端的一個金鑰,為了確保能把該金鑰安全傳輸到伺服器端,採用非對稱加密對該金鑰進行加密傳輸,總的來說,對資料進行對稱加密,對稱加密所要使用的金鑰通過非對稱加密傳輸。

下圖所示其連線和通訊過程:
在這裡插入圖片描述
HTTPS客戶端向服務端發起請求連線與安全通訊的過程主要有如下幾個步驟:
(1)建立HTTPS請求
客戶端向服務端傳送HTTPS請求。

(2)生成公鑰和私鑰
服務端收到請求之後,生成公鑰和私鑰。公鑰相當於是鎖,私鑰相當於是鑰匙,只有私鑰才能夠開啟公鑰鎖住的內容。

(3)返回公鑰
服務端將公鑰(數字證照)返回給客戶端,數字證照裡面包含有很多資訊,比如證照的頒發機構、過期時間等等。

(4)客戶端驗證數字證照
客戶端收到數字證照之後,首先會驗證其是否有效,如頒發機構或者過期時間等,如果發現有問題就會丟擲異常,提示證照存在問題。
對稱加密、非對稱加密、RSA、訊息摘要、數字簽名、數字證書與HTTPS簡介

如果沒有問題,那麼就生成一個隨機值,作為客戶端的金鑰,然後用服務端的公鑰加密。

(5)傳送客戶端金鑰
客戶端用服務端的公鑰加密金鑰,然後傳送給服務端。

(6)服務端收取金鑰,對稱加密內容
服務端收到經過加密的金鑰,然後用私鑰將其解密,得到客戶端的金鑰,然後服務端把要傳輸的內容和客戶端的金鑰進行對稱加密,這樣除非知道金鑰,否則無法知道傳輸的內容。

(7)加密傳輸
服務端將經過加密的內容傳輸給客戶端。

(8)獲取加密內容,解密
客戶端獲取加密內容後,用之前生成的金鑰對其進行解密,獲取到內容。

以上便是HTTPS完整的通訊過程。

5.3HTTPS的優點

儘管HTTPS並非絕對安全,掌握根證照的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊,但HTTPS仍是現行架構下最安全的解決方案,主要有以下幾個好處:

(1)使用HTTPS協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
(2)HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、篡改,確保資料的安全和完整性。
(3)HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

5.5HTTPS的缺點

雖然說HTTPS有很大的優勢,相對與HTTP而言,還是存在不足之處。
(1)HTTPS協議握手階段比較費時,會使頁面的載入時間延長近50%,增加10%到20%的耗電;
(2)HTTPS連線快取不如HTTP高效,會增加資料開銷和功耗,甚至已有的安全措施也會因此而受到影響;
(3)SSL證照需要錢,功能越強大的證照費用越高,個人網站、小網站沒有必要一般不會用;
(4)SSL證照通常需要繫結IP,不能在同一IP上繫結多個域名,IPv4資源不可能支撐這個消耗;
(5)HTTPS協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、伺服器劫持等方面幾乎起不到什麼作用。最關鍵的,SSL證照的信用鏈體系並不安全,特別是在某些國家可以控制CA根證照的情況下,中間人攻擊一樣可行。


參考文獻

[1]RSA.百度百科
[2]數字簽名原理簡介(附數字證照)
[3]數字簽名.百度百科
[4]數字簽名、數字證照、對稱加密演算法、非對稱加密演算法、單向加密(雜湊演算法)
[5]數字證照原理.部落格園
[6]通俗理解數字簽名,數字證照和https
[7]HTTP與HTTPS的區別
[8]HTTPS連線過程以及中間人攻擊劫持

相關文章