簽名、加密、證書的基本原理和理解


最近開始接觸后端PHP開發,里面涉及到的簽名、加密、證書等概念弄得自己頭暈眼花,最近查看了相關資料,下面把自己的理解寫下來,有不對的地方,還請多指點指點。

數據傳輸安全的要滿足的要求:

  1. 消息的發送方能夠確定消息只有預期的接收方可以解密(不保證第三方無法獲得,但保證第三方無法解密)。
  2. 消息的接收方可以確定消息是由誰發送的(消息的接收方可以確定消息的發送方)。
  3. 消息的接收方可以確定消息在途中沒有被篡改過(必須確認消息的完整性)。

對稱加密

網絡的數據傳輸從發送方發出到接收方接收到,要經過數個節點才能到達目的地,在這個過程中難免會被別有用心的人監聽(現在常用的網絡數據監聽軟件就有charles,具體可以查看相關使用教程,通過這個軟件可以監聽到某個頁面用到了哪些接口,發送以及返回的參數分別是什么)。所以在傳輸敏感數據的過程中,就要對數據進行加密。現行的加密過程中,一般加密算法是公開的,密鑰是自己持有,發送方有密鑰對數據進行加密傳輸,在傳輸的過程中經過加密的數據即使被第三方竊取到也因為沒有密鑰不能解密。而接收方同樣持有密鑰通過算法的逆運算把密文解析出對應的明文來。

過程如下:

上述算法即為對稱加密,特點是加密和解密都是用同一個密鑰。這種算法的前提條件是發送方和接收方用一個密鑰,也就是說在數據傳輸之前,接收方要知道發送方用於發送加密數據所用到的密鑰。但是現實條件是一般不會把密鑰手把手的交給對方,所以下面就要用到非對稱加密算法。

非對稱加密算法

非對稱加密算法中信息的發送方和接收方都分別有兩個密鑰,其中分別為私鑰和公鑰,私鑰為數據的發送方持有,公鑰可以公開。其中涉及到兩種模式,它們分別為加密模式和認證模式。

加密模式:

發送方用公鑰給數據進行加密,然后把加密后的數據發送到接收方,然后接收方用對應的私鑰解密,因為只有接收方的私鑰才能解析數據,所以即使被第三方竊取到數據也沒有關系。這個模式叫做加密模式。在這個過程中如何保證數據的完整性,保證數據是發送方發送的數據,而不是被第三方篡改后的數據。這時就要用到簽名,在發送方加密明文之前,給明文取md5值,得到其信息的摘要(注:不能通過信息摘要反推明文)。然后用公鑰分別給明文和明文的摘要加密發送到數據的接收方,數據的接收方接收到數據之后,用私鑰對密文和摘要進行解密,然后對解密得到的明文取md5摘要,比對解密后的明文摘要和發送過來的摘要是否一致;一致就證明數據是原始的數據沒有遭到篡改。這個加密的過程中保證了數據的安全性(即只有接收方才可以解密)和防篡改性(簽名認證),這就保證了上面說的數據傳輸要求中的第一點和第三點。下面是圖解過程:

但是因為公鑰是公開的,所以在加密模式中我們是不知道到底是誰發送數據給我們的,因此下面就要提到認證模式。

認證模式:

在認證模式中,發送方用私鑰加密數據,給接收方發送數據,接收方用公鑰解密,因為私鑰是唯一的,所以只要數據解析成功就可以知道數據發送方是誰。

這就附和我們在數據的傳輸要求中的第二點了。下面是圖解過程:

結合加密模式和認證模式就可以實現數據傳輸安全的三大要點了。

下面我們來解釋一下這種高級模式,以發送方和接收方兩個部分來解釋:

  1. 將消息進行散列運算,得到消息摘要。
  2. 使用自己的私鑰對消息摘要加密(認證模式:確保了接收方能夠確認自己)。
  3. 使用接收方的公鑰對消息進行加密(加密模式:確保了消息只能由期望的接收方解密)。
  4. 發送消息和消息摘要。

接下來我們看一下接收方所執行的步驟:

  1. 使用發送方的公鑰對消息摘要進行解密(確認了消息是由誰發送的)。
  2. 使用自己的私鑰對消息進行解密(安全地獲得了實際應獲得的信息)。
  3. 將消息進行散列運算,獲得消息摘要。
  4. 將上一步獲得的消息摘要 和 第一步解密的消息摘要進行對比(確認了消息是否被篡改)。

可以看到,通過上面這種方式,使用了接收方、發送方全部的四個密鑰,再配合使用消息摘要,使得前面提出的安全傳遞的所有三個條件全都滿足了。那么是不是這種方法就是最好的呢?不是的,因為我們已經說過了,非對稱加密是一種很耗時的操作,所以這個方案是很低效的。實際上,我們可以通過它來解決對稱加密中的密鑰傳遞問題,如果你已經忘記了可以翻到前面再看一看,也就是說,我們可以使用這里的高級實現方式來進行對稱加密中密鑰的傳遞,對於之后實際的數據傳遞,采用對稱加密方式來完成,因為此時已經是安全的了。

證書機制

與數字簽名相關的一個概念就是證書機制了,證書是用來做什么呢?在上面的各種模式中,我們一直使用了這樣一個假設,就是接收方或者發送方所持有的、對方的公鑰總是正確的(確實是對方公布的)。而實際上除非對方手把手將公鑰交給我們,否則如果不采取措施,雙方在網絡中傳遞公鑰時,一樣有可能被篡改。那么怎樣解決這個問題呢?這時就需要證書機制了:可以引入一個公正的第三方,當某一方想要發布公鑰時,它將自身的身份信息及公鑰提交給這個第三方,第三方對其身份進行證實,如果沒有問題,則將其信息和公鑰打包成為證書(Certificate)。而這個公正的第三方,就是常說的證書頒發機構(Certificate Authority)。當我們需要獲取公鑰時,只需要獲得其證書,然后從中提取出公鑰就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM