1. 程式人生 > >什麼是數字簽名和證書?

什麼是數字簽名和證書?

什麼是數字簽名和證書?

96 趁風捲 關注

2016.09.18 15:50* 字數 1861 閱讀 10630評論 3喜歡 27

公鑰密碼系統是本文的理解基礎。
本文不對公鑰密碼系統做過多描述。若對公鑰密碼不熟悉,可以參考閱讀維基百科-公開金鑰加密

1.資訊保安三要素

資訊保安中有三個需要解決的問題:

  1. 保密性(Confidentiality):資訊在傳輸時不被洩露
  2. 完整性(Integrity):資訊在傳輸時不被篡改
  3. 有效性(Availability):資訊的使用者是合法的

這三要素統稱為CIA Triad。

公鑰密碼解決保密性問題
數字簽名解決完整性問題和有效性問題

2.數字簽名

現實生活中,簽名有什麼作用?在一封信中,文末的簽名是為了表示這封信是簽名者寫的。計算機中,數字簽名也是相同的含義:證明訊息是某個特定的人,而不是隨隨便便一個人傳送的(有效性);除此之外,數字簽名還能證明訊息沒有被篡改(完整性)。

簡單來說,數字簽名(digital signature)是公鑰密碼的逆應用:用私鑰加密訊息,用公鑰解密訊息。

用私鑰加密的訊息稱為簽名,只有擁有私鑰的使用者可以生成簽名。
用公鑰解密簽名這一步稱為驗證簽名,所有使用者都可以驗證簽名(因為公鑰是公開的)

一旦簽名驗證成功,根據公私鑰數學上的對應關係,就可以知道該訊息是唯一擁有私鑰的使用者傳送的,而不是隨便一個使用者傳送的。

由於私鑰是唯一的,因此數字簽名可以保證傳送者事後不能抵賴對報文的簽名。由此,訊息的接收者可以通過數字簽名,使第三方確信簽名人的身份及發出訊息的事實。當雙方就訊息發出與否及其內容出現爭論時,數字簽名就可成為一個有力的證據。

生成簽名

一般來說,不直接對訊息進行簽名,而是對訊息的雜湊值進行簽名,步驟如下。

  1. 對訊息進行雜湊計算,得到雜湊值
  2. 利用私鑰對雜湊值進行加密,生成簽名
  3. 將簽名附加在訊息後面,一起傳送過去

驗證簽名

  1. 收到訊息後,提取訊息中的簽名
  2. 用公鑰對簽名進行解密,得到雜湊值1。
  3. 對訊息中的正文進行雜湊計算,得到雜湊值2。
  4. 比較雜湊值1和雜湊值2,如果相同,則驗證成功。

3.證書

證書實際上就是對公鑰進行數字簽名,它是對公鑰合法性提供證明的技術。

考慮這樣一種場景:我們對簽名進行驗證時,需要用到公鑰。如果公鑰也是偽造的,那怎麼辦?如果公鑰是假的,驗證數字簽名那就無從談起,根本不可能從數字簽名確定對方的合法性。
這時候證書就派上用場了。

證書一般包含:公鑰(記住證書中是帶有公鑰的),公鑰的數字簽名,公鑰擁有者的資訊
若證書驗證成功,這表示該公鑰是合法,可信的。

接下來又有問題了:驗證證書中的數字簽名需要另一個公鑰,那麼這個公鑰的合法性又該如何保證?該問題可以無限迴圈下去,豈不是到不了頭了?這已經是個社會學問題了。我們為什麼把錢存進銀行?因為我們相信銀行,它是一個可信的機構(雖然也有破產的風險)。跟銀行一樣,我們需要一個可信的機構來頒發證書和提供公鑰,只要是它提供的公鑰,我們就相信是合法的。

這種機構稱為認證機構(Certification Authority, CA)。CA就是能夠認定”公鑰確實屬於此人”,並能生成公鑰的數字簽名的組織或機構。CA有國際性組織和政府設立的組織,也有通過提供認證服務來盈利的組織。

如何生成證書?

  1. 伺服器將公鑰A給CA(公鑰是伺服器的)
  2. CA用自己的私鑰B給公鑰A加密,生成數字簽名A
  3. CA把公鑰A,數字簽名A,附加一些伺服器資訊整合在一起,生成證書,發回給伺服器。

注:私鑰B是用於加密公鑰A的,私鑰B和公鑰A並不是配對的。

如何驗證證書?

  1. 客戶端得到證書
  2. 客戶端得到證書的公鑰B(通過CA或其它途徑)
  3. 客戶端用公鑰B對證書中的數字簽名解密,得到雜湊值
  4. 客戶端對公鑰進行雜湊值計算
  5. 兩個雜湊值對比,如果相同,則證書合法。

注:公鑰B和上述的私鑰B是配對的,分別用於對證書的驗證(解密)和生成(加密)。

證書作廢

當用戶私鑰丟失、被盜時,認證機構需要對證書進行作廢(revoke)。要作廢證書,認證機構需要製作一張證書作廢清單(Certificate Revocation List),簡稱CRL

假設我們有Bob的證書,該證書有合法的認證機構簽名,而且在有效期內,但僅憑這些還不能說明該證書一定有效,還需要查詢認證機構最新的CRL,並確認該證書是否有效

使用場景

下面用兩個使用場景來幫助大家理解證書的作用。

客戶端在傳送或接收訊息之前,要驗證伺服器的合法性(這個伺服器是真實的伺服器,還是偽造者,我們不知道)

場景1

  1. 伺服器生成公鑰和私鑰密碼對
  2. 伺服器把公鑰給CA。CA生成證書,傳送給客戶端
  3. 客戶端驗證證書,取得公鑰:此刻證明公鑰是合法的
  4. 客戶端用公鑰加密訊息,傳送給伺服器
  5. 伺服器用私鑰解密訊息(訊息加密傳送,具有保密性)

場景2

  1. 伺服器生成公鑰和私鑰密碼對
  2. 伺服器生成訊息,用私鑰對訊息進行數字簽名
  3. 伺服器把公鑰給CA。CA生成證書
  4. 伺服器將訊息,數字簽名,證書一起傳送給客戶端
  5. 客戶端驗證證書,取得公鑰:此刻證明公鑰是合法的
  6. 客戶端用公鑰驗證數字簽名,檢查訊息的完整性和伺服器的合法性

4.參考