1. 程式人生 > >Java安全(加密、摘要、簽名、證書、SSL、HTTPS)

Java安全(加密、摘要、簽名、證書、SSL、HTTPS)

       對於一般的開發人員來說,很少需要對安全領域內的基礎技術進行深入的研究,但是鑑於日常系統開發中遇到的各種安全相關的問題,熟悉和了解這些安全技術的基本原理和使用場景還是非常必要的。本文將對非對稱加密、數字摘要、數字簽名、數字證書、SSL、HTTPS等這些安全領域內的技術進行一番簡要的介紹,解釋他們之間的關係,同時補充一些周邊話題。

安全領域的技術眾多,但是歸根結底,他們都是為了保障如下三個方面:

   1)認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器
   2)加密資料以防止資料中途被竊取
   3)維護資料的完整性,確保資料在傳輸過程中不被改變。 

對稱加密和非對稱金鑰加解密
       對於一份資料,通過一種演算法,基於傳入的金鑰(一串由數字或字元組成的字串,也稱“key”),將明文資料轉換成了不可閱讀的密文,這是眾所周知的“加密”,同樣的,密文到達目的地後,需要再以相應的演算法,配合一個金鑰,將密文再解密成明文,這就是“解密”。如果加密和解密使用的是同一個金鑰,那麼這就是“對稱金鑰加解密”(最常見的對稱加密演算法是DES)。如果加密和解密使用的是兩個不同的金鑰,那麼這就是“非對稱金鑰加解密”(最常用的非對稱加密演算法是RSA)。這兩個不同的金鑰一個叫作公開金鑰(publickey)另一個叫私有金鑰(privatekey),公開金鑰對外公開,任何人均可獲取,而私有金鑰則由自己儲存,其實公鑰和私鑰並沒有什麼不同之處,公鑰之所以成為公鑰是因為它會被公開出來,產生任意份拷貝,供任何人獲取,而只有服務主機持有唯一的一份私鑰,從這種分發模式上看,我們不難看出其中的用意,這種分發模式實際上是Web站點多客戶端(瀏覽器)與單一伺服器的網路拓撲所決定的,多客戶端意味著金鑰能被複制和公開獲取,單一伺服器意味著金鑰被嚴格控制,只能由本伺服器持有,這實際上也是後面要提到的之所以能通過資料證書確定信任主機的重要原因之一。如果我們跳出web站點的拓撲環境,其實就沒有什麼公鑰與私鑰之分了,比如,對於那些使用以金鑰為身份認證的SSH主機,往往是為每一個使用者單獨生成一個私鑰分發給他們自己儲存,SSH主機會儲存一份公鑰,公鑰私鑰各有一份,都不會公開傳播。

簡言之:

對稱加密速度快,但加密和解密的鑰匙必須相同,只有通訊雙方才能知道鑰匙
非對稱加密速度慢,加密和解密的鑰匙不相同,某一個人持有私鑰,任何人都可以知道公鑰

數字摘要--資料完整性的校驗
        這個非常簡單,我們在下載檔案的時候經常會看到有的下載站點也提供下載檔案的“數字摘要“,供下載者驗證下載後的檔案是否完整,或者說是否和伺服器上的檔案”一模一樣“。其實,數字摘要就是採用單項Hash函式將需要加密的明文“摘要”成一串固定長度(128位)的密文,這一串密文又稱為數字指紋,它有固定的長度,而且不同的明文摘要成密文,其結果總是不同的,兒同樣的明文其摘要必定一致。 因此,“數字摘要“叫”數字指紋“可能會更貼切一些。“數字摘要“是https能確保資料完整性和防篡改的根本原因。

數字簽名--水到渠成的技術
        讓我們來看看有了“非對稱金鑰加解密”和“數字摘要“兩項技術之後,我們能做些什麼呢?假如傳送方想把一份報文傳送給接收方,在傳送報文前,傳送方用一個雜湊函式從報文文字中生成報文摘要,然後用自己的私人金鑰對這個摘要進行加密,這個加密後的摘要將作為報文的”簽名“和報文一起傳送給接收方,接收方首先用與傳送方一樣的雜湊函式從接收到的原始報文中計算出報文摘要,接著再用傳送方的公用金鑰來對報文附加的數字簽名進行解密,如果這兩個摘要相同、那麼接收方就能確認報文是從傳送方傳送且沒有被遺漏和修改過!這就是結合“非對稱金鑰加解密”和“數字摘要“技術所能做的事情,這也就是人們所說的“數字簽名”技術。在這個過程中,對傳送資料生成摘要並使用私鑰進行加密地過程就是生成”數字簽名“的過程,經過加密的數字摘要,就是人們所說的”數字簽名“!
       數字簽名技術就是對“非對稱金鑰加解密”和“數字摘要“兩項技術的應用,它將摘要資訊用傳送者的私鑰加密,與原文一起傳送給接收者。接收者只有用傳送者的公鑰才能解密被加密的摘要資訊,然後用HASH函式對收到的原文產生一個摘要資訊,與解密的摘要資訊對比。如果相同,則說明收到的資訊是完整的,在傳輸過程中沒有被修改,否則說明資訊被修改過,因此數字簽名能夠驗證資訊的完整性。(注意,數字簽名只能驗證資料的完整性,資料本身是否加密不屬於數字簽名的控制範圍)
綜上所述,數字簽名有兩種功效:一是能確定訊息確實是由傳送方簽名併發出來的,因為別人假冒不了傳送方的簽名。二是數字簽名能確定訊息的完整性。

數字證書--值得信賴的公鑰
        只從”準確認證傳送方身份“和”確保資料完整性“兩個安全方面來看,數字簽名似乎已經完全做到了,還有漏洞存在的可能麼?有,漏洞不在數字簽名技術本身,而在它所依賴的金鑰,只有金鑰是真實可靠的前提下,使用數字簽名才是安全有效的。考慮這種可能的情況:在上述傳送方向接收方傳送報文的例子中,如果傳送方所持有的公鑰來路有問題或是被替換了,那麼,持有對應私鑰的冒充接受方就有可能接收到傳送方傳送的報文。這裡的問題就是:對於請求方來說,它怎麼能確定它所得到的公鑰一定是從目標主機那裡釋出的,而且沒有被篡改過呢?亦或者請求的目標主機本本身就從事竊取使用者資訊的不正當行為呢?這時候,我們需要有一個權威的值得信賴的第三方機構(一般是由政府稽核並授權的機構)來統一對外發放主機機構的公鑰,只要請求方這種機構獲取公鑰,就避免了上述問題的發生。這種機構被稱為證書權威機構(Certificate Authority, CA),它們所發放的包含主機機構名稱、公鑰在內的檔案就是人們所說的“數字證書”。
        數字證書的頒發過程一般為:使用者首先產生自己的金鑰對,並將公共金鑰及部分個人身份資訊傳送給認證中心。認證中心在核實身份後,將執行一些必要的步驟,以確信請求確實由使用者傳送而來,然後,認證中心將發給使用者一個數字證書,該證書內包含使用者的個人資訊和他的公鑰資訊,同時還附有認證中心的簽名信息。使用者就可以使用自己的數字證書進行相關的各種活動。數字證書由獨立的證書發行機構釋出。數字證書各不相同,每種證書可提供不同級別的可信度。可以從證書發行機構獲得您自己的數字證書。(本段摘自百度百科)

SSL

        SSL(Secure Socket Layer)是netscape公司設計的主要用於web的安全傳輸協議。這種協議在WEB上獲得了廣泛的應用,IETF(www.ietf.org)將SSL作了標準化,即RFC2246,並將其稱為TLS(Transport Layer Security),從技術上講,TLS1.0與SSL3.0的差別非常微小。
基本原理:先非對稱加密傳遞對稱加密所要用的鑰匙,然後雙方用該鑰匙對稱加密和解密往來的資料

要求:伺服器端需安裝數字證書,使用者可能需要確認證書,會話過程中的加密與解密過程由瀏覽器與伺服器自動完成,對使用者完全透明。

SSL握手階段示意圖:

工作過程:

瀏覽器向伺服器發出請求,詢問對方支援的對稱加密演算法和非對稱加密演算法;伺服器迴應自己支援的演算法。
瀏覽器選擇雙方都支援的加密演算法,並請求伺服器出示自己的證書;伺服器迴應自己的證書。
瀏覽器隨機產生一個用於本次會話的對稱加密的鑰匙,並使用伺服器證書中附帶的公鑰對該鑰匙進行加密後傳遞給伺服器;伺服器為本次會話保持該對稱加密的鑰匙。第三方不知道伺服器的私鑰,即使截獲了資料也無法解密。非對稱加密讓任何瀏覽器都可以與伺服器進行加密會話。
瀏覽器使用對稱加密的鑰匙對請求訊息加密後傳送給伺服器,伺服器使用該對稱加密的鑰匙進行解密;伺服器使用對稱加密的鑰匙對響應訊息加密後傳送給瀏覽器,瀏覽器使用該對稱加密的鑰匙進行解密。第三方不知道對稱加密的鑰匙,即使截獲了資料也無法解密。對稱加密提高了加密速度。

HTTPS
如果我們是在一開始來講述HTTPS協議,那將會是一個很大的話題,但是講到這裡的時候,實現上所有關於HTTPS的內容,我們基本上已經講完了,它所有依賴的所有安全技術就是上面我們所提及的,就像大家所知道的那樣,HTTPS是由SSL+HTTP協議構建的可進行加密傳輸、身份認證(確認客戶端連線的目標主機是否是真實正確的主機)的網路協議。https所能實現的安全保證,正是SSL所能解決的安全問題。

HTTPS的劣勢:
https的主要缺點就是效能問題。造成https效能低於http的原因有兩個:
1.對資料進行加解密決定了它比http慢。
2.另外一個重要原因的是https禁用了快取。
相關測試資料表明使用HTTPS協議傳輸資料的工作效率只有使用HTTP協議傳輸的十分之一。因此對於一個網站來說,只有那對那些安全要求極高的的資料才會選擇使用https進行傳輸。


對以上的知識聯通起來做一個集中圖示,相信大家會有更加清晰的理解:

1.鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。

                               

2.鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。                                    

           

3.蘇珊要給鮑勃寫一封保密的信。她寫完後用鮑勃的公鑰加密,就可以達到保密的效果。

                              

4.鮑勃收信後,用私鑰解密,就看到了信件內容。這裡要強調的是,只要鮑勃的私鑰不洩露,這封信就是安全的,即使落在別人手裡,也無法解密。

  

5.鮑勃給蘇珊回信,決定採用"數字簽名"。他寫完後先用Hash函式,生成信件的數字摘要(digest)。

6.然後,鮑勃使用私鑰,對這個數字摘要加密,生成"數字簽名"(signature)。

7.鮑勃將這個簽名,附在信件下面,一起發給蘇珊。

8.蘇珊收信後,取下數字簽名,用鮑勃的公鑰解密,得到信件的摘要。由此證明,這封信確實是鮑勃發出的。

9.蘇珊再對信件本身使用Hash函式,將得到的結果,與上一步得到的摘要進行對比。如果兩者一致,就證明這封信未被修改過。

10.複雜的情況出現了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。此時,蘇珊實際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃,用自己的私鑰做成"數字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進行解密。

11.後來,蘇珊感覺不對勁,發現自己無法確定公鑰是否真的屬於鮑勃。她想到了一個辦法,要求鮑勃去找"證書中心"(certificate authority,簡稱CA),為公鑰做認證。證書中心用自己的私鑰,對鮑勃的公鑰和一些相關資訊一起加密,生成"數字證書"(Digital Certificate)。

12.鮑勃拿到數字證書以後,就可以放心了。以後再給蘇珊寫信,只要在簽名的同時,再附上數字證書就行了。

13.蘇珊收信後,用CA的公鑰解開數字證書,就可以拿到鮑勃真實的公鑰了,然後就能證明"數字簽名"是否真的是鮑勃籤的。

14.我們看一個應用"數字證書"的例項:https協議。這個協議主要用於網頁加密

15.首先,客戶端向伺服器發出加密請求。

16.伺服器用自己的私鑰加密網頁以後,連同本身的數字證書,一起傳送給客戶端。

17.客戶端(瀏覽器)的"證書管理器",有"受信任的根證書頒發機構"列表。客戶端會根據這張列表,檢視解開數字證書的公鑰是否在列表之內。

18.如果數字證書記載的網址,與你正在瀏覽的網址不一致,就說明這張證書可能被冒用,瀏覽器會發出警告。

19.如果這張數字證書不是由受信任的機構頒發的,瀏覽器會發出另一種警告。

20.如果數字證書是可靠的,客戶端就可以使用證書中的伺服器公鑰,對資訊進行加密,然後與伺服器交換加密資訊。